Boot image howto
Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.
Створення образів для завантажувальних змінних носіїв.
Частенько виникає ситуація, коли потрібно створити живу систему, що буде вантажитись з гнучкого диску або іншого змінного носія (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.
- По даній темі може корисним бути і це посилання: Живчики, створені власними руками

