Boot image howto

Матеріал з docs.linux.org.ua — збірника документації з Unix/Linux українською мовою.

Перейти до: навігація, пошук

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

Частенько виникає ситуація, коли потрібно створити живу систему, що буде вантажитись з гнучкого диску або іншого змінного носія (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 потрібно прописати завантаження комп'ютера з нашого носія!

Особисті інструменти