安裝 QEMU/KVM & Docker

No Comments

目前初步評估/學習了一下,不少人建議使用 qemu-kvm 來作為虛擬機器因其使用體驗或許會優於 virtualbox。不過 qemu 顯示方面目前筆者認知就是 spice & vnc 兩種用戶終端,後者速度劣於 spice。而跨平台的顯示終端又以 RDP 為常見且使用體驗也或許優於 spice,其或許也有遠端顯示的能力/見參考資料,但是否有友善的終端就待學習後才能得知了。故當前筆者結論還是會持續使用 virtualbox/rdp 於遠端顯示與操作。qemu-kvm 則用於本地端的實務使用。docker 則毌需贅言有幾乎取代各種 VM 的態勢;話說回來 qemu 此類 VM 仍有其不可取代性。
就待筆者慢慢習得/將補充常見用法於下/主要也都出處於以下參考資料就不再強調。

參考資料

# 一。一般安裝 qemu/kvm:
sudo apt install qemu qemu-kvm libvirt-daemon libvirt-daemon-system libvirt-clients virtinst virt-manager cpu-checker bridge-utils


# 二。最小安裝示例:

## install
sudo apt install qemu-system-x86

## create an image as a virtual disk(alternatively use the qemu-img tool)
fallocate -l 10G image.img

## generate the vm and attach the cdrom/for system install
qemu-system-x86_64 -enable-kvm -cdrom ubuntu-20.04.5-desktop-amd64.iso -boot menu=on -drive file=image.img,format=raw -m 4G -cpu host -smp 2 -vga virtio -display sdl,gl=on

## run the vm after the system on vm installed/remove the -cdrom
qemu-system-x86_64 -enable-kvm -boot menu=on -drive file=image.img,format=raw -m 4G -cpu host -smp 2 -vga virtio -display sdl,gl=on

# 三。最小安裝示例後,將 raw image 轉換成 qcow2 sparse file:

## install guestfs-tools
sudo apt install guestfs-tools

## convert to qcow2
sudo virt-sparsify image.img --convert qcow2 image.qcow2

## alter the file mode and owner to the same as image.img

## launch the vm
qemu-system-x86_64 -enable-kvm -boot menu=on -drive file=image.qcow2 -m 4G -cpu host -smp 2 -vga virtio -display sdl,gl=on

# Note:1. 較新的 VM 版本,可能是沒有 qemu-kvm package 了,而是納入 qemu,故只使用參數 -enable-kvm。2. libvirt/virt-manager 應是有包含了 vm disk 的相關工具的集成,故不見得只安裝 guestfs-tools 會較簡化。

# 四。以上第二點,僅使用 qemu-kvm,即可在系統上使用 VM。第三點是額外的工具,處理映像檔相關的問題。然而如此的配置是相當的陽春,例如 client/host 的 copy/paste,遠端桌面等都須要額外的加裝才能 support。而若使用 virt-manager 等 libvirt 相關的工具,便是可以一應俱全了。因此看需求來走什麼樣的安裝。筆者接下來又安裝了 spice-vdagent。後續下達的 command 也列在下。

## qemu-system-x86_64 -enable-kvm -machine vmport=off -boot menu=on -drive file=image.qcow2 -m 4G -cpu host -smp 2 -vga qxl -display sdl,gl=on -spice port=3001,disable-ticketing=on -device intel-hda -device hda-duplex -device virtio-serial -chardev spicevmc,id=vdagent,debug=0,name=vdagent -device virtserialport,chardev=vdagent,name=com.redhat.spice.0

## 使用遠端桌面則下例如,remote-viewer spice://localhost:3001

## 然而這樣的加裝無法“順利”滿足需求。因此想要較完整且“不沾鍋”的做法,就是一般的安裝 qemu/kvm,libvirtd,virt-manager,而 libvirtd 在要使用時才啓動。而遠端桌面則上面連結有位德國人的文章有很完整與全面的說明與實務。而較快速的方法就曾提過的改用 virtualbox rdp 方案了。另提,底下的 qemu base image,在 machine-id 的部份關聯到 dhcp ip,只對使用 virt-manager 才有效。

二。製作 qemu base image

  • 摘錄自這篇文章
    https://octetz.com/docs/2020/2020-10-19-machine-images/
  • 我們通常會製作常用的 base images,用以 clone 出來使用。不過若使用某原生 image 來同時派生執行多個實例,則因原生的 images 都已有設定例如 hostname 的資料,將會造成混淆。其次 machine-id 也會一樣,將可能導致 client ips 被指定成相同的 ip。因此尚須將製作出來的原生 image 加工過,使得同時執行的多個 images 實例不再衝突。
  • 當我們將原生 image 製作完成,並於該系統運行下再接著加工。
  • 有三個步驟,當中二個分別是刪除 hostname,及 machine-id。第三個是産生亂數所産生的 hostname,細節如下:
  • create hostname-init.sh in /usr/local/bin/
#!/bin/sh
SN="hostname-init"

# do nothing if /etc/hostname exists
if [ -f "/etc/hostname" ]; then
  echo "${SN}: /etc/hostname exists; noop"
  exit
fi

echo "${SN}: creating hostname"

# set hostname
HN=$(head -60 /dev/urandom | tr -dc 'a-z' | fold -w 3 | head -n 1)
echo ${HN} > /etc/hostname
echo "${SN}: hostname (${HN}) created"

# sort of dangerous, but works.
if [ -f "/etc/hostname" ]; then
  /sbin/reboot
fi
  • sudo chmod a+x /usr/local/bin/hostname-init.sh
  • sudo chown root:root /usr/local/bin/hostname-init.sh
  • create /etc/systemd/system/hostname-init.service
[Unit]
Description=Set a random hostname.
ConditionPathExists=!/etc/hostname

[Service]
ExecStart=/usr/local/bin/hostname-init.sh

[Install]
WantedBy=multi-user.target
  • sudo chmod 644 /etc/systemd/system/hostname-init.service
  • sudo systemctl daemon-reload
  • sudo systemctl enable hostname-init
  • sudo -i
  • echo -n > /etc/machine-id
  • rm -v /etc/hostname
  • exit
  • 接著就關機。base image 就完成了。並將其 clone 出來使用。
  • 經實際測試發現,clone 出來的 images 佔用空間會小於來源檔。按這篇文章的加工方法,其是一年多前的做法;因此筆者猜想/不再實測,使用 virt-clone 指令或許現今已自動排除衝突的可能,讀者可自行驗測看看。
# 其中,一些指令用法如下,

# list the managed images
virsh list --all

# Clone the_u20 to another_node0
virt-clone --original the_u20 \
    --name another_node0 \
    --file /var/lib/libvirt/images/node0.qcow2

# Power on the new clone
virsh start another_node0

# Find the IP addresses; the network name can be others; default is default
virsh net-dhcp-leases default

Categories: Linux

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

PHP Code Snippets Powered By : XYZScripts.com