前文《KVM 虛擬化環境搭建 - ProxmoxVE》已經給大家介紹了開箱即用的 PVE 系統,PVE 是方便,但還是有幾點問題:

第一:始終是商用軟體,雖然可以免費用,但未來版本還免費么?商用的法律風險呢?

第二:黑箱化的系統,雖然基於 Debian ,但是深度改造,想搞點別的也不敢亂動。

第三:過分自動化,不能讓我操作底層 libvirt/qemu 的各項細節配置。

PVE 是傻瓜相機,智能又複雜,對小白很友好;WebVirtMgr 是機械相機,簡單而靈活。多一個選擇始終是好事,何況我們說完 PVE 之後還介紹 WebVirtMgr,那肯定是有它不可代替的優勢的。

不管你是在中小公司研究 IT 解決方案,還是搭建自己的 HomeLab,虛擬化是一個繞不過去的砍,現在的服務都不會直接啟動在物理機上,成熟的架構基本都是:

物理機->虛擬化->容器

這樣的三層架構,也就是說虛擬化是一切服務的基礎。通過下面的步驟,讓你擁有一套完全開源免費的,屬於你自己的,沒有任何版權和法律問題的虛擬化環境。

操作系統選擇

發行版選擇主要以 Debian/Ubuntu LTS Server 為主,二者我並無偏好,選擇你趁手的即可。Debian 每兩年一個大版本,Ubuntu LTS Server 也是每兩年一個大版本。也就是說每年都有一個最新的,他們的支持周期都是五年以上,去年發布的 Debian 9 ,今年是 Ubuntu 18.04 LTS,明年又是 Debian 10。

安裝依賴

新安裝操作系統以後,先安裝必備的包:

sudo apt-get install libvirt-daemon-system libvirt-clients
sudo apt-get install sasl2-bin libsasl2-modules bridge-utils

將 /etc/default/libvirtd 裡面的一行 libvirtd_opts 改為:

libvirtd_opts="-l"

修改 /etc/libvirt/libvirtd.conf,保證下列配置生效:

# 允許tcp監聽
listen_tcp = 1
listen_tls = 0

# 開放tcp埠
tcp_port = "16509"

# 監聽地址修改為 0.0.0.0,或者 127.0.0.1
listen_addr = "0.0.0.0"

# 配置tcp通過sasl認證
auth_tcp = sasl

修改 /etc/libvirt/qemu.conf,取消 "# vnc_listen = ..." 前面的 # 注釋(如有),變為:

vnc_listen = "0.0.0.0"

找到並把 user 和 group 兩個選項,取消注釋,改為 libvirt-qemu:

user = "libvirt-qemu"
group = "libvirt-qemu"

重啟並查看服務的狀態:

sudo service libvirtd restart
sudo service libvirtd status

到了這一步,依賴就準備好了。

創建管理用戶

ubuntu 18.04 LTS 需要修改一下:/etc/sasl2/libvirt.conf 文件,取消最後一行的注釋,變為:

sasldb_path: /etc/libvirt/passwd.db

並保證 mech_list 的值為 digest-md5 ,ubuntu 18.04 中默認為 gssapi 不能用:

mech_list: digest-md5

客戶端鏈接 libvirtd 需要用戶名和密碼,創建很簡單:

sudo saslpasswd2 -a libvirt virtadmin

可以查看創建了哪些用戶:

sudo sasldblistusers2 -f /etc/libvirt/passwd.db

繼續重啟服務:

sudo service libvirtd restart

測試用戶許可權:

virsh -c qemu+tcp://localhost/system list

使用 virsh 鏈接本地的 libvirtd 操作本地虛擬機,輸入剛才的用戶名和密碼檢查是否能夠順利執行,如果該命令成功則代表 libvirtd 的服務和許可權工作正常。

配置網橋

Debian 9 下面是更改 /etc/network/interfaces,注意設備名稱 eth0 需要改為實際的名稱:

# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 192.168.0.2
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 192.168.0.1
dns-search dell420
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Ubuntu 18.04 中,使用 /etc/netplan 配置網橋,卸載 cloud-init,禁用 cloud-init 配置:

sudo apt-get remove cloud-init
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.disable

並且新建文件:/etc/netplan/10-libvirtd-bridge.yaml:

network:
ethernets:
enp3s0f0:
dhcp4: false
dhcp6: false
bridges:
br0:
addresses:
- 192.168.1.8/24
gateway4: 192.168.1.1
nameservers:
addresses: [ 192.168.1.1, 114.114.114.114 ]
search: [ msnode ]
interfaces:
- enp3s0f0
version: 2

注意上面的設備名稱 enp3s0f0 以及 ip 網關等配置應按實際情況更改。

注意介面名字和 ip等,改為對應的內容,改完後:

sudo netplan apply

啟用新的網路配置,然後重啟網路看看網橋,是否正常:

sudo brctl show

並且查看網路是否正常。

