[Sysadmins] altlinux 3.0 live usb-flash
Michael Shigorin
=?iso-8859-1?q?mike_=CE=C1_osdn=2Eorg=2Eua?=
Пн Сен 18 00:35:45 MSD 2006
http://www.opennet.ru/base/sys/usb_flash_inst.txt.html
---
From: Можаев Григорий <zcrendel / altlinux.ru>
Newsgroups: email
Date: Sun, 17 Sep 2006 17:02:14 +0000 (UTC)
Subject: Создание live USB-Flash (USB-HDD)
дата написания: 2006/09/17
целевая система: 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 # файлы и папки
ВСЕ! Теперь вы можете загрузиться с флеш =), естественно выставив в
биосе эту опцию.
Статья не претендует на полноту изложения. Материал сжат, многие
очевидные вещи не обьясняются.
Исправления и дополнения привествуются.
По всем вопросам/замечаниям/пожеланиям пишите на емыл указанный вначале
статьи.
---
--
---- WBR, Michael Shigorin <mike на altlinux.ru>
------ Linux.Kiev http://www.linux.kiev.ua/
Подробная информация о списке рассылки Sysadmins