前文《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
修改 /etc/libvirt/libvirtd.conf,保證下列配置生效:
# 允許tcp監聽
修改 /etc/libvirt/qemu.conf,取消 "# vnc_listen = ..." 前面的 # 注釋(如有),變為:
vnc_listen
找到并把 user 和 group 兩個選項,取消注釋,改為 libvirt-qemu:
user
重新開機并檢視服務的狀态:
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 ,預設的 gssapi 不能用:
mech_list: digest-md5
(注意:如果是 Debian 10,那麼單機請使用 unix socket,digest-md5 方式被廢除掉了,下面的驗證方式可以跳過直接把 www-data 使用者加入 libvirt 使用者組即可)。
用戶端連結 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
注意上面的裝置名稱 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
然後做一個該檔案的軟連接配接到 /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]
把整個 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 檔案
{images, 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
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:
trans
這樣,虛拟機中的 /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 更靈活的地方。
更多的功能,留給大家慢慢探索吧。