有很多不同的方式去管理運行在 KVM 管理程序上的虛擬機。例如,virt-manager 就是一個流行的基于圖形界面的前端虛擬機管理工具。然而,如果你想要在沒有圖形窗口的服務器環(huán)境下使用 KVM ,那么基于圖形界面的解決方案顯然是行不通的。事實上,你可以單純使用包裝了 kvm 命令行腳本的命令行來管理 KVM 虛擬機。作為替代方案,你可以使用 virsh 這個容易使用的命令行程序來管理客戶虛擬機。在 virsh 中,它通過和 libvirtd 服務通信來達到控制虛擬機的目的,而 libvirtd 可以控制多個不同的虛擬機管理器,包括 KVM,Xen,QEMU,LXC 和 OpenVZ。
當你想要對虛擬機的前期準備和后期管理實現(xiàn)自動化操作時,像 virsh 這樣的命令行管理工具是非常有用的。同樣,virsh 支持多個管理器也就意味著你可以通過相同的 virsh 接口去管理不同的虛擬機管理器。
在這篇文章中,我會示范怎樣在 ubuntu 和 debian 上通過使用 virsh 命令行去運行 KVM。
第一步:確認你的硬件平臺支持虛擬化
第一步,首先要確認你的 CPU 支持硬件虛擬化擴展(e.g.,Intel VT 或者 AMD-V),這是 KVM 對硬件的要求。下面的命令可以檢查硬件是否支持虛擬化。
$ egrep '(vmx|svm)' --color /proc/cpuinfo
如果在輸出中不包含 vmx 或者 svm 標識,那么就意味著你的 cpu 不支持硬件虛擬化。因此你不能在你的機器上使用 KVM 。確認了 cpu 支持 vmx 或者 svm 之后,接下來開始安裝 KVM。
對于 KVM 來說,它不要求運行在擁有 64 位內(nèi)核系統(tǒng)的主機上,但是通常我們會推薦在 64 位系統(tǒng)的主機上面運行 KVM。
第二步:安裝KVM
使用 apt-get 安裝 KVM 和相關的用戶空間工具。
$ sudo apt-get install qemu-kvm libvirt-bin
安裝期間,libvirtd 用戶組(在 debian 上是 libvirtd-qemu 用戶組)將會被創(chuàng)建,并且你的用戶 id 將會被自動添加到該組中。這樣做的目的是讓你可以以一個普通用戶而不是 root 用戶的身份去管理虛擬機。你可以使用 id 命令來確認這一點,下面將會告訴你怎么去顯示你的組 id:
$ id your-userID>
如果因為某些原因,libvirt(在 debian 中是 libvirt-qemu)沒有在你的組 id 中被找到,你也可以手動將你自己添加到對應的組中,如下所示:
在 ubuntu 上:
$ sudo adduser [youruserID] libvirtd
在 debian 上:
$ sudo adduser [youruserID] libvirt-qemu
按照如下命令重新載入更新后的組成員關系。如果要求輸入密碼,那么輸入你的登陸密碼即可。
$ exec su -l $USER
這時,你應該可以以普通用戶的身份去執(zhí)行 virsh 了。做一個如下所示的測試,這個命令將會以列表的形式列出可用的虛擬機(當前的列表是空的)。如果你沒有遇到權限問題,那意味著到目前為止一切都是正常的。
$ virsh list
Id Name State
第三步:配置橋接網(wǎng)絡
為了使 KVM 虛擬機能夠訪問外部網(wǎng)絡,一種方法是通過在 KVM 宿主機上創(chuàng)建 Linux 橋來實現(xiàn)。創(chuàng)建之后的橋能夠將虛擬機的虛擬網(wǎng)卡和宿主機的物理網(wǎng)卡連接起來,因此,虛擬機能夠發(fā)送和接收由物理網(wǎng)卡傳輸?shù)臄?shù)據(jù)包。這種方式叫做網(wǎng)絡橋接。
下面將告訴你如何創(chuàng)建并且配置網(wǎng)橋,我們創(chuàng)建一個網(wǎng)橋稱它為 br0。
首先,安裝一個必需的包,然后用命令行創(chuàng)建一個網(wǎng)橋。
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
下一步就是配置已經(jīng)創(chuàng)建好的網(wǎng)橋,即修改位于 /etc/network/interfaces 的配置文件。我們需要將該橋接網(wǎng)卡設置成開機啟動。為了修改該配置文件,你需要關閉你的操作系統(tǒng)上的網(wǎng)絡管理器(如果你在使用它的話)。跟隨操作指南的說明去關閉網(wǎng)絡管理器。
關閉網(wǎng)絡管理器之后,接下來就是通過修改配置文件來配置網(wǎng)橋了。
#auto eth0
#iface eth0 inet dhcp
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
在上面的配置中,我假設 eth0 是主要網(wǎng)卡,它也是連接到外網(wǎng)的網(wǎng)卡,同樣,我假設 eth0 將會通過 DHCP 協(xié)議自動獲取 ip 地址。注意,之前在 /etc/network/interfaces 中還沒有對 eth0 進行任何配置。橋接網(wǎng)卡 br0 引用了 eth0 的配置,而 eth0 也會受到 br0 的制約。
重啟網(wǎng)絡服務,并確認網(wǎng)橋已經(jīng)被成功的配置好。如果成功的話,br0 的 ip 地址將會是 eth0 自動分配的 ip 地址,而且 eth0 不會被分配任何 ip 地址。
$ sudo /etc/init.d/networking restart
$ ifconfig
如果因為某些原因,eth0 仍然保留了之前分配給了 br0 的 ip 地址,那么你可能必須手動刪除 eth0 的 ip 地址。
第四步:用命令行創(chuàng)建一個虛擬機
對于虛擬機來說,它的配置信息被存儲在它對應的xml文件中。因此,創(chuàng)建一個虛擬機的第一步就是準備一個與虛擬機對應的 xml 文件。
下面是一個示例 xml 文件,你可以根據(jù)需要手動修改它。
XML/HTML Code復制內(nèi)容到剪貼板
- domain type='kvm'>
- name>alice/name>
- uuid>f5b8c05b-9c7a-3211-49b9-2bd635f7e2aa/uuid>
- memory>1048576/memory>
- currentMemory>1048576/currentMemory>
- vcpu>1/vcpu>
- os>
- type>hvm/type>
- boot dev='cdrom'/>
- /os>
- features>
- acpi/>
- /features>
- clock offset='utc'/>
- on_poweroff>destroy/on_poweroff>
- on_reboot>restart/on_reboot>
- on_crash>destroy/on_crash>
- devices>
- emulator>/usr/bin/kvm/emulator>
- disk type="file" device="disk">
- driver name="qemu" type="raw"/>
- source file="/home/dev/images/alice.img"/>
- target dev="vda" bus="virtio"/>
- address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="0x0"/>
- /disk>
- disk type="file" device="cdrom">
- driver name="qemu" type="raw"/>
- source file="/home/dev/iso/CentOS-6.5-x86_64-minimal.iso"/>
- target dev="hdc" bus="ide"/>
- readonly/>
- address type="drive" controller="0" bus="1" target="0" unit="0"/>
- /disk>
- interface type='bridge'>
- source bridge='br0'/>
- mac address="00:00:A3:B0:56:10"/>
- /interface>
- controller type="ide" index="0">
- address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1"/>
- /controller>
- input type='mouse' bus='ps2'/>
- graphics type='vnc' port='-1' autoport="yes" listen='0.0.0.0'/>
- console type='pty'>
- target port='0'/>
- /console>
- /devices>
- /domain>
上面的主機xml配置文件定義了如下的虛擬機內(nèi)容。
1GB內(nèi)存,一個虛擬cpu和一個硬件驅動
磁盤鏡像:/home/dev/images/alice.img
從 CD-ROM 引導(/home/dev/iso/CentOS-6.5-x86_64-minomal.iso)
網(wǎng)絡:一個橋接到 br0 的虛擬網(wǎng)卡
通過 VNC 遠程訪問
uuid>/uuid> 中的 UUID 字符串可以隨機生成。為了得到一個隨機的 uuid 字符串,你可能需要使用 uuid 命令行工具。
$ sudo apt-get install uuid
$ uuid
生成一個主機 xml 配置文件的方式就是通過一個已經(jīng)存在的虛擬機來導出它的 xml 配置文件。如下所示。
$ virsh dumpxml alice > bob.xml
第五步:使用命令行啟動虛擬機
在啟動虛擬機之前,我們需要創(chuàng)建它的初始磁盤鏡像。為此,你需要使用 qemu-img 命令來生成一個 qemu-kvm 鏡像。下面的命令將會創(chuàng)建 10 GB 大小的空磁盤,并且它是 qcow2 格式的。
$ qemu-img create -f qcow2 /home/dev/images/alice.img 10G
使用 qcow2 格式的磁盤鏡像的好處就是它在創(chuàng)建之初并不會給它分配全部大小磁盤容量(這里是 10 GB),而是隨著虛擬機中文件的增加而逐漸增大。因此,它對空間的使用更加有效。
現(xiàn)在,你可以通過使用之前創(chuàng)建的 xml 配置文件啟動你的虛擬機了。下面的命令將會創(chuàng)建一個虛擬機,然后自動啟動它。
$ virsh create alice.xml
Domain alice created from alice.xml
注意: 如果你對一個已經(jīng)存在的虛擬機執(zhí)行了了上面的命令,那么這個操作將會在沒有任何警告的情況下抹去那個已經(jīng)存在的虛擬機的全部信息。如果你已經(jīng)創(chuàng)建了一個虛擬機,你可能會使用下面的命令來啟動虛擬機。
$ virsh start alice.xml
使用如下命令確認一個新的虛擬機已經(jīng)被創(chuàng)建并成功的被啟動。
$ virsh list
Id Name State
----------------------------------------------------
3 alice running
同樣,使用如下命令確認你的虛擬機的虛擬網(wǎng)卡已經(jīng)被成功的添加到了你先前創(chuàng)建的 br0 網(wǎng)橋中。
$ sudo brctl show
遠程連接虛擬機
為了遠程訪問一個正在運行的虛擬機的控制臺,你可以使用VNC客戶端。
首先,你需要使用如下命令找出用于虛擬機的VNC端口號。
$ sudo netstat -nap | egrep '(kvm|qemu)'
在這個例子中,用于 alice 虛擬機的 VNC 端口號是 5900。 然后啟動一個VNC客戶端,連接到一個端口號為5900的VNC服務器。在我們的例子中,虛擬機支持由CentOS光盤文件啟動。
使用 virsh 管理虛擬機
下面列出了 virsh 命令的常規(guī)用法:
創(chuàng)建客戶機并且啟動虛擬機:
$ virsh create alice.xml
停止虛擬機并且刪除客戶機:
$ virsh destroy alice
關閉虛擬機(不用刪除它):
$ virsh shutdown alice
暫停虛擬機:
$ virsh suspend alice
恢復虛擬機:
$ virsh resume alice
訪問正在運行的虛擬機的控制臺:
$ virsh console alice
設置虛擬機開機啟動:
$ virsh autostart alice
查看虛擬機的詳細信息:
$ virsh dominfo alice
編輯虛擬機的配置文件:
$ virsh edit alice
上面的這個命令將會使用一個默認的編輯器來調(diào)用主機配置文件。該配置文件中的任何改變都將自動被libvirt驗證其正確性。
你也可以在一個virsh會話中管理虛擬機。下面的命令會創(chuàng)建并進入到一個virsh會話中:
$ virsh
在 virsh 提示中,你可以使用任何 virsh 命令。
問題處理
我在創(chuàng)建虛擬機的時候遇到了一個錯誤:
error: internal error: no supported architecture for os type 'hvm'
如果你的硬件不支持虛擬化的話你可能就會遇到這個錯誤。(例如,Intel VT或者AMD-V),這是運行KVM所必需的。如果你遇到了這個錯誤,而你的cpu支持虛擬化,那么這里可以給你一些可用的解決方案:
首先,檢查你的內(nèi)核模塊是否丟失。
$ lsmod | grep kvm
如果內(nèi)核模塊沒有加載,你必須按照如下方式加載它。
$ sudo modprobe kvm_intel (for Intel processor)
$ sudo modprobe kvm_amd (for AMD processor)
第二個解決方案就是添加 --connect qemu:///system 參數(shù)到 virsh 命令中,如下所示。當你正在你的硬件平臺上使用超過一個虛擬機管理器的時候就需要添加這個參數(shù)(例如,VirtualBox,VMware)。
$ virsh --connect qemu:///system create alice.xml
當我試著訪問我的虛擬機的登陸控制臺的時候遇到了錯誤:
$ virsh console alice
error: internal error: cannot find character device null>
這個錯誤發(fā)生的原因是你沒有在你的虛擬機配置文件中定義控制臺設備。在 xml 文件中加上下面的內(nèi)部設備部分即可。
XML/HTML Code復制內(nèi)容到剪貼板
- console type='pty'>
- target port='0'/>
- /console>