利用nc命令克隆Linux操作系统

中国科学技术大学超级计算中心 李会民<hmli@ustc.edu.cn> 2017-03-11


利用nc命令可以将一台原来主机OLD的系统克隆到另一台新主机NEW上,而无需重新安装系统。

也可以利用dd硬盘对拷(含引导信息)、rsync等完成数据传输,之后再类似本文除nc传输之外的内容做相应设置。

本文以Debian GNU/Linux 8.7克隆为例(进入系统后需要root权限)。

  1. 采用LIVE系统(如USB、CD、PXE等)启动新主机:
    • 中国科大校园网内支持PXE网络启动LIVE系统,请在系统启动时设置从PXE网络启动,然后选择合适的LIVE系统即可。
    • U盘:
      • 下载debian-live-8.7.1-amd64-gnome-desktop.iso:
        root@localhost:~# wget http://mirrors.ustc.edu.cn/debian-cd/8.7.1-live/amd64/iso-hybrid/debian-live-8.7.1-amd64-gnome-desktop.iso
      • 在一台linux(在Windows下需用特殊工具处理,请自己搜索)主机上将其dd到U盘(注意,是dd,不是将ios文件解压缩后复制到U盘,因为dd后会将引导信息写到U盘中,这样才可引导)。假如在Linux下看到U盘的为/dev/sdb,那么使用root权限执行:
        root@localhost:~# dd if=/root/debian-live-8.7.1-amd64-gnome-desktop.iso of=/dev/sdb

        注意是sdb,不是sdb1等分区。

      • 将U盘插到新主机NEW上,设置首先从U盘启动,启动到选择界面时选择LIVE系统而不是安装启动。
  2. LIVE主机启动后,在LIVE主机上打开一个终端,然后切换到root权限:
    user@debian:~$ sudo bash
  3. 在LIVE主机上对新主机NEW的硬盘进行分区:

    可以分成与原系统OLD一样的分区,也可以不一样,只要保证新主机NEW上的目录能放下所需保存原系统OLD的目录内容即可。在此处按我的需求将新主机NEW硬盘分成三个分区:

    • sda1:/boot分区,格式为ext3
    • sda2:swap分区
    • sda3:/分区,格式为ext4

    根据需要设定分区:

    root@debian:/home/user# fdisk /dev/sda
  4. 在LIVE主机上格式化新主机NEW分区:
    root@debian:/home/user# mkfs.ext3 /dev/sda1
    root@debian:/home/user# mkswap /dev/sda2
    root@debian:/home/user# mkfs.ext4 /dev/sda3
  5. 在LIVE主机上将对应分区mount到/mnt上的对应目录:
    root@debian:/home/user# mount /dev/sda3 /mnt
    root@debian:/home/user# mkdir /mnt/boot
    root@debian:/home/user# mount /dev/sda1 /mnt/boot
  6. 在LIVE主机上执行接收数据守护进程:
    • root@debian:/home/user# cd /mnt
    • root@debian:/mnt# nc -l -p 999 | tar xvf -

      其中,-p 999表示使用999端口接收数据。

  7. 在原主机OLD上将所要的数据传输到LIVE系统上:

    为保险起见先停掉必要的服务,比如SQL服务等,以免因数据不完整导致新系统启动后需要修复数据库等。

    • 进入/目录:
      root@OLD:~# cd /
    • 发送数据:
      root@OLD:/# tar cvf - bin boot dev etc home initrd.img lib lib64 media mnt opt root run sbin srv sys tmp usr var vmlinuz | nc LIVE主机IP 999

    注意,不要发送proc目录。正常的话,会显示正在发送的文件列表,类似:

    bin/bash
    bin/bunzip2
    bin/busybox
    bin/bzcat
    bin/bzdiff
    bin/bzexe
    bin/bzgrep
    bin/bzip2
    bin/bzip2recover
    bin/bzmore
    bin/cat
    bin/chacl
    bin/chgrp
    bin/chmod
    bin/chown
    bin/chvt
    

    结束时会显示“tar: 由于前次错误,将以上次的错误状态退出”,可以忽略此提示。

  8. 因为没有同步/proc目录,同步结束后,需要在LIVE主机上生成/mnt/proc目录:
    root@debian:/mnt# mkdir /mnt/proc
  9. 在原主机OLD上获取硬盘各分区UUID:
    root@OLD:/# blkid
    输出类似:
    /dev/sda1: UUID="0c29e967-7b77-448a-9c44-e30787f81a70" TYPE="ext3" PARTUUID="eef22924-01"
    /dev/sda2: UUID="94c0cf00-80e8-4743-9228-422f32ab7eff" TYPE="swap" PARTUUID="eef22924-02"
    /dev/sda3: UUID="9d8c5319-a71f-4ac6-ab1c-df3cbd6602cc" TYPE="ext4" PARTUUID="eef22924-03"
    
  10. 在LIVE主机上获取硬盘新分区后的各分区UUID:
    root@debian:/mnt# blkid
    输出类似:
    /dev/sda1: UUID="cf66acb2-c721-456d-adf0-649569a24c25" TYPE="ext3" PARTUUID="78e444be-01"
    /dev/sda2: UUID="c7f42cf7-2c28-4c91-995e-d748acb6047f" TYPE="swap" PARTUUID="78e444be-02"
    /dev/sda3: UUID="139b389b-6eff-484d-b34d-8c8be399496a" TYPE="ext4" PARTUUID="78e444be-03"
    
  11. 在LIVE主机上修改/mnt/etc/fstab、/mnt/boot/grub中的分区信息,用新主机硬盘的UUID替换掉原来的:
    root@debian:/mnt# sed -i 's/0c29e967-7b77-448a-9c44-e30787f81a70/cf66acb2-c721-456d-adf0-649569a24c25/g' /mnt/boot/grub/grub.cfg /mnt/etc/fstab
    root@debian:/mnt# sed -i 's/9d8c5319-a71f-4ac6-ab1c-df3cbd6602cc/139b389b-6eff-484d-b34d-8c8be399496a/g' /mnt/boot/grub/grub.cfg /mnt/etc/fstab
    root@debian:/mnt# sed -i 's/94c0cf00-80e8-4743-9228-422f32ab7eff/c7f42cf7-2c28-4c91-995e-d748acb6047f/g' /mnt/etc/fstab
  12. 在LIVE主机上将/dev、/proc、/sys mount到/mnt对应目录:
    root@debian:/mnt# mount --bind /dev /mnt/dev
    root@debian:/mnt# mount --bind /proc /mnt/proc
    root@debian:/mnt# mount --bind /sys /mnt/sys
  13. 在LIVE主机上chroot进入原系统OLD的系统环境:
    root@debian:/mnt# chroot /mnt
  14. 原来的/boot/initrd.img-3.16.0-4-amd64中含有原硬盘分区的UUID信息,需要在chroot后的系统内重新生成:
    root@OLD:/# mkinitramfs -o /boot/initrd.img-3.16.0-4-amd64
    注:CentOS对应命令类似为:
    mkinitrd --force /boot/initramfs-3.10.0-862.3.2.el7.x86_64.img 3.10.0-862.3.2.el7.x86_64
  15. 将引导信息写入硬盘,在chroot后的系统:
    root@OLD:/# grub-install /dev/sda
    注意,BIOS中引导时采用的UEFI或LEGACY新主机要与原主机一致,否则grub需要重新生成针对新主机的。
  16. 修改新系统NEW中的其他配置:
    • IP等网络信息:如配置中含有以前网卡的MAC地址信息,需要替换掉:
      • REHL/CentOS:/etc/sysconfig/network-scripts/ifcfg-eth*
      • Debian/Ubuntu:/etc/network/interface
    • 必要时需要修改udev信息,一般在/etc/udev/rules.d/。
  17. 重启物理机,并选择从硬盘启动:

    如果提示有问题,根据错误提示,可以利用LIVE系统mount上新系统分区后做相应处理。