通过LAN迁移原始磁盘映像


8

这是我的情况:

  • 同一数据中心中的两个专用服务器之间具有千兆以太网。
  • 这两个专用服务器都已启动到基于Debian Squeeze的救援环境中,并添加了额外的工具和实用程序。还有足够的tmp空间(两个盒子上都有32GB的RAM)用于下载软件,安装软件包和/或根据需要进行编译。
  • 两台专用服务器都有大约 3TB的可用空间。
  • “源”服务器在硬件RAID-10中具有4个1.5TB磁盘,带有Adaptec 4端口控制器。
  • “目标”服务器在硬件RAID-1中具有2 x 3TB磁盘,带有Adaptec 2端口控制器-与另一代相同,但端口数量不同。
  • 可用块的数量/dev/sda相差不到10 MB,但是由于某种原因,目标服务器的阵列要小几个兆。
  • 两个RAID阵列均配置为使用所有组成磁盘的整个磁盘表面来创建一个单个RAID卷。
  • 操作系统以MBR模式引导;不使用UEFI引导。

我想做的事:

  • 在块层上,将整个OS映像(仅由GPT分区表,/ boot分区和/分区中的GRUB2引导程序组成)从“源”服务器复制到“目标”服务器。
  • 如果可能的话,复制应“实时”进行:这意味着我没有足够的空间在目的地侧存储磁盘映像的适当文件,除非我将磁盘映像作为副本解压缩到硬盘上正在发生。服务器之间的千兆以太网连接足够可靠,我对此感到满意,并且我当然会fsck在两端(源和目标)上运行,以验证传输前后文件系统是否正常。
  • 如果可能,请不要通过网络传输块,每个块中的组成文件系统都不会使用这些块(所有分区的格式都为ext4)。这是因为超过50%的“源”磁盘是/分区中的可用空间。
  • 调整/分区的大小,以便在复制分区时将其大小调整为适合目标磁盘的大小。
  • 复制成功后,安装每个卷并修复对静态IP的引用,以反映新服务器的IP。(无需任何其他帮助,就可以这样做)

我的问题:

  • 我是否应该首先计算/dev/sda每个服务器上的大小之间的差异(以字节为单位),然后使用e2resize非破坏性地减小源端上/分区的大小,以使其适合目标端的空间?
  • 我应该dd在原始块设备上运行,/dev/sda从源到目标(通过ssh),还是应该在目标上创建等效的分区布局并dd在每个分区上运行?请注意,一次处理一个分区给我留下了引导加载程序的问题,但是如果我一次不做一个分区,那么dd一旦它写入了目标可以容纳的字节数,就需要知道停止传输数据(希望它将“封闭” /最后一个块上分区的最末端,逻辑上在源分区布局中所有其他分区的“右边”)。

一些杂项。细节:

  • 源代码框上的主机操作系统是运行多个OpenVZ来宾的Ubuntu Server 12.04
  • 由于两个设备均已启动,因此可以直接进行磁盘访问,而不会期望运行的操作系统对基础数据进行任何更改。

您是否确实需要从设备或仅从OS文件系统复制已使用的块?
安德鲁

Answers:


6

这很麻烦,但是可行。

我相信这里//dev/sda3/boot/dev/sda1

  1. 将旧服务器上的文件系统缩小到最小大小。

    oldserver # resize2fs -M /dev/sda3
    
  2. 用相同大小/boot,交换空间和新/分区(以及您需要的其他任何内容)对新服务器的磁盘进行分区。

    newserver # parted /dev/sda
    
  3. 复制//boot文件系统。

    oldserver # dd if=/dev/sda1 | ssh root@newserver "dd of=/dev/sda1"
    oldserver # dd if=/dev/sda3 | ssh root@newserver "dd of=/dev/sda3"
    

    由于新服务器上的分区将比旧服务器上的分区稍小,因此No space left on device在此结束时您将收到一条虚假消息。但是,由于在步骤1收缩了文件系统,所以这无关紧要。

  4. 将新服务器上的文件系统调整为分区大小。

    newserver # resize2fs /dev/sda3
    
  5. 在新磁盘上安装GRUB。

    newserver # mount /dev/sda3 /mnt
    newserver # mount /dev/sda1 /mnt/boot
    newserver # mount -o bind /dev /mnt/dev
    newserver # mount -o proc proc /mnt/proc
    newserver # chroot /mnt /bin/bash
    
    newserver(chroot) # grub-install /dev/sda
    newserver(chroot) # exit
    
  6. 完成其余的修复工作(IP地址等)。

您可能会找到避免复制分区的可用空间的方法,但是与仅复制所有内容相比,可能需要花费更多的时间进行研究...


太棒了!我可以复制分区的可用空间,因为这些说明符合我的所有其他条件。虽然,不是仅仅调整文件系统和分区本身的大小就oldserver不需要复制所有可用空间吗?我不在乎,/boot因为它是如此之小,但/至少可以做到这一点,对吗?只需将分区的末端扇区设置为等于resize2fs将FS扇区末端设置为哪个扇区即可。好吧,扇区,块...可能是。但是,谢谢你!这很棒!
allquixotic

