天天看點

QEMU-KVM 虛拟化環境的搭建與使用

原文連結:https://ryan4yin.space/posts/qemu-kvm-usage/
QEMU-KVM 虛拟化環境的搭建與使用

QEMU/KVM 虛拟化

QEMU/KVM 是目前最流行的虛拟化技術,它基于 Linux 核心提供的 kvm 子產品,結構精簡,性能損失小,而且開源免費(對比收費的 vmware),是以成了大部分企業的首選虛拟化方案。

目前各大雲廠商的虛拟化方案,新的伺服器執行個體基本都是用的 KVM 技術。即使是起步最早,一直重度使用 Xen 的 AWS,從 EC2 C5 開始就改用了基于 KVM 定制的 Nitro 虛拟化技術。。

但是 KVM 作為一個企業級的底層虛拟化技術,卻沒有對桌面使用做深入的優化,是以如果想把它當成桌面虛拟化軟體來使用,替代掉 VirtualBox/VMware,有一定難度。

本文是我個人學習 KVM 的一個總結性文檔,其目标是使用 KVM 作為桌面虛拟化軟體。

一、安裝 QUEU/KVM

QEMU/KVM 環境需要安裝很多的元件,它們各司其職:

  1. qemu: 模拟各類輸入輸出裝置(網卡、磁盤、USB端口等)
    • qemu 底層使用 kvm 模拟 CPU 和 RAM,比軟體模拟的方式快很多。
  2. libvirt: 提供簡單且統一的工具和 API,用于管理虛拟機,屏蔽了底層的複雜結構。(支援 qemu-kvm/virtualbox/vmware)
  3. ovmf: 為虛拟機啟用 UEFI 支援
  4. virt-manager: 用于管理虛拟機的 GUI 界面(可以管理遠端 kvm 主機)。
  5. virt-viewer: 通過 GUI 界面直接與虛拟機互動(可以管理遠端 kvm 主機)。
  6. 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 是一個虛拟機磁盤映像處理工具,可用于直接修改/檢視/虛拟機映像、轉換映像格式等。

它提供的指令清單如下:

  1. virt-df centos.img

    : 檢視硬碟使用情況
  2. virt-ls centos.img /

    : 列出目錄檔案
  3. virt-copy-out -d domain /etc/passwd /tmp

    :在虛拟映像中執行檔案複制
  4. virt-list-filesystems /file/xx.img

    :檢視檔案系統資訊
  5. virt-list-partitions /file/xx.img

    :檢視分區資訊
  6. guestmount -a /file/xx.qcow2(raw/qcow2都支援) -m /dev/VolGroup/lv_root --rw /mnt

    :直接将分區挂載到主控端
  7. guestfish

    : 互動式 shell,可運作上述所有指令。
  8. virt-v2v

    : 将其他格式的虛拟機(比如 ova) 轉換成 kvm 虛拟機。
  9. 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

:

  1. unix_sock_group = "libvirt"

    ,取消這一行的注釋,使

    libvirt

    使用者組能使用 unix 套接字。
  2. 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 熟悉熟悉,再往下繼續讀。

二、虛拟機磁盤映像管理

這需要用到兩個工具:

  1. libguestfs: 虛拟機磁盤映像管理工具,前面介紹過了
  2. 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 中的幾個概念:

  1. Domain: 指代運作在虛拟機器上的作業系統的執行個體 - 一個虛拟機,或者用于啟動虛拟機的配置。
  2. 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://[email protected]/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
# 待續
           

參考

  • Virtualization Guide - OpenSUSE
  • Complete Installation of KVM, QEMU and Virt Manager on Arch Linux and Manjaro
  • virtualization-libvirt - ubuntu docs
  • RedHat Docs - KVM

繼續閱讀