安裝 WebVirtMgr

按照 WebVirtMgr 的官網首頁的說明

安裝依賴:

sudo apt-get install git python-pip python-libvirt python-libxml2 novnc supervisor nginx

克隆倉庫:

cd /var/www
sudo git clone git://github.com/retspen/webvirtmgr.git

安裝 Django 等 python 包:

cd webvirtmgr
sudo pip install -r requirements.txt
sudo ./manage.py syncdb
sudo ./manage.py collectstatic

按提示輸入 root 用戶密碼,該用戶後面將用來登陸 WebVirtMgr。

然後測試:

sudo ./manage.py runserver 0:8000

用瀏覽器打開 http://your-ip:8000 並用剛才的用戶登陸看看行不行,成功的話,會看到:

然後點擊右上角添加一個 connection,把 localhost 這個 libvirtd 的鏈接用 tcp 的方式添加進去,用戶名和密碼是剛才初始化的 libvirt 的管理員 admin 和密碼:

鏈接如果能夠正常添加的話,表明可以正常運行了:

然後 CTRL+C 退出。

安裝 Nginx

新建並編輯 /etc/nginx/sites-available/webvirtmgr 文件:

server {
listen 8080 default_server;
server_name $hostname;
location /static/ {
root /var/www/webvirtmgr/webvirtmgr; # or /srv instead of /var
expires max;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
client_max_body_size 1024M; # Set higher depending on your needs
}
}

然後做一個該文件的軟連接到 /etc/nginx/sites-enabled 下面,並刪除默認軟連接:

cd /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/webvirtmgr .
sudo rm default

然後重啟服務

sudo service nginx restart

完成安裝

新建並編輯 /etc/supervisor/conf.d/webvirtmgr.conf:

[program:webvirtmgr]
command=/usr/bin/python /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr.log
redirect_stderr=true
user=www-data
[program:webvirtmgr-console]
command=/usr/bin/python /var/www/webvirtmgr/console/webvirtmgr-console
directory=/var/www/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=www-data

把整個 webvirtmgr 的項目文件所有者改為 www-data:

sudo chown -R www-data:www-data /var/www/webvirtmgr

重啟並查看結果:

sudo supervisorctl reload
sudo supervisorctl status

如果碰到錯誤,比如 Exited too quickly 那麼到 /var/log/supervisor 下面查看日誌。

完成後,瀏覽器打開:http://your-ip:8080/servers/

如果一切工作正常,那麼恭喜你,WebVirtMgr 安裝成功。

開始使用

在 /home/data 下面創建 kvm 目錄,用於放虛擬機磁碟鏡像文件和 iso 文件

sudo mkdir -p /home/data/kvm
sudo mkdir -p /home/data/kvm/{images, iso}
sudo chown www-data:www-data /home/data/kvm/iso

你可以放在你喜歡的地方,/home 目錄一般在 debian 下面會分配比較大的空間,所以把虛擬機相關的東西,放到 /home/data/kvm 下面。

然後瀏覽器登陸 webvirtmgr 的頁面,選擇剛才添加的 localhost 鏈接,webvirtmgr 可以同時管理多台機器的 libvirtd,這裡我們以剛才添加的 localhost 鏈接為例。

首先到左側的 「存儲池」添加用於保存虛擬機映像的路徑:

先點擊 "New Storage" 添加一個類型為 「目錄卷類型」的存儲池,名字為 images,指向:

/home/data/kvm/images

繼續點「New Storage」添加一個類型為 「ISO 鏡像卷」的存儲池,名字為 iso ,路徑為:

/home/data/kvm/iso

你如果有多塊硬碟,還可以繼續添加一些其他位置用於保存虛擬機的磁碟鏡像。

還差網路配置就妥了,點擊左邊 「網路池」:

原來只有一個 default 的 NAT 類型網路,那個 bridge 是我們需要點擊 "New Network" 添加的橋接網路:

上面這個橋接名稱,就是我們前面配置的網橋名稱 br0。我們啟動的虛擬機一般都會希望和物理機同處於一個內網下,擁有可以直接訪問的 IP,因此基本都用橋接模式。

創建虛擬機

先創建磁碟映像,到左邊的 「存儲池」,然後選擇 images 存儲池:

點擊最下面的添加鏡像,添加一個 20G 的 qcow2,名字為 test1:

然後點擊左邊的 「虛機實例」,然後點擊左上角的 「New Instance」:

不要使用它那些亂七八糟的模板,直接點擊正上方的 「Custom Instance」,創建虛擬機:

在創建虛擬機的對話框里,點擊「Add Image」添加剛才創建的 test1.img 鏡像,然後再 "Add network" 添加類型為 bridge 的橋接網路,你如果想要所有虛擬機都處於一個虛擬內網的話,還可以再添加一塊類型為 default 的網卡,就是默認的 NAT 類型。

完成後點 「創建」,咱們的虛擬機就有了:

