Bootflash (VirtualBoot)
Тестирование загрузки флешек в виртуальных машинах
При возне с загрузочными флешками (и прочими 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))
- Делаем файловую систему (man mkfs.vfat). Здесь мы должны указать размер в 1K-блоках, поэтому
- Создаём точку монтирования и монтируем туда свежесозданный контейнер раздела:
$ 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 (всё место под файл диска распределено заранее).