[Sysadmins] altlinux 3.0 live usb-flash

Michael Shigorin mike на osdn.org.ua
Пн Сен 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