Створення образів для завантажувальних змінних носіїв.

Частенько виникає ситуація, коли потрібно створити живу систему, що буде вантажитись з гнучкого диску або іншого змінного носія (USB-flash, CD-ROM, тп.). Якщо зі створенням “живчиків” на основі CD або DVD проблем зазвичай немає — існує достатньо документації та вже готових інструментів для вирішення проблеми, то з надлегкими системами, що мають вантажитись з гнучких дисків виникають проблеми. Отже, саме вирішенням цієї проблеми й займемось.

Одразу попереджаю — не намагайтесь створити дискету, що зможе робити усе. На це просто не вистачить тих 1,44 Мб. Усе нижчевикладене придатне для створення завантажувальних образів для будь-яких носіїв. Для роботи нам знадобляться: носій, що стане домівкою системи, підтримка ядром пристрою-петлі (/dev/loop?), syslinux — завантажувач що буде використовуватись для старту системи зі змінного носія. Бажано — підтримка стиснутої ФС squashfs, інструменти для створення стиснутих образів (squashfs tools).

Крок перший: створюємо основну файлову систему.

Для цього можемо скористатись одними з трьох варіантів:

  1. диск у пам'яті;
  2. файл-образ що монтується через loop;
  3. звичайна тека — тут виникають проблеми з контролем місця.

Але одне зауваження — перші два випадки будуть не дуже зручними для використання з squashfs. Отже скористаємось останнім. Створюємо теку, що стане кореневою для майбутньої системи та розміщуємо у ній системні теки:

  • bin;
  • etc;
  • lib;
  • sbin;
  • usr;
  • var;
  • tmp;
  • mnt;
  • proc;
  • dev.

Створюємо файли пристроїв (/dev). Обов'язково треба створити:

  • console;
  • mem;
  • kmem;
  • null;
  • ram0.

Можемо просто скопіювати їх з поточної системи, виконавши від root звичайну cp з аргументами -dpR. Також треба створити усі неохідні пристрої, головне — не забувати про місце.

Звісно, без цього можна обійтись скориставшись udev або створивши сценарій, який буде викликати mknod при старті системи, але це вже для “гурманів” та не лінивих ;).

Тепер маємо заповнити теку з файлами конфігурації (/etc). Обов'язково потрібні: rc, inittab, fstab (мал. 3). Найпростіший /etc/rc (має бути з правами доступу 755):

#!/bin/sh
/bin/mount -av
/bin/sh

Найпростіший fstab:

/dev/ram0 / ext2 defaults 1 1 
/proc /proc proc defaults 0 0

Найпростіший inittab:

id:3:initdefault
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 /dev/tty1

Найскладніша частина — заповнити /bin. Тут нам на допомогу прийде busybox — він вміщує в собі якщо не усі, то майже усі потрібні інструменти для роботи у консолі. Зазвичай присутній в кожному сучасному дистрі. Додатково можемо запхати у /bin інші потрібні речі. Головне — не забувати про розмір.

Наступний крок — /lib. Перелік обов'язкових бібліотек можемо отримати за допомогою ldd. Ось мій приклад:

ldd /bin/busybox
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x00002abae0008000)
        libm.so.6 => /lib/libm.so.6 (0x00002abae0240000)
        libc.so.6 => /lib/libc.so.6 (0x00002abae04c1000)
        /lib64/ld-linux-x86-64.so.2 (0x00002abadfdea000)

Копіюємо усе згадане до /lib майбутньої системи.

Крок другий: підготовка ядра Linux.

Я не буду детально зупинятись на цьому етапі, бо перезбирання ядра процес доволді тривіальний та дуже добре документований. Єдине що я пораджу — ретельно передивитись конфігурацію ядра та повикидати усе зайве. Якщо у ядра немає підтримки squashfs і ви вирішили скористатись цією стиснутою системою — не забудьте накласти латку. Якщо систему планується запхати на гнучкий диск, то ядро має бути не більше ~700 кб розміру. Менше – краще. Модулі нового ядра складаємо до /lib/modules майбутньої системи. Саме ядро кладемо до теки з syslinux.

Крок третій: створення образу.

Особисто я віддаю перевагу squashfs, як найсучаснішому методу створення стиснутих файлових систем. Отже, коли було зібрано усе що потрібно для майбутньої системи, стискаємо її майбутню кореневу теку:

# mksquashfs <sourcedir> system.sqsh

Створюємо файл конфігурації завантажувача syslinux.cfg:

default update
vga=4
prompt 1
display boot.msg
timeout 100
label update
kernel bzImage
append initrd=system.sqsh ro root=/dev/ram

Після чого можемо створити iso-образ:

mkisofs -o image.iso -b syslinux -c syslinux.cfg -no-emul-boot -boot-load-size 4 -boot-info-table
<sourcedir>

Одразу пояснюю: sourcedir — тека до якої ми склали файли syslinux (може називатись isolinux.bin), syslinux.cfg та system.sqsh.

Готовий образ матиме назву image.iso та придатний для розміщення на носіях. Головне — впевнитись що образ має відповідний розмір. Після цього записуємо його на гнучкий диск стандартною командою dd (від root або того, хто має доступ до пристрою на запис):

dd if=./image.iso of=/dev/fd0

Створення завантажувальних змінних носіїв, інший спосіб.

Для визначеності хай нашим змінним носієм буде /dev/носій (/dev/fd0). Вставляємо в нього дискету/флешку та виконуємо форматування:

mke2fs -m 0 /dev/носій

Монтуємо нашого носія:

mount /dev/носій /mnt/носій

Тепер копіюємо необхідні файли для завантажувальника GRUB:

cp /boot/grub/stage1 /boot/grub/stage2 /boot/grub/menu.lst /mnt/носій

Для завантаження з нього по мережі замість stage2 треба взяти stage2.netboot.

Встановлюємо GRUB

grub --batch <<EOF
install /dev/носій/stage1 /dev/носій /dev/носій/stage2 p /dev/носій/menu.lst
EOF

Копіюємо ядро та решту системи за необхідності, та редагуемо /mnt/носій/menu.lst

Розмонтовуємо нашого носія:

umount /dev/носій

Витягуємо змінний пристрій готовий для завантаження комп'ютера. Звичайно в BIOS потрібно прописати завантаження комп'ютера з нашого носія!