Linux live cd - основи
Стандартом для завантажувального CD є El Torito, сенс якого полягає в тому, що BIOS вважає CD-драйв дисководом і шукає на ньому штамп завантаження. Але є альтернатива у вигляді ISOLINUX, дане рішення не використовує емуляції дисковода і дозволяє працювати з усім CD-диском.
процес завантаження
Стандартний процес завантаження Linux виглядає якось так:
- Комп'ютер запускає LILO або подібний завантажувач.
- LILO знає де знаходиться ядро і запускає його.
- Запускається ядро, після проведення стандартних тестів, воно монтує кореневу файлову систему.
- Після цього запускається / sbin / init і операційна система запускається відповідно до / etc / inittab і скриптами rc.d.
Процес завантаження з CD трохи відрізняється. Нам знову потрібен завантажувач, але необов'язково знати, яким пристроєм є наш CD-драйв. Він може бути / dev / hdb. / Dev / hdc або / dev / hdd. Навіть якщо ми скажемо завантажувачу, де знаходиться ядро, нам треба буде вказати ядру де знаходиться коренева файлова система. У пошуку CD-драйву нам допомагає ISOLINUX. але не вирішує проблеми з пошуком кореневої файлової системи. Багато завантажувальні диски використовують так званий initrd (initial ram disk), який є диском в оперативній пам'яті з мінімальною кореневої файлової системою. Ідея полягає в тому, що ядро завантажує мінімальну файлову систему, на якій знаходяться модулі, які дозволяють знайти і довантажити основну кореневу файлову систему. Тепер розглянемо процес завантаження Linux з CD:
створення ядра
Тепер необхідно створити ядро, яке зможе завантажувати initrd файлову систему. Процес складання ядра опіщем пізніше, а поки припустимо, що ви вмієте це робити :) Ядро має бути зібрано з підтримкою initrd і RAM дисків. Будемо використовувати розмір RAM диска за замовчуванням, тобто 4 MB. Також слід підключити підтримку файлових систем ISO9660 і EXT2. Після складання ядра його необхідно налаштувати на використання конкретного кореневого пристрою.
Припустимо, ви тільки що виконали команду make bzImage
rdev / usr / src / linux / arch / i386 / boot / bzImage / dev / ram1
Якщо у вас немає пристрою / dev / ram1. то його слід створити
mknod -m 640 / dev / ram1 b 1 + 1
Створення дерева каталогів
Створимо шаблон для нашого дистрибутива.
Ключові каталоги:- cdimage / - цей каталог буде записуватися на CD.
- initrd / - цей каталог містить файлову систему initrd.
- root / - цей каталог містить робочу файлову систему.
Налаштування initrd
Фаза INITRD має просту мету - отримати робочу файлову систему в / dev / ram1. Є кілька способів зробити це. Перерахуємо їх підряд:
Перелічимо основні етапи виконуються програмою:- Монтування / proc.
- Відкриваємо файл / proc / ide / ide0 / hda / media. якщо там написано "cdrom", то значить ми знайшли наш CD (хм, а якщо у мене в машині кілька CD-драйвів.). В іншому випадку перевіряємо / proc / ide / ide0 / hdb / media. / Proc / ide / ide1 / hdc / media та / proc / ide / ide1 / hdd / media поки не зустрінеться перший CD-драйв (о как!). Тобто, грузиться ми можемо тільки з цих чотирьох IDE CD-драйвів!
- Переходимо в каталог / dev і створюємо символічне посилання cdrom на знайденого пристрою.
- Монтуємо CD-драйв в каталог / cdrom.
- Відкриваємо /cdrom/rootfs.gz і розгортаємо його в / dev / ram1. У rootfs.gz повинна знаходитися EXT2 файлова система розміром в 4 MB.
- Монтуємо / dev / ram1 в / ram.
- Переходимо в каталог / ram / dev і створюємо символічне посилання на пристрій з CD-диском.
- Размонтіруем / ram. / Cdrom і / proc.
Робоча коренева файлова система
З одного файлової системою initrd багато чого не зробиш. Необхідно створити корисну кореневу файлову систему. А так як ми використовуємо RAM диск обсягу 4 MB, він трохи стислий. Чому б не використати RAM диск більшого розміру? Так просто нема чого даремно забивати пам'ять і треба пам'ятати про користувачів комп'ютерів з невеликим об'ємом оперативної пам'яті. Возмем бібліотеки:
ld-2.1.3.so
ld-linux.so.2 -> ld-2.1.3.so
libbz2.so.1.0 -> libbz2.so.1.0.0
libbz2.so.1.0.0
libc-2.1.3.so
libc.so.6 -> libc-2.1.3.so
libcom_err.so.2 -> libcom_err.so.2.0
libcom_err.so.2.0
libdl-2.1.3.so
libdl.so.2 -> libdl-2.1.3.so
libe2p.so.2 -> libe2p.so.2.3
libe2p.so.2.3
libext2fs.so.2 -> libext2fs.so.2.4
libext2fs.so.2.4
libm-2.1.3.so
libm.so.6 -> libm-2.1.3.so
libncurses.so.5 -> libncurses.so.5.0
libncurses.so.5.0
libtermcap.so.2 -> libtermcap.so.2.0.8
libtermcap.so.2.0.8
libuuid.so.1 -> libuuid.so.1.2
libuuid.so.1.2
Не всі з них потрібні для старту операційної системи. У католеге / bin знаходяться необхідні утиліти. Також створено скрипт / sbin / init. У каталозі / etc знаходяться файли inittab і termcap. а також каталог rc.d. в якому знаходиться скрипт rc.S використовуваний для запуску операційної системи. Наведемо ключову частину файлу inittab:
Використання sulogin для консолі призводить до того, що користувач потрапляє в адміністративний режим.
Файл / etc / fstab виглядає наступним чином:
/ Dev / ram1 / ext2 defaults 1 + 1
none / dev / pts devpts gid = 5, mode = 620 0 0
none / proc proc defaults 0 0
Також присутній порожній каталог / initrd. який вказує, що фаза INITRD завершена і робоча коренева файлова система на / dev / ram1 примонтировать, файлова система initrd (що знаходиться на / dev / ram0) видалена з / initrd. Це означає, що ми можемо демонтувати її і звільнити пам'ять використовувану RAM диском.
Подивимося нутрощі скрипта rc.S:
#! / Bin / sh
PATH = / bin; export PATH
echo "System init"
mount -t proc none / proc
mount -o remount, rw /
echo "Find the extras on the CD and mount it"
if [-r / dev / cdrom]; then
mount -t iso9660 / dev / cdrom / cdrom
mount / dev / hda9 / a
fi
cd /
umount / initrd
freeramdisk / dev / ram0
створення CD
Тепер у нас є ядро, структури файлових систем initrd і rootfs. Як же їх записати на CD-диск? Розглянемо найпростішу структуру каталогів на CD-диску:
/rootfs.gz
/ Isolinux /
isolinux.cfg - конфігураційний файл
isolinux.bin - завантажувач
vmlinuz - ядро з підтримкою initrd
initrd.gz - стартова файлова система
Розглянемо файл isolinux.cfg:
label linux
kernel vmlinuz
append initrd = initrd.gz
Дуже схоже на конфігураційний файл LILO. Важливими елементами даного файлу є ім'я ядра і рядок з ім'ям стартовою файлової системи. Те, що файл зі стартовою файлової системою стиснутий не має значення, тому що ядро згодом саме розпакує його.
А що щодо initrd і rootfs. Обидві системи EXT2 розміром в 4 MB є стислими файлами. Нижче наведено скрипт для їх створення:
BASE = / src / iso
SRC = $ BASE / initrd
$ DEST = $ BASE / cdimage / isolinux / initrd
dd if = / dev / zero of = $ DEST bs = 1k count = 4096
/ Sbin / losetup / dev / loop1 $ DEST
mkfs -t ext2 -m 0 / dev / loop1
mount / dev / loop1 / mnt
cd $ SRC
tar cf -. | (Cd / mnt; tar xf -)
umount / mnt
/ Sbin / losetup -d / dev / loop1
gzip -f $ DEST
Для запису болванки слід показане вище дерево каталогів в / src / iso / cdimage зібрати в образ диска:
mkisofs -o /iso.img -b isolinux / isolinux.bin -c isolinux / boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -l \
-R -r / src / iso / cdimage
Файл boot.cat буде створений в результаті виконання цієї команди. Опції -l. -R і -r потрібні для розширення RockRidge (див. CD-Writing HowTo), яке дозволяє використовувати на CD-диску символічні посилання і імена з малими та великими літерами. Отриманий файл слід записати на CD-диск за допомогою cdrecord (залишимо це в якості домашнього завдання :). А просунуті користувачі можуть протести вийшов дистрибутив за допомогою vmWare.
Основа для подальшого удосконалення
Як же додати особливу, необхідну тільки вам, функціональність до даного дистрибутива? Як було згадано вище, каталог / usr є символічною посиланням на на каталог / usr на CD-диску. Використовуйте цю можливість!
Використання FrameBuffer
[*] VGA text console
[*] Video mode selection support
[*] Support for frame buffer devices (EXPERIMENTAL)
[*] VESA VGA graphics console
[*] Advanced low level driver options
<*> 8 bpp packet pixels support
<*> 16 bpp packet pixels support
<*> 24 bpp packet pixels support
<*> 32 bpp packet pixels support
<*> VGA character / attributes support
[*] Select compiled-in fonts
[*] VGA 8x8 font
[*] VGA 8x16 font
Тепер слід вказати правильний графічний режим, який буде використовуватися X-сервером. Для цього небхідно вказати специфічну опцію для ядра. Таким чином, необхідно внести зміни в файл isolinux / isolinux.cfg:
label linux
kernel vmlinux
append initrd = initrd.gz vga = 791
timeout 30
prompt 1
display menu.txt
default 1
label 1
kernel vmlinuz
append initrd = initrd.gz
label 2
kernel vmlinuz
append initrd = initrd.gz vga = 788
label 3
kernel vmlinuz
append initrd = initrd.gz vga = 791
Файл menu.txt містить наступне:
1) Text Mode
2) 800x600 x 16bit colour
3) 1024x768 x 16bit colour
Описано ніби все. Тепер приступаємо до створення власного дистрибутива.