xen 动态迁移

前提是两台机器共享存储设备,比如 NFS。
/etc/xen/xend-config.sxp 文件需要修改的指令,不解释,直接看上面的注释,注意,两台机器的配置需要一模一样:
(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address ”)
(xend-relocation-hosts-allow ”)

重启:
# /etc/init.d/xend restart

修改 exports 文件:
/data/xen/web_1    192.168.1.0/24(rw,no_root_squash)

启动 nfs:
# /etc/init.d/portmap start
# /etc/init.d/nfs start

注意防火墙,开始迁移:
# xm migrate id 192.168.1.220 -l

ref:
http://www.virtuatopia.com/index.php/Migrating_Xen_domainU_Guests_Between_Host_Systems

domU hung

连接 server-1 这个 domU,出现如下的 error:
# xm console server-1
[31687848.523700] INFO: task jbd2/xvda1-8:175 blocked for more than 120 seconds.
[31687848.523720] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[31687848.523932] INFO: task flush-202:0:666 blocked for more than 120 seconds.
[31687848.523945] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[31687848.524276] INFO: task nagios:15635 blocked for more than 120 seconds.
[31687848.524288] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[31687848.524424] INFO: task nagios:23634 blocked for more than 120 seconds.
[31687848.524435] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
...

描述的情况跟这个这篇博客作者描述的基本一致,除了机器型号不同之外。

应该是在比较高的 I/O 延时时才会出现,lucid 的一个 bug

只是单纯的关闭 hung_task_timeout_secs 并没有啥作用,这里提供了一种可行的方式,降低 dirty_ratio 的值。

xen 挂载磁盘的另一种方式

先前记录过一篇如何挂在磁盘的方式,但是比较麻烦,要自己计算偏移等。通过 kpartx 工具可以很快的实现挂载:
# apt-get install kpartx

將磁盘 map 到 /dev/ 下面的设备中:
# kpartx -av ubuntu_10.04.3_x86_64.img
add map loop0p1 : 0 19980288 linear /dev/loop0 2048
add map loop0p5 : 0 985088 linear /dev/loop0 19984384

mount 一下设备:
# mount /dev/mapper/loop0p1 /mnt

卸载:
# umount /mnt
# kpartx -d ubuntu_10.04.3_x86_64.img

 

挂载 Xen 的镜像文件

由于 domU 跟 dom0 的 IP 产生了冲突,导致一开虚拟机就会出现假死的情况,后来考虑能不能像 ISO 文件一样先挂载到某个目录,对其网络参数进行直接修改,发现可以通过 mount 的 offset 完成。

通过下面可以看到,由于该镜像有多于一个的分区,导致其不可以直接以 ISO 文件的方式进行挂载:
# ls
initrd.gz  ubuntu_10.04.3_x86_64.img  ubuntu_xen  vmlinuz
# mount -o loop ubuntu_10.04.3_x86_64.img  /mnt/
mount: you must specify the filesystem type
Continue reading

为 domU 添加新存储

为 domU 增加一个数据区,100G:
# dd if=/dev/zero of=data.img bs=1M seek=100000 count=1

修改对应的 cfg 文件:

disk=[….

    "tap:aio:data.img,xvdb1,w"]

写入 fstab。

启动,格式化,fsck.ext4 时出现如下错误

fsck 1.41.4 (27-Jan-2009)
e2fsck 1.41.4 (27-Jan-2009)
fsck.ext4: Group descriptors look bad… trying backup blocks…
fsck.ext4: Bad magic number in super-block while trying to open /dev/xvdb1

The superblock could not be read or does not describe a correct ext4
filesystem.  If the device is valid and it really contains an ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:

解决方法:
# mke4fs -j -O dir_index data.img

 

Error: Device xxxx (vbd) could not be connected

Error: Device 51712 (vbd) could not be connected. Failed to find an unused loop device
或者这个:
Error: Device 51712 (vbd) could not be connected. losetup /dev/loop8 /vm/suse_100.img failed

出现错误的原因很明显,由 loop 设备不足造成的。Linux 下默认只有 0-7 个 loop 设备。

通过修改 modprobe.conf 文件来增加默认的 loop:

# vi /etc/modprobe.conf
options loop max_loop=64

重启或者停用所有的 DomU 之后先卸载(rmmod) loop 模块再加载(modprobe)。
上面的 64 可以改为适用于你系统的值。

除了通过增加 loop 设备解决问题之外,还可以使用下面的方式。

半虚拟化的 DomU 可以通过 blktp 驱动器来直接访问虚拟的 block 驱动,而不必通过 loop 设备。为了实现这样的方式,需要在定义 disk 指令时将其指定为 tap:aio 用以代替 file。上面的方式不适用于全虚拟化。当然不管是半虚拟化还是全虚拟化,都可以使用物理设备分区,也就是 /dev/sdxx 等,而不是通过 dd 来生成一个文件,这个可以通过 phy 来实现。
对于半虚拟化来说,建议使用 phy 或者 tap:aio;而对于全虚拟化来说,可以使用 phy 或者 file。这里是这二者的区别。

参考:

http://www.centos.org/docs/5/html/Virtualization-en-US/ch-virt-loop-device-errors.html