搭建 KVM 虚拟化系统
最近閱讀了韋易笑(Github/知乎)專欄我愛命令行中的三篇文章:
KVM 虛擬化環(huán)境搭建 - WebVirtMgr
KVM 虛擬化環(huán)境搭建 - ProxmoxVE
OpenMediaVault:你的開源 NAS 系統(tǒng)
這三篇文章介紹了 KVM 虛擬化的搭建和家庭 NAS 方案,看得我心癢癢的。恰好自己在學(xué)校有動(dòng)態(tài)公網(wǎng) IP,就從咸魚買了兩條 16G 內(nèi)存,加上一塊 2T 監(jiān)控硬盤,把臺(tái)式機(jī)虛擬化作服務(wù)器。
我在 Debian10 上搭建 KVM 虛擬化環(huán)境,在虛擬機(jī)中創(chuàng)建 OpenMediaVault(NAS)和 Windows10 。這里主要有三個(gè)問題:
如何管理虛擬機(jī)?使用 WebVirtCloud 圖形化地管理虛擬機(jī)。
如何管理存儲(chǔ)?使用 mapped 模式讓虛擬機(jī)共享物理機(jī)硬盤。
如何管理網(wǎng)絡(luò)?使用橋接模式實(shí)現(xiàn)虛擬機(jī)聯(lián)網(wǎng)。
物理機(jī)僅用于虛擬化和為虛擬機(jī)提供硬盤,不做多余的事情。
機(jī)器配置
CPU: AMD Ryzen 3 3200GE
GPU: 核顯
硬盤:512G SSD 和 2T HDD
主板:迫擊炮 PRO A MAX
安裝 Debian10
因?yàn)?WebVirtCloud 支持在 Debian10 上自動(dòng)安裝,并且 Debian 是最重要的開源項(xiàng)目之一,所以這里選擇 Debian10。
安裝無(wú) GUI 版本即可,這樣可以節(jié)約系統(tǒng)資源。使用 GUI 安裝器安裝,在設(shè)置磁盤分區(qū)時(shí),選擇“僅使用一個(gè)分區(qū)”,使用 btrfs 文件系統(tǒng)。事實(shí)上,btrfs 支持在不分區(qū)上的硬盤上安裝,但是 Debian10 沒有提供這個(gè)安裝選項(xiàng)。安裝完成后,如果確實(shí)想要類似于分區(qū)的效果,可以再為 home 等目錄創(chuàng)建 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 服務(wù)器,以便遠(yuǎn)程登錄操作。默認(rèn)情況下,Debian 已經(jīng)啟用了 ssh 服務(wù)器,如果沒有,請(qǐng)用以下命令安裝:
apt install -y openssh-server
然后啟用 ssh 服務(wù)器:
systemctl restart ssh # 重啟 ssh 服務(wù)
systemctl enable ssh # 開機(jī)自動(dòng)啟動(dòng) ssh 服務(wù)
ssytemctl status ssh # 查看 ssh 服務(wù)狀態(tài)
安裝 Debian 時(shí),自動(dòng)創(chuàng)建了普通用戶賬戶,但物理機(jī)僅用于虛擬化,不做多余事情,不使用這個(gè)賬戶。所以直接使用 ssh 登錄 root 賬戶進(jìn)行系統(tǒng)管理。如果 ssh 不允許登錄 root 賬戶,請(qǐng)取消 /etc/ssh/sshd_config 中以下代碼的注釋:
# PermitRootLogin yes
ssh 默認(rèn)允許通過密碼驗(yàn)證登錄,這會(huì)給系統(tǒng)帶來(lái)安全風(fēng)險(xiǎn),配置好密碼登錄的 ssh 后,配置密鑰驗(yàn)證,然后禁止密碼驗(yàn)證。
在本地計(jì)算機(jī)(你的筆記本或臺(tái)式機(jī))執(zhí)行以下命令:
ssh-keygen # 如果有密鑰就不用再生成了
ssh-copy-id root@服務(wù)器ip地址
輸入 root 賬戶的密碼驗(yàn)證成功后,就可以通過密鑰驗(yàn)證登錄了。取消 /etc/ssh/sshd_config 中這樣注釋,禁止密碼驗(yàn)證登錄。
# PasswordAuthentication no
只允許密鑰驗(yàn)證登錄就意味著假如密鑰丟失,將永遠(yuǎn)不可能通過 ssh 登錄服務(wù)器,所以要妥善保管密鑰。如果還需要更強(qiáng)的 ssh 安全性,可以參考如何配置安全的 SSH 服務(wù)?(OpenSSH 安全必知必會(huì))。
最后,完成 ssh 安全性最重要的一步配置——神獸護(hù)體。在 /etc/issue.net 添加以下字符畫,下次登錄就會(huì)有神獸護(hù)體,永不宕機(jī)。
┌─┐ ┌─┐
┌──┘ ┴───────┘ ┴──┐
│ │
│ ─── │
│ ─┬┘ └┬─ │
│ │
│ ─┴─ │
│ │
└───┐ ┌───┘
│ │
│ │
│ │
│ └──────────────┐
│ │
│ ├─┐
│ ┌─┘
│ │
└─┐ ┐ ┌───────┬──┐ ┌──┘
│ ─┤ ─┤ │ ─┤ ─┤
└──┴──┘ └──┴──┘
神獸保佑
永不宕機(jī)
安裝 KVM
執(zhí)行以下命令安裝 KVM 所需的包。
apt-get install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system dnsmasq
KVM 整套解決方案一般分三層:
KVM:內(nèi)核級(jí)別的虛擬化功能,主要模擬指令執(zhí)行和 I/O
QEMU:提供用戶操作界面,VNC/SPICE 等遠(yuǎn)程終端服務(wù)
Libvirtd:虛擬化服務(wù),運(yùn)行在 Hypervisor 上提供 TCP 接口用于操作虛擬機(jī)的創(chuàng)建和啟停
安裝完 KVM 后,需要配置 libvirtd 和 qemu。
首先配置 libvirtd,使用 UNIX socket 連接 libvirtd,禁止安全驗(yàn)證(本地連接沒有安全問題),禁止監(jiān)聽 TLS,并將 socket 所有組設(shè)置為 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)啟動(dòng)。在 /etc/libvirt/qemu.conf 中找到并修改以下配置。
user = "libvirt-qemu"
group = "libvirt-qemu"
由于使用 WebVirtCloud 在瀏覽器中管理虛擬機(jī),必須要讓用戶 www-data 可以連接 libvirt 的三個(gè) socket,還要將這三個(gè) socket 的所有者修改為 www-data。
chown www-data:libvirt /var/run/libvirt/libvirt*
設(shè)置橋接模式
KVM 有好幾種網(wǎng)絡(luò)模式,比如 NAT 模式、橋接模式等。
NAT 模式中,物理機(jī)相當(dāng)于一個(gè)具有 NAT 功能的路由器,虛擬機(jī)處于這個(gè)子網(wǎng)中,擁有子網(wǎng)內(nèi)的私有地址,虛擬機(jī)通過物理機(jī)向外連接互聯(lián)網(wǎng),所有虛擬機(jī)在外界看來(lái)都使用物理機(jī)的 IP 地址。這種網(wǎng)絡(luò)模式可能導(dǎo)致端口沖突,只有私網(wǎng) IP 的話可以使用這種模式。
橋接模式中,物理機(jī)相當(dāng)于一個(gè)網(wǎng)橋(一種數(shù)據(jù)鏈路層設(shè)備),將物理機(jī)和虛擬機(jī)橋接起來(lái),虛擬機(jī)有自己獨(dú)立的 IP 地址,在外界看來(lái)每個(gè)虛擬機(jī)都是獨(dú)立的網(wǎng)絡(luò)設(shè)備。這種網(wǎng)絡(luò)模式比較適合有多個(gè)公網(wǎng) IP 的情況,每個(gè)虛擬機(jī)都有公網(wǎng) IP,不會(huì)導(dǎo)致端口沖突。橋接模式僅適用于以太網(wǎng)。
參考 Debian 手冊(cè) BridgeNetworkConnections 一節(jié)配置網(wǎng)橋。先安裝網(wǎng)橋管理的包:
apt install -y bridge-utils
再創(chuàng)建虛擬網(wǎng)橋 br0 并將物理網(wǎng)卡橋接上去。網(wǎng)卡名字通過ip a查看。
brctl addbr br0
brctl addif br0 網(wǎng)卡名字
完成之后可以通過ip a看到系統(tǒng)中多了一個(gè)網(wǎng)絡(luò)接口br0。修改網(wǎng)絡(luò)接口配置文件 /etc/network/interfaces.d。
source /etc/network/interfaces.d/* #
auto lo # 啟動(dòng)時(shí)激活
iface lo inet loopback # 本地回環(huán)
auto enp37s0 # 啟動(dòng)時(shí)激活以太網(wǎng)接口
iface enp37s0 inet manual # Debian 手冊(cè)推薦使用 maunal
auto br0 # 啟動(dòng)時(shí)激活網(wǎng)橋
iface br0 inet dhcp # 通過 DHCP 獲取 IP 地址
bridge_ports enp37s0 # 將以太網(wǎng)接口橋接到網(wǎng)橋
bridge_stp off # Debian 手冊(cè)推薦的調(diào)優(yōu)配置
bridge_waitport 0
bridge_fd 0
/etc/network/interface.d/ 中有一個(gè)配置文件 setup,其中激活了網(wǎng)卡 eth0,電腦上沒有這個(gè)網(wǎng)卡的話刪除這個(gè)文件。
修改內(nèi)核參數(shù),將以下配置寫入 /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 內(nèi)核模塊并重啟 network 服務(wù)。
modprobe br_netfilter
systemctl restart network
創(chuàng)建 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
掛載機(jī)械硬盤
mkdir -p /home/data/kvm/hdd
mkfs.btrfs -l hdd /dev/sdx # 硬盤號(hào)使用 lsblk 查看
mount -t btrfs -o subvol='/' LABEL=hdd /home/data/kvm/hdd/
創(chuàng)建 /home/data/kvm/hdd,將機(jī)械硬盤掛載上去。嘗試掛載:
mount -t btrfs -o subvol='/' /home/data/kvm/hdd
在 /etc/fstab 中添加以下設(shè)置,實(shí)現(xiàn)自動(dòng)掛載:
LABEL=hdd /home/data/kvm/hdd btrfs subvol=/ 0 0
安裝 WebVirtCloud
使用官方安裝腳本自動(dòng)安裝配置。如果不能FQ就從 hub.fastgit.org 中下載安裝腳本,并將將腳本中的 github.com 改為 hub.fastgit.org。
進(jìn)入 WebVirtCloud(端口 8080),初始用戶名 admin,初始密碼 admin。在“計(jì)算節(jié)點(diǎn)”-->“存儲(chǔ)”中配置 ISO 池(/home/data/kvm/iso)和 image 池(/home/data/kvm/image)。
共享目錄
通過設(shè)置共享目錄讓宿主機(jī)和虛擬機(jī)共享機(jī)械硬盤。編輯 KVM 虛擬機(jī)配置文件(也可以在 WebVirtCloud 中編輯 XML 配置):
virsh edit --domain 虛擬機(jī)名字
在<device>...</device>中添加以下代碼:
<filesystem type='mount' accessmode='mapped'>
<source dir='/home/data/kvm/hdd/omv'/> # 分配給該虛擬機(jī)的目錄在物理機(jī)中的路徑
<target dir='hdd'/> # 虛擬機(jī)中設(shè)備的名字,當(dāng)成硬盤掛載
</filesystem>
上面的代碼片段中,宿主機(jī)創(chuàng)建了 /home/data/kvm/hdd/omv 并將這個(gè)目錄映射到虛擬機(jī)的硬盤 omv,在虛擬機(jī)中當(dāng)成一般的硬盤掛載即可。在虛擬機(jī)中設(shè)置 /etc/fstab 實(shí)現(xiàn)開機(jī)自動(dòng)掛載。
hdd /mnt/omv 9p trans=virtio 0 0
重啟后發(fā)現(xiàn)系統(tǒng)無(wú)法掛載,這是因?yàn)?systemd unit 之間的依賴有問題。mnt-hdd.mount 依賴于 9pnet_virtio 模塊,這個(gè)模塊在 kmod 之后才會(huì)加載。所以修改 mnt-hdd.mount 文件,在Unit中添加Requires=kmod.service強(qiáng)制在 kmod 加載后才掛載 mnt-hdd。
安裝配置 Windows10
Windows10 默認(rèn)不支持 virtio,所以在 WebVirtCloud 中創(chuàng)建實(shí)例時(shí),不要勾選任何和 virtio 有關(guān)的東西。創(chuàng)建完成后,在實(shí)例的“設(shè)置”-->“磁盤”-->“實(shí)例卷”-->“編輯卷”(一個(gè)圖標(biāo))-->“高級(jí)”-->“總線”中將 virtio 修改為 SATA。
Debian10 默認(rèn)沒有安裝 acpi,導(dǎo)致 Windows10 無(wú)法相應(yīng) libvirt 的關(guān)機(jī)指令。關(guān)機(jī)時(shí)會(huì)出現(xiàn)libvirt-guests.sh: Waiting for guest OMV to shut down 的報(bào)錯(cuò),安裝 acpi 就可以解決。
apt install -y acpi acpid
Windows10 虛擬機(jī)在我的電腦上只有兩個(gè)核心,性能非常差。通過 host-passthrough 解決這個(gè)問題,詳細(xì)信息參考 Domain XML format,使用這個(gè)模式后虛擬機(jī)可以直接使用物理機(jī) CPU,但喪失了在不同平臺(tái)遷移的能力。
<cpu mode='host-passthrough' check='none'>
<topology sockets='1' cores='4' threads='1'/>
</cpu>
sockets 是 CPU 數(shù)量,cores 是核心數(shù),threads 是每個(gè)核的線程數(shù)。
安裝配置 OpenMediaVault
OpenMediaVault(簡(jiǎn)稱 OMV) 是基于 Debian 的 NAS 系統(tǒng),詳細(xì)信息可以參考韋易笑的知乎專欄文章OpenMediaVault:你的開源 NAS 系統(tǒng)。
參考本文上面介紹的掛載機(jī)械硬盤和共享目錄,在機(jī)械硬盤上創(chuàng)建一個(gè)目錄給 OMV。安裝好 OMV 后,服務(wù)的主要服務(wù)都跑在 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
安裝完畢后,進(jìn)入 OMV 的 Web 管理界面,在 OMV-Extras 中安裝 docker。
搭建應(yīng)用服務(wù)
到這里,我們就有了自己的 NAS 和私有云,可以方便的創(chuàng)建銷毀虛擬機(jī),還可以利用服務(wù)器(虛擬機(jī))搭建各種應(yīng)用。Github 上有一個(gè)項(xiàng)目 awesome-selfhosted 收集了各種可以在服務(wù)器上搭建的項(xiàng)目,知乎上也有不少回答很有價(jià)值。
calibre-web
搭建 calibre-web 個(gè)人圖書館。直接通過 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 來(lái)獲取電子書轉(zhuǎn)換功能。
wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin
電子書轉(zhuǎn)換器位置在 /opt/calibre/calibre-convert,在 web 中設(shè)置轉(zhuǎn)換器位置。
通過calibre-web-double實(shí)現(xiàn)從豆瓣下載元數(shù)據(jù)。將這個(gè)項(xiàng)目中的 NewDouban.py 拷貝到 /usr/local/lib/python3.7/dist-packages/calibreweb/cps/metadata_provider 并重啟 calibre-web 即可。
編寫 systemd 服務(wù)開啟自動(dòng)啟動(dòng)。
# /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
這是因?yàn)橹靼宀恢С诌@個(gè)功能,/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,然后執(zhí)行update-grub更新 grub。
總結(jié)
以上是生活随笔為你收集整理的搭建 KVM 虚拟化系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿卡丽星守皮肤(阿卡丽皮肤哪个有特效)
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?