Bootflash (VirtualBoot)

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Тестирование загрузки флешек в виртуальных машинах

При возне с загрузочными флешками (и прочими USB-дисками) частенько приходится их многократно тестировать. Если под рукой нет второго компьютера, неохота постоянно перезагружать свою рабочую станцию, или просто хочется экзотической конфигурации компьютера, то можно использовать виртуальные машины. Если удастся их загрузить с USB… Попробуем!

QEMU

Достоинства виртуальной машины QEMU:

  • возможность работать как с реальными USB-устройствами, так и с их образами;
  • USB-устройства продолжают оставаться смонтированными в хост-системе.

Недостатки:

  • нет загрузки с USB;
  • медленная работа с USB (эмулируется только UHCI-хост).

Итак, QEMU позволяет нам работать как с готовыми флешками, так и с их образами, что позволяет обойтись от постоянной заливки файлов на флешку, что, теоретически, продлит её жизнь :) Из-за того, что QEMU не поддерживает загрузку с USB-устройств, мы подсовываем ей флешку (имидж) дважды — как загрузочный жесткий диск, и как подключённый к системе USB-диск. Сначала BIOS/загрузчик гостевой системы начинает грузиться с жесткого диска, затем, после того, как модуль usb_storage обнаружит свои устройства, загрузка (stage2) продолжится уже с USB-диска. Загрузочный HDD будет виден в системе как hda, флешка — как sda.

Загрузка QEMU с реальной флешки

Здесь всё просто: $ qemu -hda /dev/sdc -boot c -usb -usbdevice disk:/dev/sdc Где /dev/sdc — устройство с флешкой в хост-системе. Прочие параметры запуска — по вкусу. Если нужно добавить в гостевую систему жёсткий диск, сделайте его имидж (man qemu-img или просто dd if=/dev/zero…), и укажите параметр -hdb mydisk.img.

Загрузка QEMU с образа флешки

Благодаря тому, что параметам -hda и -usbdevice можно подсовывать не только устройства, но и любые файлы, мы можем в нашем тестировании обойтись вовсе без флешки.

Создание образа флешки:
  • Создаём файл-контейнер достаточного размера. Соглашаясь с виртуальной геометрией устройства в 32 сектора на дорожку, по 512 байт каждый, 64 головки мы получаем размер цилиндра равным мегабайту, что очень удобно для рассчетов. Так, для создания контейнера для гигабайтной флешки, мы выполняем:
    $ dd if=/dev/zero of=flash.img bs=$((512*32*64)) count=1K
  • Прописываем в файл контейнера Partition Table:
    $ /sbin/fdisk flash.img
    • назначаем виртуальную геометрию:
You must set cylinders.
You can do this from the extra functions menu.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): x

Expert command (m for help): s
Number of sectors (1-63, default 63): 32
Warning: setting sector offset for DOS compatiblity

Expert command (m for help): h
Number of heads (1-256, default 255): 64

Expert command (m for help): c
Number of cylinders (1-1048576): 1024

Expert command (m for help): r
    • создаём раздел типа FAT32 (C) и делаем его активным:
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1024, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1024, default 1024):
Using default value 1024

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): c
Changed system type of partition 1 to c (W95 FAT32 (LBA))

Command (m for help): a
Partition number (1-4): 1

Command (m for help): p

Disk flash.img: 0 MB, 0 bytes
64 heads, 32 sectors/track, 1024 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

    Device Boot      Start         End      Blocks   Id  System
flash.img1   *           1        1024     1048560    c  W95 FAT32 (LBA)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
  • Записываем загрузчик MBR (если у вас в системе еще не стоит пакета syslinux — поставьте его!):
    $ dd if=/usr/lib/syslinux/mbr.bin of=flash.img conv=notrunc
  • Делаем контейнер для VFAT-раздела:
    • выясняем размер:
      $ echo -e "x\np\n" |/sbin/fdisk flash.img
Disk flash.img: 64 heads, 32 sectors, 0 cylinders

Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 80   1   1    0  63  32 1023         32    2097120 0c
 2 00   0   0    0   0   0    0          0          0 00
 3 00   0   0    0   0   0    0          0          0 00
 4 00   0   0    0   0   0    0          0          0 00

Запоминаем цифры 32 в колонке Start и 2097120 в Size. Это смещение и размер нашего раздела в 512-байтных блоках.

    • Делаем файловую систему (man mkfs.vfat). Здесь мы должны указать размер в 1K-блоках, поэтому
      $ /sbin/mkfs.vfat -v -C flash1.vfat $((2097120/2))
  • Создаём точку монтирования и монтируем туда свежесозданный контейнер раздела:
    $ mkdir mybootflash
    # mount -o loop,fmask=0111,dmask=0000,quiet flash1.vfat mybootflash
  • Копируем всё, что нам надо, в смонтированный образ раздела флешки, не забывая про файлы syslinux’а.
  • Отмонтируем контейнер раздела
  • Записываем загрузчик syslinux:
    $ syslinux flash1.vfat
    Если у нас для хранения всех файлов syslinux’а выделена отдельная директория на флешке, то лучше и файл загрузчика ldlinux.sys прописать туда же, указав параметр -d (например, $ syslinux -d /syslinux flash1.vfat
  • Теперь мы записываем готовый контейнер раздела внутрь контейнера устройства, по ранее запомненному смещению в 32 сектора:
    $ dd if=flash1.vfat of=flash.img bs=512 seek=32 conv=notrunc

Всё, образ флешки готов! В дальнейшем, при изменении содержимого, и без необходимости увеличивать размер устройства, можно повторять операции, начиная с монтирования контейнера раздела, автоматизировав эту операцию по вкусу.

Загрузка с образа флешки

$ qemu -hda flash.img -boot c -usb -usbdevice disk:flash.img Даже немного быстрее получится :)


VMWare

Достоинства виртуальной машины VMWare:

  • высокая скорость работы с USB-устройствами;

Недостатки:

  • нет загрузки с USB;
  • невозможно работать с образом флешки.

С VMWare нам придётся использовать реальное USB-устройство, которое мы будем передавать гостевой системе, при этом из host-системы оно исчезнет. Кроме того, нам придётся делать образ загрузочного мини-диска для обхода невозможности грузиться с USB-устройств. Но высокая скорость работы с флешками перевешивает все эти неудобства. Тестировалась VMWare шестой версии. Итак, предположим, что у нас сконфигурирована виртуальная машина mytestvm, с SCSI-диском(ами), и есть готовая флешка.

Создание загрузочного диска

  • Перейдём в директорию нашей виртуальной машины: $ cd ~/vmware/mytestvm
  • Создадим контейнер устройства с помощью утилиты vmware-vdiskmanager (посмотрите вывод help):-$ vmware-vdiskmanager -c -s 100Mb -a lsilogic -t 2 bootflash.vmdk
    Здесь мы создаём диск минимально возможного размера в 100Мб, тип диска — SCSI с адаптером lsilogic (рекомендуется по умолчанию), тип 2 (всё место под файл диска распределено заранее).