天天看點

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

前文《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 并用剛才的使用者登陸看看行不行,成功的話,會看到:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

然後點選右上角添加一個 connection,把 localhost 這個 libvirtd 的連結用 tcp 的方式添加進去,使用者名和密碼是剛才初始化的 libvirt 的管理者 admin 和密碼:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

連結如果能夠正常添加的話,表明可以正常運作了:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

然後 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 連結為例。

首先到左側的 “存儲池”添加用于儲存虛拟機映像的路徑:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

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

/home/data/kvm/images
           

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

/home/data/kvm/iso
           

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

還差網絡配置就妥了,點選左邊 “網絡池”:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

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

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

上面這個橋接名稱,就是我們前面配置的網橋名稱 br0。我們啟動的虛拟機一般都會希望和實體機同處于一個内網下,擁有可以直接通路的 IP,是以基本都用橋接模式。

建立虛拟機

先建立磁盤映像,到左邊的 “存儲池”,然後選擇 images 存儲池:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

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

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

然後點選左邊的 “虛機執行個體”,然後點選左上角的 “New Instance”:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

不要使用它那些亂七八糟的模闆,直接點選正上方的 “Custom Instance”,建立虛拟機:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

在建立虛拟機的對話框裡,點選“Add Image”添加剛才建立的 test1.img 鏡像,然後再 "Add network" 添加類型為 bridge 的橋接網絡,你如果想要所有虛拟機都處于一個虛拟内網的話,還可以再添加一塊類型為 default 的網卡,就是預設的 NAT 類型。

完成後點 “建立”,咱們的虛拟機就有了:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

這時候,可以到現前的 “存儲池”的 iso 下面,上傳兩個作業系統的安裝盤 iso 檔案,然後回來這個 test1 虛拟機首頁,選擇設定,挂載 iso 檔案:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

選擇我們剛才上傳的作業系統 ISO 檔案,并點選右邊的“連結”按鈕,然後可以到“Power”那裡使用 “啟動”按鈕開機了,此時虛拟機出于“開機”狀态:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

然後選擇 Access :

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

點選 “控制台”,打開虛拟機的 webvnc 終端,開始安裝作業系統:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

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

安全設定

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

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

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

然後啟動後,你可以到:設定->XML 那裡檢視一下 VNC 被配置設定的端口号和設定過的密碼:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

由于預設配置 VNC 都是使用 “自動端口”,這樣更安全些,每次虛拟機啟動,都會動态配置設定一個,再 XML 這裡可以檢視得到,這樣你也可以不用 webvnc,而用自己的 VNC 用戶端:

比如 Windows 下的 vnc-viewer,填入 ip 位址和端口号,然後點 "connect":

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

提示輸入密碼,将上面 XML 裡的密碼複制粘貼過來即可:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr

然後點選 OK 開始顯示終端螢幕:

kvm虛拟化_KVM 虛拟化環境搭建 - WebVirtMgr
共享檔案夾

這是個很基本的需求,想省事的話,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 更靈活的地方。

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