CentOS 6、7 的 Xen4 Libvirt

Libvirt 及 Xen 的基礎

Xen 的主機操作系統稱為 Dom0。透過 Xen 來執行的虛擬操作系統(VM)稱為 DomU。

在預設情況下,libvirt 會在預設網絡卡(一般是 eth0)背後建立一個 192.168.122.0/24 的 NAT 網絡。

在這個 NAT 網絡上運行的 DomU VM 可以互相連線及通過 Dom0 的網絡向外連線,但你只能在 Dom0 上透過 libvirt(或 xen)連線到它們。你可以把預設的 NAT 網絡改為一個橋接式網絡,這樣你便能連線到 DomU VM,仿如它們與 Dom0 在同一個實體網絡上。有關橋接的討論收錄在下文(第 7 部份)。

先決條件

此頁假設你已經遵照Xen4QuickStart 指引安裝了一個 Xen 內核,而 xl info 這個指令作出類似的匯報:

[root@xentest1 ~]# xl info
host                   : immortal
release                : 3.10.56-11.el6.centos.alt.x86_64
version                : #1 SMP Thu Oct 9 14:57:01 CDT 2014
machine                : x86_64
nr_cpus                : 4
max_cpu_id             : 31
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 2533
hw_caps                : bfebfbff:2c100800:00000000:00003f00:029ee3ff:00000000:00000001:00000000
virt_caps              : hvm hvm_directio
total_memory           : 6141
free_memory            : 5030
sharing_freed_memory   : 0
sharing_used_memory    : 0
outstanding_claims     : 0
free_cpus              : 0
xen_major              : 4
xen_minor              : 4
xen_extra              : .1-4.el6
xen_version            : 4.4.1-4.el6
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64 
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          : Wed Oct 15 15:36:23 2014 +0100 git:9f49483-dirty
xen_commandline        : dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all com1=115200,8n1 console=com1,vga
cc_compiler            : gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11)
cc_compile_by          : mockbuild
cc_compile_domain      : centos.org
cc_compile_date        : Mon Dec 15 17:54:14 UTC 2014
xend_config_format     : 4

除非特別指定,所有指令均須由 root 用戶在 Dom0 機器上執行。

我習慣在最少安裝上加入數個套件,因為它們稍後也許會有用。請以此指令安裝它們:

yum install rsync wget vim-enhanced openssh-clients

安裝 libvirt(在 Dom0 機器上)

首先我們要安裝 libvirt 所需的基本套件:

CentOS 6 監督器:

yum install libvirt python-virtinst libvirt-daemon-xen

CentOS 7 監督器:

yum install libvirt libvirt-daemon-xen

安裝後,請重新啟動你的 Dom0 機器。

遠端存取 LibVirt

在多數情況,下我們不建議在 Dom0 伺服器上安裝整套圖像化系統,因此多數人會從遠端存取/控制 Dom0 libvirt。

你有 2 個可取的途徑 …… 其一是透過一台圖像化機器(例如一台 CentOS-6 工作站),其二是透過 ssh 應用 virsh 指令行程式。

透過 PolicyKit 控制 libvirt 的存取權

如果你想將一台 CentOS-6 工作站連線到 Dom0 上的 virt-manager 並控制該台電腦上的 DomU 虛擬機器,你便需要利用 PolicyKit。當你利用某台機器上的 virsh 終端機直接連線到 Dom0 及控制它的 DomU 虛擬機器時,PolicyKit 也會被應用。

PolicyKit 讓你設計有彈性、精細的存取權,功能遠超㙎本範例所介紹以 unix 群組授權存取 libvirt 的做法。

如要設計複雜的存取權,請參閱 polkit 的文檔

設定 libvirt 供群組存取

若要把存取權授予某個 unix 群組的成員,我們只須建立一個 PolicyKit 本地權限檔。

這是一個純文字檔,一般被放置於這個目錄中:

/etc/polkit-1/localauthority/50-local.d/

你可隨意為這個檔案命名,但它必須以兩個數目字起首及以 .pkla 結尾。例如:

/etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla

它的內容應包含:

[Remote libvirt SSH access]
Identity=unix-group:group_name
Action=org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

你應該以合適的群組名稱取替 group_name

舉個例說:你擁有一位名為 johnny 的 unix 用戶,而你希望建立一個名為 remote-libvirt 的群組來遠端存取 libvirt,並把 johnny 加進該群組內。

首先我們要透過 ssh 登入 Dom0 機器並取得 root 的身份。接著我們便執行以下指令來建立新的群組:

groupadd remote-libvirt 

然後我們可以用這個指令把用戶加進 remote-libvirt 這個群組內:

usermod -G remote-libvirt johnny

現在 johnny 這個 unix 用戶可以遠端控制 libvirt。

連線到遠端的 Dom0

從遠端機器透過 virt-manager 連線到 Dom0 機器

請登入你的圖像化桌面(它可以是台 CentOS-6 工作台或是一台用來管理數台非圖像化 Dom0 機器的圖像化伺服器),然後透過開啟一個終端機視窗及以 root 身份執行以下指令,確保 virt-manager 已被安裝:

yum install virt-manager

以普通用戶的身份開啟 virt-manager。你可利用 Applications => System Tools => Virtual Machine Manager 這條捷徑,或從終端機視窗輸入 virt-manager

在 virt-manager 應用程式內,開啟 File => Add Connection 選單項目,接著選取 Xen 作為監督器,選用 connect to a remote host,選取 SSH 作為方法,輸入你加進 remote-libvirt 群組內的用戶(在這個範例中是 johnny)作為用戶名稱,最後輸入 DomU 的主機名稱或 IP 位址(這我的範例中,我們會採用 192.168.0.5)…… 然後點擊 connect。

