通过 LAN 迁移原始磁盘映像

all*_*tic 8 linux raid local-area-network migration

这是我的情况:

  • 同一数据中心内的两台专用服务器,它们之间有千兆以太网。
  • 两个专用服务器都启动到基于 Debian Squeeze 的救援环境,并添加了额外的工具和实用程序。还有足够的 tmp 空间(两个盒子上都有 32GB 的 RAM)用于下载软件、安装软件包和/或根据需要进行编译。
  • 两台专用服务器都有大约3TB 的可用空间。
  • “源”服务器有 4 个 1.5TB 磁盘,采用硬件 RAID-10,带有 Adaptec 4 端口控制器。
  • “目标”服务器在硬件 RAID-1 中有 2 个 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
  • 由于两个盒子都启动到救援状态,因此可以直接访问磁盘,而无需期望正在运行的操作系统对底层数据进行任何更改。

Mic*_*ton 6

这很麻烦,但可行。

我假设这里//dev/sda3,那/boot/dev/sda1

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

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

    newserver # parted /dev/sda
    
    Run Code Online (Sandbox Code Playgroud)
  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"
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    newserver # resize2fs /dev/sda3
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 完成其余的修正(IP 地址等)。

您可能会找到一种方法来避免复制分区的可用空间,但与仅复制所有内容相比,研究可能需要更长的时间......


Jef*_*and 5

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

解释一个文件系统感知的原始副本需要我一段时间,所以除非你评论为什么我的 rsync 解决方案不起作用,否则我会省去打字的时间。