1. 程式人生 > >libvirt的virsh命令和qemu引數轉換

libvirt的virsh命令和qemu引數轉換

執行虛擬機器有多種方式,其中可以使用qemu-system-x86或者qemu-kvm來執行虛擬。另外還可以使用libvirt的virsh命令從xml檔案定義來執行虛擬機器。而網上許多的教程或者示例使用qemu命令引數來執行的,如果使用libvirt來執行可能會無從下手,不知道對應的引數。

libvirt從Domain的配置檔案啟動虛擬機器

虛擬機器(有時Domain,guest都表示虛擬機器的含義。)可以通過Domain xml檔案來進行配置虛擬機器。以下是一個demo的配置檔案。

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <domain type='qemu'> <name>QEmu-fedora-i686</name> <uuid>c7a5fdbd-cdaf-9455-926a-d65c16db1809</uuid> <memory>219200</memory> <currentMemory>219200</currentMemory> <vcpu>2</vcpu> <os> <type arch='i686' machine='pc'>hvm</type>
<boot dev='cdrom'/> </os> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='cdrom'> <source file='/home/user/boot.iso'/> <target dev='hdc'/> <readonly/> </disk> <disk type='file' device='disk'> <source file='/home/user/fedora.img'
/> <target dev='hda'/> </disk> <interface type='network'> <source network='default'/> </interface> <graphics type='vnc' port='-1'/> </devices> </domain>

然後使用以下命令從xml檔案匯入到libvirt虛擬機器管理軟體中。

1 virsh define demo.xml

啟動虛擬機器。其中QEmu-fedora-i686為xml定義的虛擬機器別名。

1 virsh start QEmu-fedora-i686

使用qemu命令列啟動虛擬機器

也可以使用qemu命令列啟動虛擬機器,但是每次都要輸入那麼長的引數會忘記,所以也可以寫個shell指令碼來儲存引數。類似的,qemu啟動虛擬機器使用如下命令:

1 2 3 4 5 6 7 8 9 /usr/bin/qemu-system-x86_64 --enable-kvm \ -m 1024 \ -smp 1 \ -name QEMUGuest1 \ -nographic \ -monitor pty -no-acpi -boot c \ -drive  file=/dev/HostVG/QEMUGuest1,if=ide,index=0 \ -net none \ -serial none -parallel none -usb

看到這樣長的引數,輸入起來當然麻煩了。而且這樣執行虛擬機器libvirt還沒辦法直接查詢虛擬機器的狀態。

在xml檔案裡使用任意qemu命令列引數

有些命令列的引數可以使用xml直接定義出來,但是有些並不能找到對應的xml的標籤。但是libvrit為我們提供了一個qemu:commandline來配置xml檔案。

例如:

01 02 03 04 05 06 07 08 09 10 11 12 13 14 <domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name>QEmu-fedora-i686</name> <memory>219200</memory> <os> <type arch='i686' machine='pc'>hvm</type> </os> <devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> </devices> <qemu:commandline> <qemu:arg value='-newarg'/> <qemu:env name='QEMU_ENV' value='VAL'/> </qemu:commandline> </domain>

Libvirt提供一個XML名稱空間和可選類庫libvirt-qemu.so來解決qemu的一些特殊情況。當被正確使用時,這些擴充套件允許測試還沒被libvirt的XML和API介面支援qemu的特性。然而,他們是不被支援的,因為該類庫不能保證有一個穩定的API介面,濫用這些類庫或者xml檔案會導致不一致的狀態使libvirtd奔潰,升級qemu-kvmlibvirtd會對那麼依賴使用qemu特性的虛擬機器有破壞性行為。如果你確信需要獲得的qemu的特性,請傳送RFE給libvirt的mailing list以得到納入該功能的穩定的libvirt XML和API介面。

這些類庫提供兩個API:virDomainQemuMonitorCommand,用來發送任意監控命令(monitor command, 包括HMP和QMP格式)給qemu虛擬機器 (Since 0.8.3);virDomainQemuAttach用來註冊一個人工啟動的qemu虛擬機器,這樣可以使用libvirtd來管理(Since 0.9.4)。

當啟動虛擬機器的時候,以下的XML擴充套件允許給qemu命令列引數。為了使用XML擴充套件,需要增加一個XML namespacehttp://libvirt.org/schemas/domain/qemu/1.0。一般給這namespace取名為qemu,需要增加一個元素<qemu:commandline>,還有兩個子元素:

qemu:arg 當啟動虛擬機器的時候,向qemu進行提供一個命令列引數,將引數放在XML的value屬性裡。

qemu:env當啟動虛擬機器的時候,向qemu進行提供一個環境變數, 將 name-value對 放在name屬性和可選的vlaue屬性裡。

將QEMU引數轉domain XML配置

命令virsh domxml-from-native提供一個方法將已存在的一組QEMU引數轉成可以被libvirt使用Domain XML檔案。這個命令的目的用於將先前已經能夠從命令列執行的虛擬機器轉化為用libvirt去管理的XML配置檔案。請不要用它來建立一個新虛擬機器。新的虛擬機器應該由呼叫libvirt API的程式去建立,或者手工編寫XML檔案讓virsh執行。

需要特別注意的是,在demo.args檔案中,不能有換行出現,整個命令要在同一行裡。

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $ cat > demo.args <<EOF LC_ALL=C PATH=/bin HOME=/home/test USER=test \ LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 \ -nographic -monitor pty -no-acpi -boot c -hda \ /dev/HostVG/QEMUGuest1 -net none -serial none \ -parallel none -usb EOF $ virsh domxml-from-native qemu-argv demo.args <domain type='qemu'> <uuid>00000000-0000-0000-0000-000000000000</uuid> <memory>219136</memory> <currentMemory>219136</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686' machine='pc'>hvm</type> <boot dev='hd'/> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> </disk> </devices> </domain>

轉化domain XML為QEMU引數

命令virsh domain-to-natice可以將libvirt的Domian XML檔案轉化成一組QEMU引數。

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 $ cat > demo.xml <<EOF <domain type='qemu'> <name>QEMUGuest1</name> <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> <memory>219200</memory> <currentMemory>219200</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686' machine='pc'>hvm</type> <boot dev='hd'/> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> </disk> </devices> </domain> EOF $ virsh domxml-to-native qemu-argv demo.xml LC_ALL=C PATH=/usr/bin:/bin HOME=/home/test \ USER=test LOGNAME=test /usr/bin/qemu -S -M pc \ -no-kqemu -m 214 -smp 1 -name QEMUGuest1 -nographic \ -monitor pty -no-acpi -boot c -drive \ file=/dev/HostVG/QEMUGuest1,if=ide,index=0 -net none \ -serial none -parallel none -usb 轉載地址:https://www.chenyudong.com/archives/qemu-kvm-command-arguments-switch-to-libvirt-xml.html