Створення образів для завантажувальних змінних носіїв.
Частенько виникає ситуація, коли потрібно створити живу систему, що буде вантажитись з гнучкого диску або іншого змінного носія (USB-flash, CD-ROM, тп.). Якщо зі створенням “живчиків” на основі CD або DVD проблем зазвичай немає — існує достатньо документації та вже готових інструментів для вирішення проблеми, то з надлегкими системами, що мають вантажитись з гнучких дисків виникають проблеми. Отже, саме вирішенням цієї проблеми й займемось.
Одразу попереджаю — не намагайтесь створити дискету, що зможе робити усе. На це просто не вистачить тих 1,44 Мб. Усе нижчевикладене придатне для створення завантажувальних образів для будь-яких носіїв. Для роботи нам знадобляться: носій, що стане домівкою системи, підтримка ядром пристрою-петлі (/dev/loop?), syslinux — завантажувач що буде використовуватись для старту системи зі змінного носія. Бажано — підтримка стиснутої ФС squashfs, інструменти для створення стиснутих образів (squashfs tools).
Крок перший: створюємо основну файлову систему.
Для цього можемо скористатись одними з трьох варіантів:
- диск у пам'яті;
- файл-образ що монтується через loop;
- звичайна тека — тут виникають проблеми з контролем місця.
Але одне зауваження — перші два випадки будуть не дуже зручними для використання з 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 потрібно прописати завантаження комп'ютера з нашого носія!
- Скрипт автоматизації створення дискети для завантаження по мережі можна знайти тут: DYSTRYK/bin/mknetbootfloppy.sh.
- По даній темі може корисним бути і це посилання: Живчики, створені власними руками