Qemu windows запуск с флешки

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

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

При возне с загрузочными флешками (и прочими 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 (всё место под файл диска распределено заранее).

Системному администратору

Qemu is a generic and open source virtual machine emulator. Qemu Manager is a front-end GUI for this great tool. Qemu Manager is extremely easy to install and use. This is a quick introduction which allows you to test a bootable USB drive without needing to reboot your system and boot from the USB drive each time for real!

Note: RMPrepUSB v2.1.618 and later versions include QEMU – just press the F11 function key to boot from your USB drive in an emulator!

Also, RMPrepUSB v2.1.707 and later versions enables writes to the USB thus giving true emulation which cannot be obtained using QEMU Manager!

I recommend using the QEMU within RMPrepUSB or using Oracle Virtual Box (see Tutorial #4).

Note: – QEMU_x64 does not seem to be able to run Windows 7 64-bit. Older x86 versions complain that it is not a 64-bit CPU, more recent x86_x64 versions progress beyond this but then crash with a 005D or 007F error. Oracle VM Virtual Box does work however and is much faster – see instructions here.

1. First download and install Qemu Manager v7.0 from here. When installing, choose the default answers only.

2. Now prepare your USB drive so it is ready to test and keep it in the computers USB port (do not ‘Eject’ it)

3. Once installed click on the + symbol to create a virtual machine (see screenshots below)

4. Now go to the Drives tab and double-click on the Hard Disk 0 option and set this to the PhysicalDrive number of your USB drive (in my case #1). You can open the Disk Management console to check which drive number your USB drive is.

IMPORTANT NOTE: Qemu sets all drives that point to \\physicaldrive devices (as in this example) to READONLY as Windows locks the volume. Any changes you make to the files on the USB drive itself when running under Qemu, will not actually take affect! If you have bootable DOS files on the USB drive, and it also has batch files or other programs which write to the drive, the writes won’t actually take place when you boot it via Qemu! This means you can only emulate such DOS images when loaded into memory using for instance grub4dos. Linux and XP, etc. payloads will work as they have boot loaders which switch the OS to protected mode and they do not use the emulated BIOS that block DOS/BIOS sector writes.

As physical writes to the USB drive do not work under Qemu (due to Windows locking the device), I would advise you to set the following option in the Advanced section so that writes to the USB drive at least ‘appear’ to work whilst running under Qemu.

Do Not Apply Changes to VM Session = Yes

Any disk/file writes to the USB drive under Qemu will not appear to work unless this option is set. Note that even when this option is set to ‘Yes’, all changes to the USB drive files are still temporary and the drive contents will be reset when you end the Qemu session, so the USB contents will be unchanged. As disk writes do not work unless this option is set, the grub4dos menu savedefault option will not appear to work unless you set this option to ‘Yes’.

NOTE: NEWS! if you use DavidB’s VM_Start.exe utility, you can run QEMU and have USB writes working. Try the latest version of RMPrepUSB v2.1.707 and later!

You can also change the boot order in the Qemu Drives menu if you want to, so that the HDD (your USB drive) boots first.

5. Now click on the run button

to start the session.

6. To use the keyboard and mouse within the virtual environment window, click the mouse cursor inside the Qemu black window – you should now be able to interact with the virtual machine just as if you had booted your USB drive from a real system.

7. When you have finished the emulation session, tap CTRL+ALT keys to release the mouse and keyboard back to your Windows computer and click on the red button to stop the virtual machine.

Qemu is not the fastest emulator, but it is very convenient to test initial booting of USB drives. You can even fully boot to linux or WinPE with it to test that a USB drive is bootable or test your grub4dos menus. It is one of the easiest to use to test bootable USB drives.

There is a LOT more you can do with Qemu including loading PLOP (a read only USB driver) or ISO files. It is also very convenient for taking screenshots of actual boot screens like the ones in these tutorials!

For more info on Qemu Manager read the pdf.

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

#RequireAdmin

Local $hGui, $msg, $BtnOk, $sText
$exe="\qemu-system-x86_64.exe"

$Title="QFB"
$hGui = GUICreate("QFB", 380, 360, @DesktopWidth / 2 - 190, @DesktopHeight / 2 - 80, -1, $WS_EX_ACCEPTFILES)

GUICtrlCreateLabel("Укажите путь до каталога, где находится Qemu:", 10, 10)
$PathQemu = GUICtrlCreateInput('', 10, 35, 360, 25)

$BtnPath = GUICtrlCreateButton("Указать путь", 15, 68, 100, 26)

GUICtrlCreateLabel("Укажите букву, под которой определилась флешка:", 10, 110)
$PathFlash = GUICtrlCreateInput('', 10, 135, 28, 25)

$BtnFlash = GUICtrlCreateButton("Указать флешку", 15, 168, 120, 26)

GUICtrlCreateLabel("Укажите кол-во ОЗУ, отдаваемое qemu:", 10, 210)
$RAM = GUICtrlCreateInput('', 10, 235, 40, 25)
GUICtrlCreateLabel("МБ", 54, 240)
$BtnOk = GUICtrlCreateButton("OK", (380 - 70) / 2, 330, 70, 26)

GUISetState()

While 1
   $msg = GUIGetMsg()
   Switch $msg
	  Case $GUI_EVENT_CLOSE
			ExitLoop
	  Case $BtnOk
		 $InputText=GUICtrlRead($PathQemu)
		 $InputFlash=GUICtrlRead($PathFlash)
		 If $InputText <> "" And $InputFlash <> "" And $RAM <> "" Then
			$1=ChkPath()
			$2=ChkFlash()
			If ($1 or $2)=0 Then
			   RunQemu()
			Else
			   MsgBox(4096,$Title,"Что-то пошло не так")
			   Exit
			EndIf
		 ElseIf $InputText = "" Then
			MsgBox(4096,$Title,"Введите путь до Qemu или укажите с помощью кнопки 'Указать путь'")
		 ElseIf $InputFlash="" Then
			MsgBox(4096,$Title,"Введите букву флешки или укажите ее с помощью кнопки 'Указать флешку'")
		 ElseIf $RAM="" Then
			MsgBox(4096,$Title,"Укажите кол-во выделяемой памяти")
		 EndIf
	  Case $BtnPath
		 SelectPath()
	  Case $BtnFlash
		 SelectFlash()
   EndSwitch
WEnd

Func ChkPath()
$InputText=GUICtrlRead($PathQemu)
If $InputText <> "" Then
   $QemuExe=$InputText & $exe
   if FileExists($QemuExe)=0 Then
	  MsgBox(4096,$Title,"В указанном каталоге: " & $InputText & " не найден исполняемый файл: " & $exe)
	  Return 1
   Else
	  MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
	  Return 0
   EndIf
EndIf
EndFunc

Func SelectPath()
$Path = FileSelectFolder('Укажите каталог, где установлен Qemu', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathQemu,$Path)
#cs
$QemuExe=$Path & $exe
if FileExists($QemuExe)=0 Then
   MsgBox(4096,$Title,"В указанном каталоге не найден исполняемый файл: " & $exe)
ElseIf FileExists($QemuExe) Then
   MsgBox(4096,$Title,"Путь до qemu: " & $QemuExe)
EndIf
#ce
EndFunc

Func ChkFlash()
$InputFlash=GUICtrlRead($PathFlash)
If $InputFlash <> "" Then
   $avArray = DriveGetDrive("REMOVABLE")
   If @error Then Exit
   $InputFlash = StringMid($InputFlash, 1, 1)
   $iIndex = _ArraySearch($avArray, $InputFlash, 0, 0, 0, 1)
   If @error Then
	  MsgBox(4096, $Title, "Съемный диск: " & $InputFlash & " не найден")
	  Return 1
   Else
	  MsgBox(4096, $Title,  "Съемный диск: " & $InputFlash & " найден")
	  GetFlashPartID()
	  Return 0
   EndIf
EndIf
EndFunc

Func SelectFlash()
$Path = FileSelectFolder('Укажите съемное устройство, для загрузки:', '', 3, @DesktopDir, $hGui)
if @error = 1 Then
   Exit
EndIf
GUICtrlSetData($PathFlash,$Path)
EndFunc

Func GetFlashPartID()
$InputFlash=$InputFlash & ":"

Local $objWMI, $objCollection, $objItem, $objWSNet
Local $objLogicalDisks, $objLD, $objPartitions, $objPart
Local $strComputer
Global $strTemp

$ObjWMI = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
$ObjCollection = $ObjWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk where Name = '" & $InputFlash & "'", "WQL", 0x30)
$n = 0
Local $ObjItem, $i = 0
For $ObjItem In $ObjCollection
   $objLogicalDisks = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & $objItem.DeviceID & """} WHERE AssocClass=Win32_LogicalDiskToPartition")
   For $objLD In $objLogicalDisks
	  $objPartitions = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & $objLD.DeviceID & """} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
	  For $objPart In $objPartitions
		 $strTemp = $strTemp & " "& $objPart.Name & ""
	  Next
	  $objPart = Null
	  $objPartitions = Null
   Next
   $objLD = Null
   $objLogicalDisks = Null
Next
$objItem = Null
$objCollection = Null
$objWMI = Null
If $strTemp = "" Then
   $strTemp = "Произошла ошибка!."
EndIf
EndFunc

Func RunQemu()
EnvSet("SDL_VIDEODRIVER", "windib")
EnvSet("SDL_AUDIODRIVER", "dsound")
EnvSet("SET QEMU_AUDIO_DRV", "dsound")
EnvSet("SET QEMU_AUDIO_LOG_TO_MONITOR", "0")

$InputRAM=GUICtrlRead($RAM)

$QemuExe=$InputText & $exe
RunWait($QemuExe & " -L . " & "-m " & $InputRAM & " -boot c " & "-hda " & $strTemp & " -localtime " & "-M pc")
EndFunc

Как в Qemu сделать загрузку с флешки

Что нам понадобится:
1. Сам Qemu. Последние и самые свежие версии можно скачать тут
2. KQemu (аккселератор для Qemu) — желателен но не обязателен. Скачать можно тут
Кратко как им пользоваться: скчать архив. Распаковать. Установить (правой кнопкой на kqemu.inf и выбрать «установить» или запустить inskqemu.exe). Запустить start.cmd (нужно запускать после каждой перезагрузки)

Теперь делаем загрузку с флешки:

1. Определяем какой номер имеет флешка: Заходим в Панель управления, Администрирование, Управление компьютером. Вкладка Управление Дисками.
Находим свою флешку и запоминаем ее номер. (На моем скриншоте диск имеет номер 2) 

2. Далее переходим в папку, где установлен Qemu.
Создает файл usb_boot.cmd (или назоваите его как угодно) — это обычный текстовый файл.
Внутри него пишем

Code

REM Start qemu on windows.
@ECHO OFF

REM SDL_VIDEODRIVER=directx is faster than windib. But keyboard cannot work well.
SET SDL_VIDEODRIVER=windib

REM SDL_AUDIODRIVER=waveout or dsound can be used. Only if QEMU_AUDIO_DRV=sdl.
SET SDL_AUDIODRIVER=dsound

REM QEMU_AUDIO_DRV=dsound or fmod or sdl or none can be used. See qemu -audio-help.
SET QEMU_AUDIO_DRV=dsound

REM QEMU_AUDIO_LOG_TO_MONITOR=1 displays log messages in QEMU monitor.
SET QEMU_AUDIO_LOG_TO_MONITOR=0

REM PCI-based PC(default): -M pc  
REM ISA-based PC : -M isapc
REM -M isapc is added for NE2000 ISA card.

start qemu.exe -L . -m 724 -boot c -hda \\.\PhysicalDrive2 -localtime -M pc

Где параметры:
1. start qemu.exe — запустить Qemu в текущей дирректории
2. -L . — бинарные файлы ноходятся в текущемкаталоге
3. -m выделить программе 724 метра оперативке (980 максимум)
4. -boot c — загрузка с HDD
5. -hda \\.\PhysicalDrive2 — при загрузке выдавать устройство с номером 2 (как узнать номер мы смотрели выше) как hda (как диск C)
6. остальное не важно…

ЗЫ С версией Qemu 0.12.2 работает не совсем корректно — а именно послезагрузки grub4dos — не работает клавиатура. С версией 0.10.2 все работает отлично

ЗЗЫ В принципе можно не мучаться и скачать MobaLiveCD Это упакованный Qemu который делает то же самое что и мы сейчас сделали (запускает kqemu, определяет номер диска флешки и т.д. ), но этот способ имеет минусы:
1. Неизвестно сколько выделяется оперативной памяти
2. Нельзя запустить x86_64 версию
3. Нельзя изменить некоторые настройки (сеть, звук и т.д.)

Boot USB Drive in QEMU under Windows

Posted in on Monday, June 25, 2012 by


Hooray! I did it!
I have managed to boot my bootable usb pendrive (BackTrack 3) under QEMU within Windows XP.

For those of you who want the magic one liner here you are:

qemu.exe -L . -m 512 -std-vga -hda \.PhysicalDrive2 -soundhw all -localtime -M pc -kernel ../../boot/vmlinuz -initrd ../../boot/initrd.gz -append "root=/dev/ram0 rw initrd=../../boot/initrd.gz ramdisk_size=6666 vga=0x317"

* This gives you TextMode with 512 MB Ram and Mouse Support!!
* You will need to change PhysicalDrive2 to what ever drive number your USB key is. (Hint look under the DiskManagment snap-in)
* You require administrative rights also
* My Qemu directory lives under USBDriveLetterBT3QEMU FYI
* QEMU Version Win32 PreCompiled 0.9.1

Hopefully this saves you a few hours

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Windows whistler build 2465
  • Как улучшить шрифт на компьютере windows 10
  • How to install java jdk on windows
  • Установить звуковое устройство для windows 10
  • Как убрать windows search