是的,如果您还减小了分区的大小,则可以避免大量复制。那样可能会节省您几个小时的时间...为了避免我的数学稍有下降,我会稍作懈怠。
迈克尔·汉普顿

这还将消除虚假的/吓人的“设备上没有剩余空间”,因为它将/dev/sda3减小到大约1.3 TB的大小,并将其复制到目标位置上的分区中,该分区预计将保持2.9 TB。
allquixotic

要花点时间。意识到我有一个100 Mbit / s分配的千兆端口。废话
allquixotic

5

我将mkfs在新服务器上使用新的文件系统,然后rsync在旧服务器上使用它们。这是可重新启动的,一致的,并且每个文件都可以轻松地单独进行验证。在丢弃文件系统未使用的部分(不是法医副本)的地方,我看不出有任何理由不使用此方法。您将不得不重新运行GRUB,但这并不是一个挑战。

解释具有文件系统意识的原始副本将花费我一段时间,因此,除非您对我的rsync解决方案不起作用的原因发表评论,否则我会避免打字。


我认为partimage可以进行文件系统感知的原始副本,但不支持ext4。因此,作为一个选项,... rsync看起来更好,只要它保留所有自由访问控制(la chmod)并可以干净地复制符号链接和设备文件...
allquixotic 2013年

我赞同杰夫的答案。您可以使用sfdisk -d / dev / sda |转移分区布局。ssh目标“ sfdisk / dev / sdb”。创建文件系统并使用“ rsync -a -e“ ssh -c arcfour” / mnt / root @ destination:/ mnt /进行传输。Aftewards遵循Michael Hampton回答的第5步,以使目标可引导。
Tim Haegele 2013年

1

如果您真的想在块设备级别传输数据,我可以想到一个非常有用的技巧,即我用来迁移服务器的停机时间最少。

事实是,您可以在源服务器上创建降级的镜像,而数据分区是镜像的唯一活动部分,然后通过AOE从第二台服务器导出目标分区(我想您的两个服务器都在同一广播域中)。然后,在源服务器上,将网络阻止设备连接到降级的镜像,以便它开始重建。等待重建完成,停止镜像,删除AOE导出的设备,您就可以了。

接下来是更多细节(我会尽量简化)。

组件:

  • mdadm具有其构建模式(不带元数据的临时镜像);
  • vblade 用于将块设备导出为AOE网络设备;
  • aoe-tools 用于导入AOE网络阻止设备。

您必须在目标服务器上创建分区表,然后缩小源分区,使其适合目标。您可以轻松地将GRUB安装到新的MBR中。在新创建的分区表上仅同步分区就容易出错。

在接收端,您必须使用vblade工具导出分区,在源服务器上,安装后可以看到导出的设备aoe-tools(运行aoe-discover然后查看/dev/ether/设备)。

然后,您应该使用驱动器在源服务器上构建raid1设备:

mdadm --build /dev/md0 -n2 -l1 --force /dev/sda

之后,您可以检查新建的镜像:

mdadm --detail /dev/md0
cat /proc/mdstat

此时,您可以安全地将导出的目标分区附加到此镜像:

mdadm /dev/md0 --add /dev/ether/eX.Y

然后,只需监视同步进度即可:

watch -n5 cat /proc/mdstat

同步完成后,只需停止镜像:mdadm --stop /dev/md0在源服务器上,vblade在目标服务器上终止进程,在第二台服务器上安装GRUB,更改您的IP地址,等等。

实际上,通过此技巧,可以在几乎处于活动状态的盒子之间移动服务器,而停机仅是重新启动同步的盒子。


出于性能原因,我还建议您增加链接的MTU(或在可能的情况下设置启用了巨型帧的单独VLAN)。

请注意,您也可以使用nbd-server/之类的东西nbd-client(如果需要,甚至可以选择iSCSI)代替AOE,但是AOE(vblade+ aoe-tools)具有非常简单的界面和出色的性能(无TCP / IP开销),


我还要补充一点,在块设备级别上进行同步有时确实比使用rsync在文件上同步要快得多,尤其是当文件系统上有数百万个(相对而言)相对较小的文件时。
artyom

mdadm?我正在使用硬件RAID。而且我不知道什么是AOE,并且从未使用过iSCSI。我认为我的服务器不在同一广播域中,而在同一数据中心中。服务器之间至少有一个或两个开关。
allquixotic

我认为这是个好主意!但是如何处理不同大小的磁盘?
蒂姆·海格勒

但是,@ allquixotic,您可以尝试以下方案,将nOE替换为AOE(网络阻止设备,由nbd-servernbd-client软件包提供)。mdadm仅用于同步两个块设备,不会以build模式写入元数据,因此您可以在任何块设备之上使用它(必须先将其卸载)。关键是,即使我具有底层的硬件RAID,我通常也可以在降级的mdadm raid1上建立一个新系统,这样我就可以应用所描述的技术而不必卸载分区,从而将迁移停机时间减少到单个重启时间。
artyom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.