物理服务器迁移至虚拟机

2009年7月23日 23:03

        这几天一直在做一件事,要把众多的物理服务器,迁移至虚拟机中。这样做的目的是用来备份当前系统,当物理服务器的系统发生故障时,可以使用虚拟机中的备份系统,快速的恢复应用。而且,也可以为以后服务器的完全虚拟化做些铺垫。

        闲话少叙,来讲讲我几天实践的经验 :)


        实验前提:

                          物理服务器:OS:   RedFlag   2.4.21-9.30AXsmp   i686

                       

#cat /etc/fstab
LABEL=/      /      ext3   defaults    1 1
LABEL=/boot  /boot  ext2   defaults    1 2
LABEL=/opt   /opt   ext3   defaults    1 2
/dev/sda3    swap   swap   defaults    0 0

 

# df -h
/dev/sda2              14G  2.5G   11G  19% /
/dev/sda1              99M   13M   82M  14% /boot
/dev/sda5             252G  774M  238G   1% /opt

                              虚拟机:VMware GSX Server for linux 3.0

                              宿主OS:CentOS (系统无关紧要)

        所用工具:sysrescuecd,同版本RedFlag的恢复光盘


        一,备份物理服务器中的分区

                话说备份有很多种方式,我只是粗浅知道个大概,就不举例了,等有机会再说。

                这里我使用的工具是fsarchiver(需翻墙)。之所以用它,是因为:

                         1,它备份的是分区上实际使用的文件,而并不是整个分区。而且备份时可以选择压缩级别,大大节省了迁移后在虚拟机中使用的磁盘空间。

                         2,可以识别众多文件系统。(与上面的理由冲突么?)

                         3,可对备份恢复内容进行校验。

                         4,命令简单 :)

                         5,还原时可改变原物理服务器中的文件系统,例如ext3-->reiserfs。

                         6,可把多个文件系统备份到一个文件中去。哇哦

                  此工具包含在sysrescuecd中。用sysrescuecd启动物理服务器自不必多说,要注意的是,在备份过程中,备份的内容是不应该发生改变的!因此,对要备份的分区应该umount,或者mount read-only。

                  fsarchiver其实可以对mount的分区进行备份,但官方并不推荐,应该是还不稳定。如果真能实现,那就太cool了。

 

挂载/opt分区,此次实验中不备份/opt分区,用它只是来存储备份文件。

# mount /dev/sda5 /mnt/backup

备份分区

# fsarchiver savefs /mnt/backup/redflag-bootfs-ext2.fsa /dev/sda1

# fsarchiver savefs /mnt/backup/redflag-rootfs-ext3.fsa /dev/sda2

          

        二,传送备份的文件到VMware Server上去

                就是用scp。可惜fsarchiver不能把备份文件直接保存在NFS分区上,提示有错误(或者是我没搞对?)。不知道还有没有更简便的方法?

 

# scp /mnt/backup/redflag-bootfs-ext2.fsa user@host:/opt/fsarchiver/

# scp /mnt/backup/redflag-rootfs-ext3.fsa user@host:/opt/fsarchiver/

 

        三,获取虚拟磁盘大小

                之前说过,在VMware Server上我们要尽量节省空间,这样才放的下更多的物理系统。因此,我们先看看原来的物理服务器中,实际使用的磁盘空间是多少:

 

# fsarchiver archinfo ./redflag-bootfs-ext2.fsa

# fsarchiver archinfo ./redflag-rootfs-ext3.fsa

                /boot  使用了十几M,/root  使用了3G多空间。知道这些后,我们就可以着手在虚拟机中规划分区,并进行恢复了。

 

给虚拟机划分一块5G的硬盘,进行分区

#fdisk -l /dev/sda
/dev/sda1  /boot  50M
/dev/sda2  swap   500M
/dev/sda3  /      4G

 

 

 

        四,在虚拟机中进行恢复

                用sysrescuecd启动虚拟机,进行恢复。

 

恢复/boot分区,文件系统为ext2
# fsarchiver restfs redflag-bootfs-ext2.fsa id=0,dest=/dev/sda1,mkfs=ext2

恢复/分区,文件系统为ext3
# fsarchiver restfs redflag-rootfs-ext3.fsa id=0,dest=/dev/sda3,mkfs=ext3

                需要重新安装grub。

                当在sysrescuecd中chroot进入系统后,使用应用程序总会发生段错误,应该是和kernel与gcc的版本有关吧。无奈之下,只好使用了同版本的RedFlag恢复光盘,重新启动系统。不过这也带来一个好处,后面会说。

 

进入虚拟机中的系统
# chroot /dev/sda3 /bin/bash

重新安装grub
# grub
>>> root (hd0,0)

>>> setup (hd0)

>>> quit

此时,grub已经重新装在了这块硬盘的MBR上。

 

 

                修改/etc/fstab,以适应新系统的需要。

                兴奋的重启虚拟机,grub正常启动 :) 可在加载内核时,出现了“kernel panic”的错误,显示找不到根分区。肯定是磁盘控制器的驱动没有加载上,该动动initrd了。

 

        五,修改initrd.img文件

                此文件的来历及发展也很有趣,在内核2.4与内核2.6版本中的处理方法也不相同,留到以后有空再聊。现在的目标是让系统中的initrd文件尽快的能用起来。

                我们现在正在RedFlag的恢复光盘中,它为什么可以正常启动系统?显然,它在启动时加载了必须的驱动。我们此时只需要寻找到磁盘控制器的驱动即可。BusLogic: SCSI storage controller。就是他!

 

查看原来initrd.img的内容
# cp /mnt/sda3/boot/initrd.img /mnt/sda3/tmp/initrd.gz
# cd /mnt/sda3/tmp
解压
# gunzip initrd.gz
挂载
# mount -o loop initrd /mnt/sda3/tmp/init
现在就可以看到initrd.img的内容了
# ls /mnt/sda3/tmp/init
bin/ dev/ etc/ lib/ linuxrc* loopfs/ proc/ sbin sysroot/

 

 

                 现在,只需要把驱动拷贝到lib/目录中,并修改linuxrc文件,通知内核加载此驱动即可。

 

# cp /lib/modules/`uname -r`/kernel/drivers/scsi/BusLogic.o /tmp/init/lib

# vi /tmp/init/lib/linuxrc
      #增加必须的模块,去除不需要的模块
      insmod /lib/BusLogic.o

               好了,重新生成initrd.img

 

卸载initrd
# umount /tmp/init

压缩
# gzip initrd

覆盖
# cp initrd.gz /boot/initrd.img
 

                OK,重启……

                问题解决,在启动过程中,RedFlag会启动一个检测程序,检查硬件的变化,并自动配置。

                至此,迁移过程结束,物理服务器中的系统已经在虚拟机中跑的欢畅

 


        遗留的问题:

                              1,自动化处理。只有达到自动化,才有大量迁移的可能。

                              2,网段,光纤存储等问题。

                              3,资源分配问题。

         这次迁移只是一次实验操作,东拼西凑,其中很多地方做得不漂亮,可改进的地方还有很多。但思路应该大致就是这样,您有什么好办法,也说来听听