Информационные технологииStfw.Ru 🔍

Создание live USB-Flash (USB-HDD)

flash usb linux boot Можаев Григорий
🕛 20.09.2006, 11:22
целевая система: ALTLinux Compact 3.0 + Sisyphus (20060823)
целевое ядро: 2.6.16-std26-up-alt9

Задача: Получение работающей ОС Linux с внешнего носителя (Flash/HDD)
подключенного к USB-порту.

преимущества изложенного подхода:
1. Возможность использовать на внешнем носителе уже установленную и настроенную систему 2. Использование стандартных ядер (т.е. без самостоятельной пересборки)

Во-первых загрузка с usb-носителя должна поддерживатся биосом Хоста, ресурсами
которого мы и будем пользоваться. Если с этим все в порядке, то можно смело идти дальше.

Определим этапы получения работающей с usb-носителя Linux-системы, это:

1. Установка системы 1.1 Разметка носителя на разделы. 1.2 Форматирование разделов. 1.3 Установка ОС на носитель.
2. Правка загрузочного образа (файл /boot/*.img)
3. Установка загрузчика. (lilo, grub)

Итак рассмотрим детально эти этапы на примере создания live-flash (с
usb-hdd ситуация аналогична):

1. Установка системы

1.1 Разметка носителя на разделы
Для разбиение на партиции можно использовать утилиту cfdisk. Пример разбиения 512 метровой флешки:
Disk /dev/sda: 512 MB, 512753664 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 1793 458992 83 Linux /dev/sda2 1794 1956 41728 82 Linux swap / Solaris


1.2 Форматирование разделов.
Раздел на который будет установлен Linux ( и куда будет монтироваться / ) необходимо форматировать с установкой метки (label), например так:
mkfs.ext3 -L altboot /dev/sda1 mkswap -L altswap /dev/sda2

(подробней см. man tune2fs про метки).

1.3 Установка ОС на носитель
Самый простой способ - скопировать заранее установленную и настроенную ОС Linux (при небольшом размере носителя её можно урезать, убрав лишние пакеты). Пусть в /mnt/hd/ подмонтирован раздел с linux (не равный текущему /), тогда:
mkdir -p /mnt/flash mount /dev/sda1 /mnt/flash cp -far /mnt/hd/* /mnt/flash/


2. Правка загрузочного образа необходима, для того чтобы система могла
обнаружить и подмонтировать наше usb устройство. Итак берем текущий
img, в моем случае это:
/mnt/flash/boot/initrd-2.6.16-std26-up-alt9.img

в некоторых системах это gzip сжатый cpio архив, в ALT Linux это gzip сжатая romfs файловая система. Итак, получим доступ к текущему initrd образу:
mkdir -p /tmp/initrd/init cp /mnt/flash/boot/initrd-2.6.16-std26-up-alt9.img /tmp/initrd/initrd-2.6.16-std26-up-alt9.gz cd /tmp/initrd gzip -d initrd-2.6.16-std26-up-alt9.gz mkdir /mnt/init mount -o loop -t romfs /tmp/initrd/initrd-2.6.16-std26-up-alt9 /mnt/init cp -far /mnt/init/* /tmp/initrd/init/ umount /mnt/init rm -fr /mnt/init

далее необходимо подправить init скрипт linuxrc 1. Включить модули работы с usb и scsi, обратите внимание на порядок включения модулей 2. Добавить программу sleep, для приостанова системы на момент сканирования usb-шины и определения носителя, после загрузки ядра и до монтирования.
до внесения изменений: #!/bin/sh /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/ide-core.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/pci/generic.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/pci/amd74xx.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/ide-generic.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/ide-disk.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/mbcache.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/jbd/jbd.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/ext3/ext3.ko EncodeDev() ...

после внесения изменений:
#!/bin/sh /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/core/usbcore.ko # usb module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/host/ehci-hcd.ko # usb module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/ide/ide-core.ko # нужен для usb-storage /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/libusual.ko # usb module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/scsi_mod.ko # scsi module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sd_mod.ko # scsi module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/libata.ko # scsi module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sata_sil.ko # scsi module # usb-storage должен подгружаться после scsi и usb модулей /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/usb-storage.ko # usb module /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/mbcache.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/jbd/jbd.ko /bin/insmod -f /lib/modules/2.6.16-std26-up-alt9/kernel/fs/ext3/ext3.ko /bin/sleep 10 # задерка для определения носителя (10 секунд достаточно) EncodeDev() ...

далее копируем в наш initrd образ, необходимые модули:
cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/core/usbcore.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/core/usbcore.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/host/ehci-hcd.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/host/ehci-hcd.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/libusual.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/libusual.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/usb-storage.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/usb/storage/usb-storage.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/scsi_mod.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/scsi_mod.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sd_mod.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sd_mod.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/libata.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/libata.ko cp /lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sata_sil.ko \ /tmp/initrd/init/lib/modules/2.6.16-std26-up-alt9/kernel/drivers/scsi/sata_sil.ko

добавляем программу sleep + необходимые для её работы библиотеки:
ldd /bin/sleep linux-gate.so.1 => (0xffffe000) libc.so.6 => /lib/libc.so.6 (0x40019000) /lib/ld-linux.so.2 (0x80000000)
cp -L /lib/ld-linux.so.2 /tmp/initrd/init/lib/ cp -L /lib/libc.so.6 /tmp/initrd/init/lib/

собираем образ в romfs:
cd /tmp/initrd/ genromfs -d ./init -f initrd-2.6.16-std26-up-alt9 gzip -9 ./initrd-2.6.16-std26-up-alt9 mv /tmp/initrd/initrd-2.6.16-std26-up-alt9.gz /mnt/flash/boot/initrd-2.6.16-std26-up-alt9.img


3. Итак initrd образ готов, осталось установить загрузчик(пусть это
будет lilo) и подправить fstab.
Делаем chroot на root системы, стоящей на флешке:
chroot /mnt/flash правим lilo.conf:
boot=/dev/sda lba32 message=/boot/splash/message vga=normal prompt timeout=150 image=/boot/vmlinuz-2.6.16-std26-up-alt9 initrd=/boot/initrd-2.6.16-std26-up-alt9.img label=2616-std26-up-9 root=/dev/sda1 read-only optional

теперь необходимо подправить fstab:
LABEL=altboot / ext3 defaults 1 1 LABEL=altswap swap swap defaults 0 0

и установить загрузчик:
lilo # устанавливаем загрузчик в MBR носителя exit # выходим из chroot окружения umount /mnt/flash rm -fr /tmp/initrd # удаляем временные rm -fr /mnt/flash # файлы и папки


ВСЕ! Теперь вы можете загрузиться с флеш =), естественно выставив в
биосе эту опцию.

Статья не претендует на полноту изложения. Материал сжат, многие
очевидные вещи не обьясняются.

Исправления и дополнения привествуются.

По всем вопросам/замечаниям/пожеланиям пишите на емыл указанный вначале
статьи.

Unix   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