這篇文章簡短地解釋如何將一個原生的 CentOS-4 安裝移進一個半虛擬化的 Xen3 客端內。該 Xen3 主機可以是任何操作系統 —— 甚至乎 NetBSD —— 但這份教學文件假設它是 Red Hat 化的 linux 如 RHEL5、CentOS-5 或 FC6。

聲明

這份教學文件屬實驗性質並且未經充份測試,它只適合我用。因此如果它損毀了你的系統,請不要責怪它,但你可電郵給我: centos-mail at nils dot toedtmann dot net。

網絡設置、NFS 主目錄或 X 都超出這篇文章的範圍,請你自己查閱說明書:

遷移

做好準備

假若 CentOS-4.5 已被發行:請升級!

CentOS-4.4 其實並不適合成為一台 DomU。因此當你在閱讀這篇文章時知道 CentOS-4.5 已經被發行,請將你的 CentOS-4 升級。你將會發現,這樣可以簡化整件事。

Domain-0

請在你預備將 CentOS-4 虛擬化的硬件上安裝一台建基於 RH 的 Domain-0 操作系統(包含虛擬化軟件群組的 FC6/RHEL5/CentOS-5)。請啟動該 Dom0 並確定 xend 這個服務正在運行中。

Domain-U 定位

方塊裝置的對照

讓我們假設你的 CentOS-4 安裝名為 C4 並已安裝在一個名為 /dev/mapper/VolGroup00-C4 般的方塊裝置上。你須要修改 C4 的目錄樹,因此請將它掛載在某處:

[root@dom0 ~]# mount /dev/mapper/VolGroup00-C4 /mnt
[root@dom0 ~]# mount /dev/whatever             /mnt/whereever
[root@dom0 ~]# mount -o bind /proc             /mnt/proc
[root@dom0 ~]# mount -o sys  /sys              /mnt/sys

如果你的 C4 擁有一個獨立的 /boot 分割區,你可不必理會並直接採用空置的 /boot 目錄(你甚至可以移除所有內核及 grbu 的 rpm 套件)。如果你計劃同時以原生的 C4 及虛擬化的 C4 雙重開機,請保留它,否則你可以違棄它。如果你不肯定的話,請複製它的內容:

[root@dom0 ~]# mount  /dev/hda1 /mnt2
[root@dom0 ~]# cp -a  /mnt2/* /mnt/boot
[root@dom0 ~]# umount /mnt2

請將你的(舊)原生 C4 方塊裝置對照到(新的)虛擬 SCSI 裝置。例如:

mount point

native

virtual

/boot

/dev/hda1

obsolete

/

/dev/mapper/VolGroup00-C4

/dev/sda1

swap

/dev/mapper/VolGroup00-C4_swap

/dev/sda2

/whereever

/dev/whatever

/dev/sda3

請在 C4 的檔案系統表 /mnt/etc/fstab 內作出相應的改動:

...
#obsolete   /boot       ext3    defaults   1 1
/dev/sda1   /           ext3    defaults   1 1
/dev/sda2   swap        swap    defaults   0 0
/dev/sda3   /whereever  ext3    defaults   1 1
...

DomU 內核

請閱讀下面關於內核的備註!

只適合 CentOS-4.5:應該很簡單

[root@dom0 ~]# chroot /mnt yum install kernel-xenU

只適合 CentOS-4.4:請取得一個供 RHEL4CentOS4 用的試驗性 DomU 內核,例如:

[root@dom0 ~]# wget -P /mnt/tmp/ \
 http://people.redhat.com/~jbaron/rhel4/RPMS.kernel/kernel-xenU-2.6.9-44.EL.i686.rpm
[root@dom0 ~]# chroot /mnt rpm -ivh /tmp/kernel-xenU-2.6.9-44.EL.i686.rpm

無論如何,你應該產生一個開機用的 ramdisk —— rpm 在安裝時頃向會遺漏 xenblk.ko

[root@dom0 ~]# chroot /mnt mkinitrd --preload xenblk \
               /boot/myinitrd-2.6.9-44.ELxenU.img 2.6.9-44.ELxenU

開機程式

那個類似 grub 的 PyGrub 開機程式將會駐在 DomU 以外,它附屬於 Dom0 的 Xen3 發行。它會讀取 DomU 的 /mnt/boot/grub/menu.lst,因此請根據已安裝的 DomU 內核來建立它(如果 /mnt/boot 是空置的話,請執行 mkdir -p /mnt/boot/grub):

