搭建 KVM 虚拟化系统
最近閱讀了韋易笑(Github/知乎)專欄我愛命令行中的三篇文章:
KVM 虛擬化環境搭建 - WebVirtMgr
KVM 虛擬化環境搭建 - ProxmoxVE
OpenMediaVault:你的開源 NAS 系統
這三篇文章介紹了 KVM 虛擬化的搭建和家庭 NAS 方案,看得我心癢癢的。恰好自己在學校有動態公網 IP,就從咸魚買了兩條 16G 內存,加上一塊 2T 監控硬盤,把臺式機虛擬化作服務器。
我在 Debian10 上搭建 KVM 虛擬化環境,在虛擬機中創建 OpenMediaVault(NAS)和 Windows10 。這里主要有三個問題:
如何管理虛擬機?使用 WebVirtCloud 圖形化地管理虛擬機。
如何管理存儲?使用 mapped 模式讓虛擬機共享物理機硬盤。
如何管理網絡?使用橋接模式實現虛擬機聯網。
物理機僅用于虛擬化和為虛擬機提供硬盤,不做多余的事情。
機器配置
CPU: AMD Ryzen 3 3200GE
GPU: 核顯
硬盤:512G SSD 和 2T HDD
主板:迫擊炮 PRO A MAX
安裝 Debian10
因為 WebVirtCloud 支持在 Debian10 上自動安裝,并且 Debian 是最重要的開源項目之一,所以這里選擇 Debian10。
安裝無 GUI 版本即可,這樣可以節約系統資源。使用 GUI 安裝器安裝,在設置磁盤分區時,選擇“僅使用一個分區”,使用 btrfs 文件系統。事實上,btrfs 支持在不分區上的硬盤上安裝,但是 Debian10 沒有提供這個安裝選項。安裝完成后,如果確實想要類似于分區的效果,可以再為 home 等目錄創建 btrfs 子卷。
以下是我的 OS 信息。
_,met$$$$$gg.
,g$$$$$$$$$$$$$$$P.
,g$$P" """Y$$.".
,$$P' `$$$.
',$$P ,ggs. `$$b:
`d$$' ,$P"' . $$$
$$P d$' , $$P root@Thursday
$$: $$. - ,d$$' -------------
$$; Y$b._ _,d$P' OS: Debian GNU/Linux 10 (buster) x86_64
Y$$. `.`"Y$$$$P"' Host: MS-7C52 1.0
`$$b "-.__ Kernel: 4.19.0-18-amd64
`Y$$ Uptime: 5 hours, 50 mins
`Y$$. Packages: 1000 (dpkg)
`$$b. Shell: bash 5.0.3
`Y$$b. Terminal: /dev/pts/3
`"Y$b._ CPU: AMD Ryzen 3 3200GE (4) @ 2.770GHz
`""" GPU: AMD ATI Picasso
Memory: 19689MiB / 30097MiB
配置 ssh
安裝完成后首先要配置 ssh 服務器,以便遠程登錄操作。默認情況下,Debian 已經啟用了 ssh 服務器,如果沒有,請用以下命令安裝:
apt install -y openssh-server
然后啟用 ssh 服務器:
systemctl restart ssh # 重啟 ssh 服務
systemctl enable ssh # 開機自動啟動 ssh 服務
ssytemctl status ssh # 查看 ssh 服務狀態
安裝 Debian 時,自動創建了普通用戶賬戶,但物理機僅用于虛擬化,不做多余事情,不使用這個賬戶。所以直接使用 ssh 登錄 root 賬戶進行系統管理。如果 ssh 不允許登錄 root 賬戶,請取消 /etc/ssh/sshd_config 中以下代碼的注釋:
# PermitRootLogin yes
ssh 默認允許通過密碼驗證登錄,這會給系統帶來安全風險,配置好密碼登錄的 ssh 后,配置密鑰驗證,然后禁止密碼驗證。
在本地計算機(你的筆記本或臺式機)執行以下命令:
ssh-keygen # 如果有密鑰就不用再生成了
ssh-copy-id root@服務器ip地址
輸入 root 賬戶的密碼驗證成功后,就可以通過密鑰驗證登錄了。取消 /etc/ssh/sshd_config 中這樣注釋,禁止密碼驗證登錄。
# PasswordAuthentication no
只允許密鑰驗證登錄就意味著假如密鑰丟失,將永遠不可能通過 ssh 登錄服務器,所以要妥善保管密鑰。如果還需要更強的 ssh 安全性,可以參考如何配置安全的 SSH 服務?(OpenSSH 安全必知必會)。
最后,完成 ssh 安全性最重要的一步配置——神獸護體。在 /etc/issue.net 添加以下字符畫,下次登錄就會有神獸護體,永不宕機。
┌─┐ ┌─┐
┌──┘ ┴───────┘ ┴──┐
│ │
│ ─── │
│ ─┬┘ └┬─ │
│ │
│ ─┴─ │
│ │
└───┐ ┌───┘
│ │
│ │
│ │
│ └──────────────┐
│ │
│ ├─┐
│ ┌─┘
│ │
└─┐ ┐ ┌───────┬──┐ ┌──┘
│ ─┤ ─┤ │ ─┤ ─┤
└──┴──┘ └──┴──┘
神獸保佑
永不宕機
安裝 KVM
執行以下命令安裝 KVM 所需的包。
apt-get install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system dnsmasq
KVM 整套解決方案一般分三層:
KVM:內核級別的虛擬化功能,主要模擬指令執行和 I/O
QEMU:提供用戶操作界面,VNC/SPICE 等遠程終端服務
Libvirtd:虛擬化服務,運行在 Hypervisor 上提供 TCP 接口用于操作虛擬機的創建和啟停
安裝完 KVM 后,需要配置 libvirtd 和 qemu。
首先配置 libvirtd,使用 UNIX socket 連接 libvirtd,禁止安全驗證(本地連接沒有安全問題),禁止監聽 TLS,并將 socket 所有組設置為 libvirt。在 /etc/libvirt/libvirtd.conf 中找到并修改以下配置:
-p /home/data/kvm/imagei
mkdir -p /home/data/kvm/isounix_sock_group = "libvirt"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"
unix_sock_admin_perms = "0700"
unix_sock_dir = "/var/run/libvirt"
auth_unix_ro = "none"
auth_unix_rw = "none"
listen_tls = 0
然后將 www-data 用戶添加到 libvirt 組。
usermod www-data -G libvirt
最后讓 qemu 由用戶 libvirt-qemu(所屬用戶組為 libvirt-qemu)啟動。在 /etc/libvirt/qemu.conf 中找到并修改以下配置。
user = "libvirt-qemu"
group = "libvirt-qemu"
由于使用 WebVirtCloud 在瀏覽器中管理虛擬機,必須要讓用戶 www-data 可以連接 libvirt 的三個 socket,還要將這三個 socket 的所有者修改為 www-data。
chown www-data:libvirt /var/run/libvirt/libvirt*
設置橋接模式
KVM 有好幾種網絡模式,比如 NAT 模式、橋接模式等。
NAT 模式中,物理機相當于一個具有 NAT 功能的路由器,虛擬機處于這個子網中,擁有子網內的私有地址,虛擬機通過物理機向外連接互聯網,所有虛擬機在外界看來都使用物理機的 IP 地址。這種網絡模式可能導致端口沖突,只有私網 IP 的話可以使用這種模式。
橋接模式中,物理機相當于一個網橋(一種數據鏈路層設備),將物理機和虛擬機橋接起來,虛擬機有自己獨立的 IP 地址,在外界看來每個虛擬機都是獨立的網絡設備。這種網絡模式比較適合有多個公網 IP 的情況,每個虛擬機都有公網 IP,不會導致端口沖突。橋接模式僅適用于以太網。
參考 Debian 手冊 BridgeNetworkConnections 一節配置網橋。先安裝網橋管理的包:
apt install -y bridge-utils
再創建虛擬網橋 br0 并將物理網卡橋接上去。網卡名字通過ip a查看。
brctl addbr br0
brctl addif br0 網卡名字
完成之后可以通過ip a看到系統中多了一個網絡接口br0。修改網絡接口配置文件 /etc/network/interfaces.d。
source /etc/network/interfaces.d/* #
auto lo # 啟動時激活
iface lo inet loopback # 本地回環
auto enp37s0 # 啟動時激活以太網接口
iface enp37s0 inet manual # Debian 手冊推薦使用 maunal
auto br0 # 啟動時激活網橋
iface br0 inet dhcp # 通過 DHCP 獲取 IP 地址
bridge_ports enp37s0 # 將以太網接口橋接到網橋
bridge_stp off # Debian 手冊推薦的調優配置
bridge_waitport 0
bridge_fd 0
/etc/network/interface.d/ 中有一個配置文件 setup,其中激活了網卡 eth0,電腦上沒有這個網卡的話刪除這個文件。
修改內核參數,將以下配置寫入 /etc/sysctl.d/99-netfilter-bridge.conf。
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
加載 br_netfilter 內核模塊并重啟 network 服務。
modprobe br_netfilter
systemctl restart network
創建 KVM 目錄
mkdir -p /home/data/kvm
mkdir -p /home/data/kvm/image
mkdir -p /home/data/kvm/iso
chown www-data:www-data /home/data/kvm/iso
掛載機械硬盤
mkdir -p /home/data/kvm/hdd
mkfs.btrfs -l hdd /dev/sdx # 硬盤號使用 lsblk 查看
mount -t btrfs -o subvol='/' LABEL=hdd /home/data/kvm/hdd/
創建 /home/data/kvm/hdd,將機械硬盤掛載上去。嘗試掛載:
mount -t btrfs -o subvol='/' /home/data/kvm/hdd
在 /etc/fstab 中添加以下設置,實現自動掛載:
LABEL=hdd /home/data/kvm/hdd btrfs subvol=/ 0 0
安裝 WebVirtCloud
使用官方安裝腳本自動安裝配置。如果不能FQ就從 hub.fastgit.org 中下載安裝腳本,并將將腳本中的 github.com 改為 hub.fastgit.org。
進入 WebVirtCloud(端口 8080),初始用戶名 admin,初始密碼 admin。在“計算節點”-->“存儲”中配置 ISO 池(/home/data/kvm/iso)和 image 池(/home/data/kvm/image)。
共享目錄
通過設置共享目錄讓宿主機和虛擬機共享機械硬盤。編輯 KVM 虛擬機配置文件(也可以在 WebVirtCloud 中編輯 XML 配置):
virsh edit --domain 虛擬機名字
在<device>...</device>中添加以下代碼:
<filesystem type='mount' accessmode='mapped'>
<source dir='/home/data/kvm/hdd/omv'/> # 分配給該虛擬機的目錄在物理機中的路徑
<target dir='hdd'/> # 虛擬機中設備的名字,當成硬盤掛載
</filesystem>
上面的代碼片段中,宿主機創建了 /home/data/kvm/hdd/omv 并將這個目錄映射到虛擬機的硬盤 omv,在虛擬機中當成一般的硬盤掛載即可。在虛擬機中設置 /etc/fstab 實現開機自動掛載。
hdd /mnt/omv 9p trans=virtio 0 0
重啟后發現系統無法掛載,這是因為 systemd unit 之間的依賴有問題。mnt-hdd.mount 依賴于 9pnet_virtio 模塊,這個模塊在 kmod 之后才會加載。所以修改 mnt-hdd.mount 文件,在Unit中添加Requires=kmod.service強制在 kmod 加載后才掛載 mnt-hdd。
安裝配置 Windows10
Windows10 默認不支持 virtio,所以在 WebVirtCloud 中創建實例時,不要勾選任何和 virtio 有關的東西。創建完成后,在實例的“設置”-->“磁盤”-->“實例卷”-->“編輯卷”(一個圖標)-->“高級”-->“總線”中將 virtio 修改為 SATA。
Debian10 默認沒有安裝 acpi,導致 Windows10 無法相應 libvirt 的關機指令。關機時會出現libvirt-guests.sh: Waiting for guest OMV to shut down 的報錯,安裝 acpi 就可以解決。
apt install -y acpi acpid
Windows10 虛擬機在我的電腦上只有兩個核心,性能非常差。通過 host-passthrough 解決這個問題,詳細信息參考 Domain XML format,使用這個模式后虛擬機可以直接使用物理機 CPU,但喪失了在不同平臺遷移的能力。
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' cores='4' threads='1'/>
</cpu>
sockets 是 CPU 數量,cores 是核心數,threads 是每個核的線程數。
安裝配置 OpenMediaVault
OpenMediaVault(簡稱 OMV) 是基于 Debian 的 NAS 系統,詳細信息可以參考韋易笑的知乎專欄文章OpenMediaVault:你的開源 NAS 系統。
參考本文上面介紹的掛載機械硬盤和共享目錄,在機械硬盤上創建一個目錄給 OMV。安裝好 OMV 后,服務的主要服務都跑在 OMV 中。
安裝 OMV-Extras(OMV 插件管理器):
apt update -y && apt --no-install-recommends -y install dirmngr gnupg && wget http://omv-extras.org/openmediavault-omvextrasorg_latest_all5.deb && dpkg -i openmediavault-omvextrasorg_latest_all5.deb
安裝完畢后,進入 OMV 的 Web 管理界面,在 OMV-Extras 中安裝 docker。
搭建應用服務
到這里,我們就有了自己的 NAS 和私有云,可以方便的創建銷毀虛擬機,還可以利用服務器(虛擬機)搭建各種應用。Github 上有一個項目 awesome-selfhosted 收集了各種可以在服務器上搭建的項目,知乎上也有不少回答很有價值。
calibre-web
搭建 calibre-web 個人圖書館。直接通過 pip3 安裝 calibre-web。
apt install -y python3-setuptools xz-utils python3-pip imagemagick
pip3 install wheel
pip3 install "Jinja2>3"
pip3 install calibreweb[
pip3 install calibreweb[{oauth,metadata,comics}]
安裝 calibre 來獲取電子書轉換功能。
wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin
電子書轉換器位置在 /opt/calibre/calibre-convert,在 web 中設置轉換器位置。
通過calibre-web-double實現從豆瓣下載元數據。將這個項目中的 NewDouban.py 拷貝到 /usr/local/lib/python3.7/dist-packages/calibreweb/cps/metadata_provider 并重啟 calibre-web 即可。
編寫 systemd 服務開啟自動啟動。
# /etc/systemd/system/calibre.service
[Unit]
Description=Calibre web service
[Service]
ExecStart=/usr/local/bin/cps
# /etc/systemd/system/calibre.timer
[Unit]
Description=Run calibre-web everyday
[Timer]
OnBootSec=1m
[Install]
WantedBy=multi-user.target
硬件問題
sp5100-tco watchdog hardware is disabled
這是因為主板不支持這個功能,/etc/modprobe.d/sp5100_tco.conf 添加以下配置,將 sp5100-tco 假如黑名單。
blacklist sp5100_tco
AMD Vi error: unable to write to iommu perf counter
在 /etc/default/grub 中修改GRUB_CMDLINE_LINIX為iommu=soft,然后執行update-grub更新 grub。
總結
以上是生活随笔為你收集整理的搭建 KVM 虚拟化系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿卡丽星守皮肤(阿卡丽皮肤哪个有特效)
- 下一篇: 录加一个走字底是什么字(一个录加走之念什