QEMU/KVM 虛擬化
QEMU/KVM 是目前最流行的虛擬化技術,它基於 Linux 內核提供的 kvm 模塊,結構精簡,性能損失小,而且開源免費(對比收費的 vmware),因此成了大部分企業的首選虛擬化方案。
目前各大雲廠商的虛擬化方案,新的服務器實例基本都是用的 KVM 技術。即使是起步最早,一直重度使用 Xen 的 AWS,從 EC2 C5 開始就改用了基於 KVM 定制的 Nitro 虛擬化技術。。
但是 KVM 作為一個企業級的底層虛擬化技術,卻沒有對桌面使用做深入的優化,因此如果想把它當成桌面虛擬化軟件來使用,替代掉 VirtualBox/VMware,有一定難度。
本文是我個人學習 KVM 的一個總結性文檔,其目標是使用 KVM 作為桌面虛擬化軟件。
一、安裝 QUEU/KVM
QEMU/KVM 環境需要安裝很多的組件,它們各司其職:
- qemu: 模擬各類輸入輸出設備(網卡、磁盤、USB端口等)
- qemu 底層使用 kvm 模擬 CPU 和 RAM,比軟件模擬的方式快很多。
- libvirt: 提供簡單且統一的工具和 API,用於管理虛擬機,屏蔽了底層的復雜結構。(支持 qemu-kvm/virtualbox/vmware)
- ovmf: 為虛擬機啟用 UEFI 支持
- virt-manager: 用於管理虛擬機的 GUI 界面(可以管理遠程 kvm 主機)。
- virt-viewer: 通過 GUI 界面直接與虛擬機交互(可以管理遠程 kvm 主機)。
- dnsmasq vde2 bridge-utils openbsd-netcat: 網絡相關組件,提供了以太網虛擬化、網絡橋接、NAT網絡等虛擬網絡功能。
- dnsmasq 提供了 NAT 虛擬網絡的 DHCP 及 DNS 解析功能。
- vde2: 以太網虛擬化
- bridge-utils: 顧名思義,提供網絡橋接相關的工具。
- openbsd-netcat: TCP/IP 的瑞士軍刀,詳見 /network/network-tools/socat 和 netcat,這里不清楚是哪個網絡組件會用到它。
安裝命令:
# archlinux/manjaro
sudo pacman -S qemu virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat
# ubuntu,參考了官方文檔,但未測試
sudo apt install qemu-kvm libvirt-daemon-system virt-manager virt-viewer virtinst bridge-utils
# centos,參考了官方文檔,但未測試
sudo yum groupinstall "Virtualization Host"
sudo yum install virt-manager virt-viewer virt-install
# opensuse
# see: https://doc.opensuse.org/documentation/leap/virtualization/html/book-virt/cha-vt-installation.html
sudo yast2 virtualization
# enter to terminal ui, select kvm + kvm tools, and then install it.
安裝完成后,還不能直接使用,需要做些額外的工作。請繼續往下走。
1. libguestfs - 虛擬機磁盤映像處理工具
libguestfs 是一個虛擬機磁盤映像處理工具,可用於直接修改/查看/虛擬機映像、轉換映像格式等。
它提供的命令列表如下:
virt-df centos.img
: 查看硬盤使用情況virt-ls centos.img /
: 列出目錄文件virt-copy-out -d domain /etc/passwd /tmp
:在虛擬映像中執行文件復制virt-list-filesystems /file/xx.img
:查看文件系統信息virt-list-partitions /file/xx.img
:查看分區信息guestmount -a /file/xx.qcow2(raw/qcow2都支持) -m /dev/VolGroup/lv_root --rw /mnt
:直接將分區掛載到宿主機guestfish
: 交互式 shell,可運行上述所有命令。virt-v2v
: 將其他格式的虛擬機(比如 ova) 轉換成 kvm 虛擬機。virt-p2v
: 將一台物理機轉換成虛擬機。
學習過程中可能會使用到上述命令,提前安裝好總不會有錯,安裝命令如下:
# opensuse
sudo zypper install libguestfs
# archlinux/manjaro,目前缺少 virt-v2v/virt-p2v 組件
sudo pacman -S libguestfs
# ubuntu
sudo apt install libguestfs-tools
# centos
sudo yum install libguestfs-tools
2. 啟動 QEMU/KVM
通過 systemd 啟動 libvirtd 后台服務:
sudo systemctl enable libvirtd.service
sudo systemctl start libvirtd.service
3. 讓非 root 用戶能正常使用 kvm
qumu/kvm 裝好后,默認情況下需要 root 權限才能正常使用它。
為了方便使用,首先編輯文件 /etc/libvirt/libvirtd.conf
:
unix_sock_group = "libvirt"
,取消這一行的注釋,使libvirt
用戶組能使用 unix 套接字。unix_sock_rw_perms = "0770"
,取消這一行的注釋,使用戶能讀寫 unix 套接字。
然后新建 libvirt 用戶組,將當前用戶加入該組:
newgrp libvirt
sudo usermod -aG libvirt $USER
最后重啟 libvirtd 服務,應該就能正常使用了:
sudo systemctl restart libvirtd.service
3. 啟用嵌套虛擬化
如果你需要在虛擬機中運行虛擬機(比如在虛擬機里測試 katacontainers 等安全容器技術),那就需要啟用內核模塊 kvm_intel 實現嵌套虛擬化。
# 臨時啟用 kvm_intel 嵌套虛擬化
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
# 修改配置,永久啟用嵌套虛擬化
echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
驗證嵌套虛擬化已經啟用:
$ cat /sys/module/kvm_intel/parameters/nested
Y
至此,KVM 的安裝就大功告成啦,現在應該可以在系統中找到 virt-manager 的圖標,進去就可以使用了。
virt-manager 的使用方法和 virtualbox/vmware workstation 大同小異,這里就不詳細介紹了,自己摸索摸索應該就會了。
如下內容是進階篇,主要介紹如何通過命令行來管理虛擬機磁盤,以及 KVM。
如果你還是 kvm 新手,建議先通過圖形界面 virt-manager 熟悉熟悉,再往下繼續讀。
二、虛擬機磁盤映像管理
這需要用到兩個工具:
- libguestfs: 虛擬機磁盤映像管理工具,前面介紹過了
- qemu-img: qemu 的磁盤映像管理工具,用於創建磁盤、擴縮容磁盤、生成磁盤快照、查看磁盤信息、轉換磁盤格式等等。
# 創建磁盤
qemu-img create -f qcow2 -o cluster_size=128K virt_disk.qcow2 20G
# 擴容磁盤
qemu-img resize ubuntu-server-cloudimg-amd64.img 30G
# 查看磁盤信息
qemu-img info ubuntu-server-cloudimg-amd64.img
# 轉換磁盤格式
qemu-img convert -f raw -O qcow2 vm01.img vm01.qcow2 # raw => qcow2
qemu-img convert -f qcow2 -O raw vm01.qcow2 vm01.img # qcow2 => raw
1. 導入 vmware 鏡像
直接從 vmware ova 文件導入 kvm,這種方式轉換得到的鏡像應該能直接用(網卡需要重新配置):
virt-v2v -i ova centos7-test01.ova -o local -os /vmhost/centos7-01 -of qcow2
也可以先從 ova 中解壓出 vmdk 磁盤映像,將 vmware 的 vmdk 文件轉換成 qcow2 格式,然后再導入 kvm(網卡需要重新配置):
# 轉換映像格式
qemu-img convert -p -f vmdk -O qcow2 centos7-test01-disk1.vmdk centos7-test01.qcow2
# 查看轉換后的映像信息
qemu-img info centos7-test01.qcow2
直接轉換 vmdk 文件得到的 qcow2 鏡像,啟會報錯,比如「磁盤無法掛載」。
根據 Importing Virtual Machines and disk images - ProxmoxVE Docs 文檔所言,需要在網上下載安裝 MergeIDE.zip 組件,
另外啟動虛擬機前,需要將硬盤類型改為 IDE,才能解決這個問題。
2. 導入 img 鏡像
img 鏡像文件,就是所謂的 raw 格式鏡像,也被稱為裸鏡像,IO 速度比 qcow2 快,但是體積大,而且不支持快照等高級特性。
如果不追求 IO 性能的話,建議將它轉換成 qcow2 再使用。
qemu-img convert -f raw -O qcow2 vm01.img vm01.qcow2
三、虛擬機管理
虛擬機管理可以使用命令行工具 virsh
/virt-install
,也可以使用 GUI 工具 virt-manager
.
GUI 很傻瓜式,就不介紹了,這里主要介紹命令行工具 virsh
/virt-install
先介紹下 libvirt 中的幾個概念:
- Domain: 指代運行在虛擬機器上的操作系統的實例 - 一個虛擬機,或者用於啟動虛擬機的配置。
- Guest OS: 運行在 domain 中的虛擬操作系統。
大部分情況下,你都可以把下面命令中涉及到的 domain
理解成虛擬機。
0. 設置默認 URI
virsh
/virt-install
/virt-viewer
等一系列 libvirt 命令,
默認情況下會使用 qemu:///session
作為 URI 去連接 QEMU/KVM,只有 root 賬號才會默認使用 qemu:///system
.
另一方面 virt-manager
這個 GUI 工具,默認也會使用 qemu:///system
去連接 QEMU/KVM(和 root 賬號一致)
qemu:///system
是系統全局的 qemu 環境,而 qemu:///session
的環境是按用戶隔離的。
另外 qemu:///session
沒有默認的 network
,創建虛擬機時會出毛病。。。
因此,你需要將默認的 URI 改為 qemu:///system
,否則絕對會被坑:
echo 'export LIBVIRT_DEFAULT_URI="qemu:///system"' >> ~/.bashrc
1. 創建虛擬機 - virt-intall
# 使用 iso 鏡像創建全新的 proxmox 虛擬機,自動創建一個 60G 的磁盤。
virt-install --virt-type kvm \
--name pve-1 \
--vcpus 4 --memory 8096 \
--disk size=60 \
--network network=default,model=virtio \
--os-type linux \
--os-variant generic \
--graphics vnc \
--cdrom proxmox-ve_6.3-1.iso
# 使用已存在的 opensuse cloud 磁盤創建虛擬機
virt-install --virt-type kvm \
--name opensuse15-2 \
--vcpus 2 --memory 2048 \
--disk opensuse15.2-openstack.qcow2,device=disk,bus=virtio \
--disk seed.iso,device=cdrom \
--os-type linux \
--os-variant opensuse15.2 \
--network network=default,model=virtio \
--graphics vnc \
--import
其中的 --os-variant
用於設定 OS 相關的優化配置,官方文檔強烈推薦設定,其可選參數可以通過 osinfo-query os
查看。
3. 虛擬機管理 - virsh
虛擬機創建好后,可使用 virsh 管理虛擬機:
查看虛擬機列表:
# 查看正在運行的虛擬機
virsh list
# 查看所有虛擬機,包括 inactive 的虛擬機
virsh list --all
使用 virt-viewer
以 vnc 協議登入虛擬機終端:
# 使用虛擬機 ID 連接
virt-viewer 8
# 使用虛擬機名稱連接,並且等待虛擬機啟動
virt-viewer --wait opensuse15
啟動、關閉、暫停(休眠)、重啟虛擬機:
virsh start opensuse15
virsh suuspend opensuse15
virsh resume opensuse15
virsh reboot opensuse15
# 優雅關機
virsh shutdown opensuse15
# 強制關機
virsh destroy opensuse15
# 啟用自動開機
virsh autostart opensuse15
# 禁用自動開機
virsh autostart --disable opensuse15
虛擬機快照管理:
# 列出一個虛擬機的所有快照
virsh snapshot-list --domain opensuse15
# 給某個虛擬機生成一個新快照
virsh snapshot-create <domain>
# 使用快照將虛擬機還原
virsh snapshot-restore <domain> <snapshotname>
# 刪除快照
virsh snapshot-delete <domain> <snapshotname>
刪除虛擬機:
virsh undefine opensuse15
遷移虛擬機:
# 使用默認參數進行離線遷移,將已關機的服務器遷移到另一個 qemu 實例
virsh migrate 37 qemu+ssh://tux@jupiter.example.com/system
# 還支持在線實時遷移,待續
cpu/內存修改:
# 改成 4 核
virsh setvcpus opensuse15 4
# 改成 4G
virsh setmem opensuse15 4096
虛擬機監控:
# 待續
修改磁盤、網絡及其他設備:
# 添加新設備
virsh attach-device
virsh attach-disk
virsh attach-interface
# 刪除設備
virsh detach-disk
virsh detach-device
virsh detach-interface
虛擬機網絡管理:
# 列出所有虛擬機網絡
virsh net-list
# 待續