這時候,可以到現前的 「存儲池」的 iso 下面,上傳兩個操作系統的安裝盤 iso 文件,然後回來這個 test1 虛擬機主頁,選擇設置,掛載 iso 文件:

選擇我們剛才上傳的操作系統 ISO 文件,並點擊右邊的「鏈接」按鈕,然後可以到「Power」那裡使用 「啟動」按鈕開機了,此時虛擬機出於「開機」狀態:

然後選擇 Access :

點擊 「控制台」,打開虛擬機的 webvnc 終端,開始安裝操作系統:

網頁版本的 Webvnc 圖形性能一般,建議安裝操作系統都用普通文本模式安裝(可以選擇的話),測試虛擬機可以正常啟動以後,我們先把它強制結束了,進行一些必要設置。

安全設置

如果的伺服器暴露再公網上,一定要到 Access -> Console Password 下面設置個密碼:

webvirtmgr 里點擊控制台它會自動讀取該密碼,不需要你手工輸入,但是這樣就比沒有密碼安全很多了。

然後啟動後,你可以到:設置->XML 那裡查看一下 VNC 被分配的埠號和設置過的密碼:

由於默認配置 VNC 都是使用 「自動埠」,這樣更安全些,每次虛擬機啟動,都會動態分配一個,再 XML 這裡可以查看得到,這樣你也可以不用 webvnc,而用自己的 VNC 客戶端:

比如 Windows 下的 vnc-viewer,填入 ip 地址和埠號,然後點 "connect":

提示輸入密碼,將上面 XML 里的密碼複製粘貼過來即可:

然後點擊 OK 開始顯示終端屏幕:

共享文件夾

這是個很基本的需求,想省事的話,nfs 共享一下也可以,但是 KVM 本身支持 Hypervisor 和虛擬機共享文件夾的,並且性能很好,可惜 PVE 里居然做不了,因為它不能改 XML。

再 「設置」-> XML 那裡點擊 「編輯」並在 <devices>... </devices> 中加入下面配置:

<filesystem type=mount accessmode=mapped>
<source dir=/home/data/kvm/kfs/>
<target dir=kfs/>
</filesystem>

accessmode 可以設置成:mapped,passthrough 或 none。物理機準備一下共享目錄:

sudo mkdir /home/data/kvm/kfs
sudo chown libvirt-qemu:libvirt-qemu /home/data/kvm/kfs

所有虛擬機在物理機上都會以 libvirt-qemu 這個用戶來跑(前面設置過 qemu.conf),所以需要保證你物理機上需要共享的路徑的許可權。同時 accessmode 建議設置成 mapped,這樣會用文件信息里的 meta info 來保存虛擬機中的文件許可權信息。

虛擬機中編輯 /etc/modules 文件,添加下面幾行:

loop
virtio
9p
9pnet
9pnet_virtio

載入內核模塊:

sudo service kmod start

然後測試 mount:

sudo /mnt/kfs
sudo mount -t 9p -o trans=virtio kfs /mnt/kfs

這樣,虛擬機中的 /mnt/kfs 就映射到了物理機的 /home/data/kvm/kfs 路徑下。

測試成功的話,設置 /etc/fstab:

kfs /mnt/kfs 9p trans=virtio 0 0

修改完後,mount -a 測試,測試通過重啟虛擬機即可。

後記

可能大家發現了 WebVirtMgr 本質就是一個輕量級的 web 管理後台,可以在一台機器上搭建 webvirtmgr 並管理內網所有的提供 libvirtd 服務的機器。

由於 webvirtmgr 項目本身簡單清晰,不少成功項目的代碼都是源自它的,比如 QNAP 產品線里的 「虛擬機工作站」,通過前面一番動手,相信你對 kvm/libvirtd/vnc 之類的運作機里已經很熟悉了。

該系統設計的比較好的一個點就是允許我編輯 XML,而前面提到的 PVE 居然不允許我在頁面上修改 XML,KVM支持的功能非常豐富,很多都需要通過修改 XML 完成,比如常用的硬體透傳,大家可以搜索 "kvm passthrough":該功能可以把 pcie 匯流排上的設備傳遞給虛擬機,比如你的物理機上有兩個 USB 插口,你可以將其中一個賦予虛擬機。或者把物理機的磁碟陣列全部傳遞給虛擬機,由虛擬機裡面來組 raid,這樣虛擬機裡面裝點黑群暉或者 clearos / openmediavault 之類的 nas 系統的話,可以方便的把磁碟陣列管理起來。

如果物理機有顯卡的話,你甚至可以把物理機的 gpu 透傳給虛擬機,這樣虛擬機裡面就可以跑需要 GPU 支持的任務了,比如挖礦之類,這些在 PVE 里都沒法支持,這些都是 webvirtmgr 比 PVE 更靈活的地方。

更多的功能,留給大家慢慢探索吧。


推薦閱讀:
查看原文 >>
相关文章