这篇文章简短地解释如何将一个原生的 CentOS-4 安装移进一个半虚拟化的 Xen3 客端内。该 Xen3 主机可以是任何操作系统 —— 甚至乎 NetBSD —— 但这份教学文件假设它是 Red Hat 化的 linux 如 RHEL5、CentOS-5 或 FC6。
Contents
声明
这份教学文件属实验性质并且未经充份测试,它只适合我用。因此如果它毁坏了你的系统,请不要责怪它,但你可电邮给我: 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:请取得一个供 RHEL4 或 CentOS4 用的试验性 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:请将某些函式库改为来自 Xensource 的 Xen 友善版本。请找出你安装了哪些函式库及它们的类型
[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:
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 内核去吻合的:
x86_32: 32 位元、非 PAE
x86_32p: 32 位元、PAE
x86_64: 64 位元
请查阅 Dom0 在 /sys/hypervisor/properties/capabilities 里的首个数值(xen-3.0-*)来找出你的监督器/Dom0 组合。你从 Fedora/RH/CentOS 所取得的 32 位元 监督器及内核拥有 PAE,而那些来自 Cambridge 或 XenSource 并不拥有 PAE。(肯定吗?请复核!)
内核与开机程序
采用 PyGrub 的优点就是内核、可装内核模块 及 initrd 都完全包含在 DomU 之内。内核升级时你只需在 DomU 内执行 rpm -i 或 yum 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 的工作(请参阅下文,「方块设备」),你应该考虑创建一个以静态连结、内置了 xenblk 及 xennet的内核:它没有 initrd、没有可装的模块,而且所有 DomU 的内核都可以放在同一个地方。
函式库
(有待撰写)
方块设备
由于方块设备多数是分层的,你有很多途径可以将它们对照到 DomU 内。假设有两个硬盘(hda、hdc)、其中两个分区合成一个 Raid1(hda3+hdc4=md0),其上的 LVM 逻辑磁盘区(VolGroup00-C4)内藏有 DomU 的主目录。
- 对照硬盘 —— DomU 处理所有层次:
disk = [ 'phy:hda,sda,w', 'phy:hdc,sdb,w' ]
- 对照分区 —— Dom0 处理分区表,DomU 处理 RAID 及 LVM:
disk = [ 'phy:hda3,sda1,w', 'phy:hdc4,sdb1,w' ]
- 对照碟磁数组 —— Dom0 处理碟磁数组,DomU 处理 LVM:
disk = [ 'phy:md0,sda1,w' ]
- 对照 LVM 逻辑磁盘区 —— DomU 处理所有层次:
disk = [ 'phy:mapper/VolGroup00-C4,sda1,w' ]
我首选后者,由 Domain-0 处理所有 GNBD/LVM/Raid/DM 的工作。请留意被对照到 DomU 的方块设备不能被其它本地所应用!
网络
假若你不喜欢 xend 修改你的 Dom0 网络设置,请编辑 Dom0 的 /etc/xen/xend-config.sxp,最主要的选项是 network-script 和 vif-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
文档路线图
- /dev/xvc0
- 测试、测试、测试
- 半虚拟化对比全虚拟模式
- 检查不同内核/监督器的组合
- 测试 SElinux 是否真的可用
- NPTL/TLS/glibc/db4 上的高级事项
- X
Translation of revision 12