它會問 johnny 在 DomU 上的 ssh 用戶名稱 …… 輸入後,你便會看見它連線到主機及在 virt-manager 內看見一個 Domain-0 的圖示。

這個例子中的 URI 是:

xen+ssh://johnny@192.168.0.5

從遠端機器透過 virsh 連線到 Dom0 機器

你在 Dom0 上利用 virsh 控制 DomU 虛擬機器的做法有兩種。

第一種是純粹 ssh 到 Dom0 機器,然後成為 root 用戶及從指令行執行 virhs

第二種是採用上述例子的群組然後執行以下指令:

virsh -c xen+ssh://johnny@192.168.0.5

這種做法的好處就是我們無須把 Dom0 的 root 存取權發放給 johnny 用戶,他只須正常帳戶。他同樣能應用 virsh 的一切功能。

有關 virsh 的詳情,請參閱這份指南

建立 DomU 虛擬機器

如果你要安裝 CentOS 7 DomU 成為 paravirt 客端,請留意該虛擬機器的 /boot 不能採用 xfs —— 見 https://wiki.xen.org/wiki/PyGrub 。因此你必須利用 kickstart 檔或透過 vnc 進行安裝,以便能更改預設值。你可以在 extra-args 內加入這些選項。

利用 virt-manager 來安裝 DomU

現在你可以在 virt-manager 內選取新的主機名稱/IP 位址,然後按滑鼠右鍵並選取 New 或點擊 Create a new Virtual Machine 的圖示,接著按照提示來建立新的機器。

這個過程在遠端及本地連線下都相同 …… 唯一差別就是 Step 1 of 5 提示頁上的 Connection 對話方塊。

安裝新機器的過程與此指南很相似,唯獨在 Step 1 of 5 提示頁上的連線將會顯示你的遠端主機名稱(在我們的範例中是 192.168.0.5),而在 Step 5 of 5 提示頁的進階選項的 Virt Type 內,你會看見 xen(paravirt)xen(fullvirt) 而不是 KVM。

透過 SSH 利用 virt-install 來安裝 DomU

另一個進行遠端安裝的方法就是利用 ssh 連線到 Dom0 機器及成為 root 用戶,然後利用 virt-install 及終端機來人進行安裝。以下指令(以 root 身份在指令行執行)可以從遠端進行文字模式的安裝:

virt-install -d -n TestVM1 -r 2048 --vcpus=1 --disk /var/lib/libvirt/images/TestVM1.img,size=8 --nographics -p -l "http://192.168.0.10/centos/6.4/os/x86_64" --extra-args="text console=com1 utf8 console=hvc0"

在上述例子中,指令的含意包括:

-d — 偵錯模式,列印大量文字及完整的設定樣作偵錯之用

-n TestVM1 — 虛擬機器的名稱

-r 2048 — 記憶體大少(2048 MB,即 2 GB)

--vcpus=1 — 虛擬 CPU 的數量

--disk=/var/lib/libvirt/images/TestVM1.img,size=8 — 碟盤映像的位置及以 GB 計算的大少 …… 它可指向 LVM、等

--nographics — 由於我們的 Dom0 沒有安裝圖像介面,因此不要採用 VNC、等

-p — 採用半虛擬化

-l "http://192.168.0.10/centos/6.4/os/x86_64" — centos 目錄樹的位置,也可採用 http://mirror.centos.org/centos/6/os/x86_64/ 或其它鏡像。

--extra-args="text console=com1 utf8 console=hvc0" — 告訴 linux 利用 com1 和 xen 利用 hvc0,好讓你能透過終端機進行文字模式安裝

註:這類安裝採用終端機,因此局限於文字模式的安裝。上述(前一段)的 virt-manager 卻能同時支援圖像化安裝。

有關利用 virt-install 進行安裝的詳情請參閱此指南

控制 DomU 虛擬機器

透過 libvirt,你可利用圖像化應用程式(virt-manager)或文字應用程式(virsh)來控制 DomU 虛擬機器。

這些應用程式可以位於 DomU 虛擬機器所身處的 Dom0 上(本地控制),它們也可以位於不同的機器上並連線到 DomU(遠端控制)。

不論是透過遠端或本地連線,兩種工具的實際操作都是相同。

有關遠端 virt-manager遠端 virsh 的連線,請參閱這些指引。你必須設置 libvirt 才能用這兩個工具來進行遠端存取。

有關採用 virsh 這參閱此指南;有關採用 virt-manager 這參閱此指南

橋接範例設定

以下是另一個橋接範例設定:

你必須安裝 bridge-utils 才可設置橋接。你可以在 CentOS 下以這個指令進行安裝:

yum install bridge-utils

以下檔案位於 /etc/sysconfig/network-scripts/,它們必須被修改。

定義 br1 的最簡單範例

ifcfg-eth0

DEVICE=eth0
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Ethernet
BRIDGE="br1"
USERCTL=no

ifcfg-br1

DEVICE=br1
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
TYPE=Bridge
IPADDR=192.168.0.5
PREFIX=24
GATEWAY=192.168.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4
USERCTL=no

此處此處探討了其他橋接範例設定。另外,Google 亦是你的好幫手 :)

Translation of revision 24

zh-tw/HowTos/Xen/Xen4QuickStart/Xen4Libvirt (last edited 2017-03-16 21:00:05 by TimothyLee)