default         0
timeout         3
title           CentOS 4 (2.6.9-44.ELxenU)
  kernel        /boot/vmlinuz-2.6.9-44.ELxenU root=/dev/sda1 ro 3
  initrd        /boot/myinitrd-2.6.9-44.ELxenU.img

glibc

只適合 i386/x86_32 上的 CentOS-4.4:請將某些函式庫改為來自 XensourceXen 友善版本。請找出你安裝了哪些函式庫及它們的類型

[root@dom0 ~]# chroot /mnt rpm -q --qf "%{name} %{arch}\n" \
  glibc{{,-debuginfo}{,-common},-devel,-headers,-profile,-utils} nptl-devel nscd

然後取替它們。例如

[root@dom0 ~]# wget -P /mnt/tmp/ \
http://xenbits2.xensource.com/glibcs/rhel44/RPMS/i686/glibc-2.3.4-2.25.xs0.4.3.56.i686.rpm
[root@dom0 ~]# wget -P /mnt/tmp/ \
http://xenbits2.xensource.com/glibcs/rhel44/RPMS/i386/glibc-common-2.3.4-2.25.xs0.4.3.56.i386.rpm 
 ...
[root@dom0 ~]# chroot /mnt rpm -Fvh /tmp/*rpm

警告:很不幸的,Xensource 並不提供一個 Yum 軟件庫。因此假若 CentOS 提供了 glibc 的更新,執行 yum update 將會蓋掉對 Xen 友善的版本,導致系統減慢。某些軟件(如 OpenLDAP、Cyrus-IMAPd)更可能無法運作!

控制台

可能只適用於 CentOS-4.4)Xen-Console 可以在 DomU 的 /dev/console 上運作,因此你在 /mnt/etc/inittab 應該為它開一個 getty:

...
# 在標準執行級別下運行 getty
0:2345:respawn:/sbin/mingetty --noclear console
1:2345:respawn:/sbin/mingetty tty1
...

網絡

DomU 的 ethX 所用的驅動程式是 xennet.ko,因此請在 DomU 的 /mnt/etc/modprobe.conf 內作出相應調整:

alias eth0 xennet

可能只適用於 CentOS-4.4)某些 DomU 內核(例如以上的試驗性版本)的 xennet 驅動程式內含有錯誤,並將 TCP 及 UDP 的檢查碼計算錯。你可以透過在 ethX 裝置上停用 TX 檢查碼來避免碰上這個問題。請建立一個可執行的腳本 /mnt/sbin/ifup-local

#!/bin/sh
ethtool -K ${1} tx off

最後

你可以 chroot 到你的 C4 中並做一些個人化的設定(譬如在 /etc/sysconfig/network{,-scripts/ifcfg-eth*} 內設置網絡):

[root@dom0 ~]# chroot /mnt
$ ……在這裡做些有趣的事情……
$ exit
[root@dom0 ~]#

當你完成後,請將你的 C4 卸下:

[root@dom0 ~]# umount /mnt/{sys,proc,whereever,} 

啟動它!

請建立 Xen 設定檔 /etc/xen/C4

name       = 'C4'
bootloader = '/usr/bin/pygrub'
memory     = 128
vif        = [ '' ]
disk       = [ 'phy:mapper/VolGroup00-C4,sda1,w',
               'phy:mapper/VolGroup00-C4_swap,sda2,w',
               'phy:whatever,sda3,w' ]

然後啟動它:

[root@dom0 ~]# xm create -c C4

如果你的 DomU 採用 SELinux,你須要還原自從上次(原生)啟動以來被替代或建立的檔案的脈絡:

[root@C4 ~]# setenforce 0
[root@C4 ~]# restorecon -v -R /etc
[root@C4 ~]# restorecon -v -R /boot
[root@C4 ~]# restorecon -v /sbin/ifup-local
[root@C4 ~]# fixfiles -R kernel-xenU,glibc,glibc-common,... relabel
[root@C4 ~]# reboot

如果你記不起哪些檔案的脈絡不完整,你可以讓 CentOS 重新標籤整個檔案系統:

[root@C4 ~]# touch /.autorelabel
[root@C4 ~]# reboot

備註

內核與監督器

你的半虛擬化 DomU 內核必須具有能力在 Xen3 監督器上運行。Xen3 的監督器的 ABI 其實仍未穩定,但自從 Xen-3.0.2 起提供了一個多數監督器及內核都認知的向後兼容模式。然而有三種互不兼容的監督器類型,須要由半虛擬化的 DomU 內核去吻合的:

請查閱 Dom0 在 /sys/hypervisor/properties/capabilities 裡的首個數值(xen-3.0-*)來找出你的監督器/Dom0 組合。你從 Fedora/RH/CentOS 所取得的 32 位元 監督器及內核擁有 PAE,而那些來自 CambridgeXenSource不擁有 PAE。(肯定嗎?請覆核!)

內核與開機程式

採用 PyGrub 的優點就是內核、可載入內核模塊 及 initrd 都完全包含在 DomU 之內。內核升級時你只需在 DomU 內執行 rpm -iyum update(CentOS-4.5)。

如果你想將選擇內核的控制權移交給 Dom0,請將內核及 initrd 複製到 Dom0

[root@dom0 ~]# cp /mnt/boot/vmlinuz-2.6.9-44.ELxenU       /boot
[root@dom0 ~]# cp /mnt/boot/myinitrd-2.6.9-44.ELxenU.img  /boot

然後將 Xen 設定檔 /etc/xen/C4 內的 bootloader 選項更改為

kernel  = "/boot/vmlinuz-2.6.9-44.ELxenU"
root    = "/dev/sda1 ro"
extra   = "3"
ramdisk = "/boot/myinitrd-2.6.9-44.ELxenU.img"

然而將內核及 initrd 放置在 Dom0,但將可載入內核模塊放置在 DomU 內對升級並不友善。

如果你執行一堆需要相同內核功能的輕型「程式用」DomU,而且 Dom0 處理所有 GNBD/RAID/LVM/DM 的工作(請參閱下文,「方塊裝置」),你應該考慮建立一個以靜態連結、內置了 xenblkxennet的內核:它沒有 initrd、沒有可載入的模塊,而且所有 DomU 的內核都可以放在同一個地方。

函式庫

(有待撰寫)

方塊裝置

由於方塊裝置多數是分層的,你有很多途徑可以將它們對照到 DomU 內。假設有兩個硬盤(hda、hdc)、其中兩個分割區合成一個 Raid1(hda3+hdc4=md0),其上的 LVM 邏輯磁碟區(VolGroup00-C4)內藏有 DomU 的主目錄。

disk = [ 'phy:hda,sda,w', 'phy:hdc,sdb,w' ]

disk = [ 'phy:hda3,sda1,w', 'phy:hdc4,sdb1,w' ]

disk = [ 'phy:md0,sda1,w' ]

disk = [ 'phy:mapper/VolGroup00-C4,sda1,w' ]

我首選後者,由 Domain-0 處理所有 GNBD/LVM/Raid/DM 的工作。請留意被對照到 DomU 的方塊裝置無法被其它區域所應用!

網絡

假若你不喜歡 xend 修改你的 Dom0 網絡設定,請編輯 Dom0 的 /etc/xen/xend-config.sxp,最主要的選項是 network-scriptvif-script

我較喜歡透過 /etc/sysconfig/network-scripts/brX 自行設置橋接器,並調整 /etc/xen/xend-config.sxp 來採用「路由橋接器」的混合模式:

(network-script network-route)
(vif-script vif-bridge)

接著放入

vif = [ 'bridge=brX' ]

於 xen 的 DomU 設定檔內。於是客端便經由橋接器集合起來,而 Dom0 為這些橋接器選路到外界。

X

你有數個選擇:

X 轉接

你可以透過 SSH 的 X 轉接來執行 X 應用程式:

[alice@client ~]# ssh -X domU-hostname xterm

如果這樣已能滿足你的需要,X 或顯示管理員便無須在 DomU 上運行。

虛擬幀緩衝器

(有待撰寫)

GDM + VNC

(有待撰寫)

GDM + RDP

(有待撰寫)

GDM + 遠端 X

(有待撰寫)

Xvnc

假設 DomU 的用戶 alice 想執行一個 Xvnc 伺服器。她應該為自己設定一個 VNC 密碼

[alice@domU ~]# vncpasswd

DomU 的管理員在 /etc/sysconfig/vncservers 內設定該 VNC 伺服器

VNCSERVERS="1:alice"
VNCSERVERARGS[1]="-geometry 800x600"

然後啟動它

[root@domU ~]# /etc/init.d/vncserver restart

現在 Alice 可以從外界連線到她的 VNC 伺服器:

[alice@client ~]# vncviewer domU-hostname:5901

文檔路線圖

Translation of revision 12

zh-tw/HowTos/Xen/MoveNative2DomU (last edited 2010-04-09 08:08:49 by TimothyLee)