在流行的虛擬架構體系中,最重要的技術當然要數libvirt和QEMU了。包括linux虛擬化技術中KVM和xen都使用了QEMU。關于Xen和KVM進行虛擬化,以及在Window下使用Vmware,VirtualBox和hyper-v構建虛擬機,可能大家都有過很多的嘗試。今天我們來探索一下在macOS的用libvirt和QEMU構建虛擬機的方法。
概述
首先我們概要介紹一下QEMU和libvirt。
QEMU
QEMU由Fabrice Bellard開發的的CPU開源模擬器,QEMU支持高性能擴平臺,可以虛擬出不同架構的虛擬機,如在x86平臺上可以虛擬出Solaris來。
libvirt
libvirt是當最常用的KVM虛擬機管理的開源工具和API。以Libvirtd為守護進程,可以被本地或者遠程調用,Libvirtd通過調用qemu-kvm操作虛擬機。libvirt由紅帽公司開發并用于KVM管理,也支持Xen等虛擬架構下的管理。libvirt旨在為各種虛擬機架構提供一套通用的編程接口,而且支持與JAVA,Python多種語言的綁定,所以涌現了一批基于基libvirt的虛擬機管理工具,比如virt-manager(GUI工具),virsh(命令行工具)。其架構示意圖如下:
MacOS下的虛擬方案
在MacOS支持收費的虛擬機方案,比如Parallels Desktop和VMWare Fusion,也有一個開源的VirtualBox。但是,VirtualBox不支持macOS的Hypervisor.Framework。
安裝libvirt和QEMU
首先,確保macOS安裝了,軟件包管理器homebrew。此后其他包都用它來安裝。
運行一下命令安裝qemu和libvirt:
brew install qemu gcc libvirt
如果安裝了libvirt6.6.0版本會導致安裝失敗,這時候請在Terminal中運行以下命令:
for f in /usr/local/Cellar/libvirt/6.6.0/lib/libvirt/*/*.bundle; do
ln -s $f ${f%.bundle}.so;
done
由于macOS不支持QEMU安全功能,因此禁用:
echo 'security_driver = "none"' >> /usr/local/etc/libvirt/qemu.conf
echo "dynamic_ownership = 0" >> /usr/local/etc/libvirt/qemu.conf
echo "remember_owner = 0" >> /usr/local/etc/libvirt/qemu.conf
最后啟動libvirt服務:
brew services start libvirt
Ubuntu Server 20.04鏡像準備和安裝
有兩種方法可以使用VNC客戶端或virt-viewer來,查看虛擬機界面。推薦RealVNC Viewer。VNC客戶端響應迅速且安裝迅速,但是如果有多個VM,則需要手動管理不同的端口。使用virt-viewer,會彈出一個彈出窗口,其中包含當前正在運行的所有VM,但是它很耗時,并且安裝需要很長時間。
在主目錄中創建一個文件夾vms,并生成一個磁盤映像。更改50g為首選磁盤的大小:
mkdir ~/vms && cd ~/vms
qemu-img create -f qcow2 ubuntu.qcow2 50g
下載Ubuntu Server 20.04安裝包和和libvirt XML配置模板,然后將.iso和.xml文件放在同一文件夾中。
修改ubuntu.xml文件中的以下元素,以匹配VM首選項和對應文件路徑。
<domain type='qemu' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<name>ubuntu</name>
<memory unit='GB'>50</memory>
<vcpu>2</vcpu>
...
<disk type='file' device='disk'>
<source file='qcow2文件絕對路徑'/>
...
<disk type='file' device='cdrom'>
<source file='安裝ISO截止絕對路徑'/>
保存,然后運行virsh define ubuntu.xml之后virsh start ubuntu。
啟動RealVNC Viewer并連接到localhost。單擊Ctrl+Alt+Del按鈕重新啟動計算機,然后快速按Esc進入啟動菜單。按與Ubuntu Server映像匹配的數字。
正常安裝Ubuntu Server,確保啟用SSH服務器。重新啟動后,可以通過運行從終端連接到VM ssh -p 2222 user@localhost。
要將關閉VM,請運行virsh shutdown ubuntu。
要強制關閉,請運行virsh destroy ubuntu。
要將端口(例如,端口443)從VM轉發到本地的端口8443,請運行以下命令:
ssh -p 2222 -L8443:localhost:443 user@localhost
多個虛擬機支持
如果要創建多個VM,請為每臺計算機創建一個具有唯一UUID,VM名稱和VNC端口的XML文件。由于不支持橋接,虛擬不能自動網絡,所以更改hostfwd參數,給每個VM的SSH公開一個不同的端口,例如2223代替2222。
定義所有它們之后,可以獲得當前正在運行的VM的列表:
virsh list。