Збираємо власну ос на базі linux
Створюємо власну ОС на базі Linux
За довгі роки роботи з Linux мною було використано величезну кількість різних дистрибутивів: Mandriva, Fedora, SlackWare, Debian, Ubuntu і багато інших. Якийсь проект подобався більше, якийсь - менше. Але у всіх дистрибутивах неминуче доводилося стикатися з серйозними недоліками, які сильно утруднювали роботу. Один дуже вимогливий до ресурсів, в іншому немає підтримки всього потрібного обладнання, в третьому не вистачає різного ПО. Ось тоді я згадав відому східну мудрість: якщо потрібно щось зробити добре, зроби це сам.
Linux from Scratch
Я не єдиний, хто вирішив зайнятися побудовою власної версії Linux - ОС, в якій за основу буде взята базова частина системи і ядро, але де не буде жодного зайвого кілобайт від розробника, тобто від вас. Велика кількість Linux-дистрибутивів, які не відповідають вимогам користувачів, підштовхнуло Герарда Бікменса (Gerard Beekmans) до створення дистрибутива, який дасть можливість кожному зібрати систему, де будуть тільки необхідні йому компоненти і функції.
Прагнення талановитого програміста вилилося в проект Linux from Scratch (www.linuxfromscratch.org), скорочено - LFS. Цей проект, дозволяє сконструювати «з нуля», з вихідних кодів, свою операційну систему на базі Linux. Компіляція LFS проходить на комп'ютері з уже встановленою Linux-системою, втім, підійде і «просунутий» Live-CD, наприклад, Knoppix [6].
При цьому Linux-система, яка використовується для складання, може бути будь-який - обов'язково лише наявність компілятора і системних бібліотек. Linux From Scratch важко назвати дистрибутивом в звичному сенсі цього слова - це щось на зразок допоміжного ПЗ, яке вкупі з базовою частиною операційної системи дозволить вам створити свою, унікальну версію ОС.
Як відомо, Лінус Торвальдс розробляв свою операційну систему під девізом «Just for fun!» - тобто тільки заради задоволення. Потрібно визнати, що LFS дійсно не часто можна зустріти на серверах, використовують цю систему, як правило, комп'ютерні ентузіасти. Установка і робота з Linux from Scratch допоможе вам розібратися у взаємозв'язку компонентів ОС, що стане в нагоді при власних розробках Linux-дистрибутива, причому не тільки на базі LFS. Тому LFS багато в чому розрахований на тих людей, для яких процес складання власного дистрибутива цікавий і цікавий - а таких людей, повірте, чимало.
Розбиття диска і створення дерева каталогів
Для кращого розуміння матеріалу опишемо весь хід процесу в загальних рисах (див. Рис. 1).
Малюнок 1. Схема збірки LFS
На першому етапі, за допомогою вже інстальованого дистрибутива або LiveCD, розбивається диск. На жорсткому диску виділяється розділ для нової системи. Після чого на цьому розділі потрібно буде статично скомпілювати всі необхідні програми і ядро системи. Далі відбувається зміна кореневого каталогу на розділ жорсткого диска, відведений під нашу новою ОС. Буде потрібно повторити компіляцію, але на цей раз ПО повинно бути зібрано динамічно (відміну динамічної компіляції від статичної буде описано нижче). Останній етап включає в себе збірку найважливішою бібліотеки glibc і конфігурацію встановленої ОС. Як бачите, нічого особливо складного робити не доведеться.
Файлову систему вибирайте на ваш розсуд: і з Ext3, і з ReiserFS ніяких проблем під LFS не було. А ось шанувальників XFS доведеться засмутити - спроби змусити Linux From Scratch працювати з цією ФС не увінчалися успіхом.
Тепер монтуємо розділ, відведений під нову ОС.
$ Mount / dev / hda5 / mnt / mylin
Для зручності визначимо змінну MYLIN:
Відмінно, для подальшої роботи краще створити окремого користувача mylin, якого і призначимо власником змонтованого розділу.
$ Chown -R mylin $ MYLIN
Потрібно створити дерево каталогів в корені нового розділу:
$ Mkdir -p bin boot dev etc home lib mnt opt root sbin usr / var
У каталогах usr, usr / X11R6, usr / local створюємо необхідну структуру. підкаталоги bin, etc, include, lib, sbin, share, src.
Потім те ж саме проробимо для каталогів / var та / opt майбутньої системи:
Навіщо ми використовуємо статичну збірку? При статичної компіляції вихідний код бібліотеки приєднується до коду додатка, що тягне за собою збільшення його розміру, але при цьому зберігається цілісність. При динамічної ж компіляції бібліотека знаходиться в окремому файлі, до якого в міру необхідності звертаються додатки. У підсумку всі програми працюють з однією версією бібліотеки
Але коли ми за допомогою команди chroot встановимо кореневої каталог для знову збирається системи, бібліотеки «батьківської», встановленої системи, що знаходяться в / lib, / usr / lib, і інших, стануть вже недоступні, тому динамічно скомпільовані програми працювати відмовляться, до того ж сумісність версій ніким не гарантована.
Щоб не сплутати пізніше статично скомпільовані програми з «динамічними», створимо для них спеціальний каталог:
При збірці і установці пакетів не забуваємо додавати параметр «--prefix = $ MYLIN / stat» для переміщення файлів саме в цей каталог. І наостанок. ставимо bash:
$ ./configure --enable-static-link --prefix = $ MYLIN / stat
За такою ж схемою збираємо інші необхідні пакети. binutils, bzip2, textutils, texinfo, tar, sh-utils, gcc, grep, gzip, gawk, diffutils, fileutils, make, patch, sed, і. власне. linux-kernel.
Так, при компіляції ядра не забуваємо, що для старих версій ядер (2.2.x-2.4.x) потрібно використовувати gcc 2.95, а для поточної версії 2.6.x рекомендується застосувати gcc 3.x, щоб не виникло проблем.
Не забуваємо заглядати до відповідних розділів LFS-book, там сказано про це і багато інших нюансів. В цілому ж компіляція ядра в LFS не відрізняється від подібної процедури, що проводиться при використанні встановленого на HDD дистрибутива. Разархівіруем вихідні ядра в $ MYLIN / usr / src / linux-2.6.xx, після чого конфігуруємо, запускаючи:
Процес настройки параметрів ядра багаторазово описаний в Інтернеті (6), навряд чи є необхідність зупинятися на цьому докладніше. Далі подаємо наступні команди в папці з вихідними текстами Linux-kernel:
Далі створюємо файли $ MYLIN / etc / passwd і $ MYLIN / etc / group. У першому прописуємо поки єдиного користувача - root з будь-яким паролем, а в другому групи користувачів (для початку однієї групи root теж буде досить).
На цьому наші приготування до наступного кроку закінчилися, і ми переходимо вже до більш тонкої динамічної збірці.
Тепер нам потрібно змінити кореневий каталог на / mnt / mylin, де ми будемо користуватися тільки статично зібраними утилітами - до допомоги інструментів з «батьківської» ОС ми вже вдаватися не зможемо. Даємо команду в консолі:
$ Chroot $ MYLIN / usr / bin / env -i
> HOME = / root TERM = $ TERM PS1 = 'u: w $'
> PATH = / bin: / usr / bin: / sbin: / usr / sbin: / stat / sbin
Цією командою ми вказали шляхи до виконуваних файлів, тип терміналу, інтерпретатор і вид запрошення командного рядка.
Для забезпечення роботи деяких програм, треба встановити файлову систему proc в новій системі.
$ Mount proc / proc -t proc
Настав найвідповідальніший момент. Збірка бібліотеки glibc. Найвідповідальніший він тому, що працювати без неї більшість необхідних програм не буде, а в використанні Linux без основної бібліотеки сенсу немає. Збірка glibc ж найчастіше доставляє масу проблем.
При складанні ми вказували параметр «--prefix = $ MYLIN / stat», тому при зміні кореня все статично зібрані пакети виявляться в каталозі / stat розділу нової ОС.
Отже, розпаковуємо архів glibc-2.x.x.tar.gz (наприклад, в директорію / usr / src /) і переходимо в каталог glibclinuxthreads. Доведеться трохи попрацювати над виправленням початкових код з огляду на те, що на даному етапі в системі неможлива ідентифікація користувача по імені (як раз через відсутність glibc і інших бібліотек), і того, що для установки glibc потрібен інтерпретатор Perl, якого у нас немає.
Замінюємо ім'я користувача root у файлі login / Makefile на його uid, тобто 0, а змінну $ PERL в файлі malloc / Makefile слід замінити на шлях до інтерпретатора - / usr / bin / perl - і при конфігуруванні він просто буде проігнорований.
$ /usr/src/glibc-2.x.x/configure --prefix = / usr --enable-add-ons --libexecdir = / usr / bin
make install
Якщо ви все зробили правильно, glibc скомпілюється, в рядку запрошення нарешті з'явиться «root», і можна буде динамічно переконфігурувати всі програми.
Завершимо установку ядра.
Щоб перемістити нове ядро в каталог / boot, виконуємо ще одну команду:
Збираємо всі встановлені і деякі нові програми, тепер уже без прапорів статичної компіляції. Нам будуть потрібні (на даному етапі дуже важливо не забути скомпілювати усі наведені нижче) (див. Таблицю 1).
Таблиця 1. Необхідний набір пакетів для збирання
Після виконання динамічної перекомпіляції можна видалити каталог з статично зібраними пакетами:
Можна полегшено зітхнути і випити кави - найскладніше, рутинне залишилося позаду. Переходимо до наступного етапу - початкового конфігурації нашої системи.
Початкове конфігурування системи
Перед тим як приступити до налаштування, зауважу, що всі зміни потрібно робити в файлах каталогу нової ОС, а не батьківської системи.
Для установки системного часу створимо файл / etc / sysconfig / clock, що містить всього один рядок:
Тепер годинник комп'ютера будуть відображати час вашого часового поясу - за умови, що значення часу в BIOS встановлено вірно.
Дамо комп'ютера ім'я:
echo "HOSTNAME = my_linux"> / etc / sysconfig / network
Тепер розділи, які система повинна монтувати при завантаженні, вкажемо в / etc / fstab:
# Filesystem mount-point fs-type options dump fsck-order
/ Dev / hda5 / ext3 defaults 1 + 1
/ Dev / hda3 swap swap pri = 1 0 0
proc / proc proc defaults 0 0
Замість / dev / hda3 і / dev / hda5 напишіть ваші розділи (кореневої і swap), доповніть файл при необхідності точками монтування інших розділів жорсткого диска і CD-ROM.
Тепер зробимо нашу систему завантажується.
Якщо крім lFS ви користуєтеся іншими збірками Linux, то зараз потрібно увійти в стару систему - для цього виконуємо команду:
Уже в батьківської ОС в файл /etc/lilo.conf додаємо наступне:
Зрозуміло, що «/ boot / bzImage» - це шлях до скомпілювати вами ядру системи, а «partition» - розділ диска, де знаходиться кореневої каталог.
Якщо ж ви не плануєте користуватися іншими операційними системами і збірками Linux, то відразу переходите до налаштування LILO в LFS.
В цьому випадку lilo.conf буде виглядати приблизно так:
Зробіть необхідні зміни в залежності від вашої конфігурації. Оновлюємо завантажувач командою:
І, якщо всі попередні етапи були виконані правильно, ми опинимося в новій системі. Однак довгий етап «тонкої» настройки (окрему увагу варто приділити безпеки нової системи, бо LFS за замовчуванням виглядає досить-таки незахищеним, як і будь-яка знову встановлена ОС) ще попереду. Зате власноруч зібрана версія Linux у вас вже є.
Герард Бікменс - не єдиний, кому спало на думку створити власний Linux. Інший проект - BYOLinux, керівником якого був Джонатан Торп (Jonatan Thorpe), на сьогоднішній день свій розвиток припинив, хоча написана імдокументація зберігає актуальність і зараз, але вона не так детальна, як LFS-book і не перекладена українською. Головна відмінність методу Джона в тому, що бібліотека glibc переноситься з батьківської системи в дочірню без перекомпіляції, це не настільки ефективно, але дозволяє уникнути багатьох проблем при складанні. Бажання відчути себе конструктором ОС відчувають і деякі користувачі FreeBSD.
Література і посилання
Посилання на всі зазначені в статті програми наведені в LFS-book (Частина 3. Додатки).