如何将专用裸机服务器转移到虚拟机?

如何将专用裸机服务器转移到虚拟机?

我遇到了以下问题:我们有一个专用的(裸机)硬件服务器(Debian 10),我们无法直接对其进行物理访问。现在我想将此服务器上的所有数据和应用程序传输到虚拟机并在 KVM 主机上运行它。

为什么我不直接在虚拟机中安装应用程序?这个应用程序(带有 Apache Web 服务器的 Perl 程序,在同一台服务器上运行了大约 10 年)的安装非常复杂,你宁愿破坏某些东西。所以没人敢这么做。但现在我们必须采取行动,因此我们需要某种巧妙的解决方法。

dd我考虑过关闭所有 Perl 和 Apache 服务并通过网络传输硬盘- 但问题是目标 KVM 主机的空间小于sda裸机服务器的空间(最终它使用的空间小于可用空间,sda只是尺寸过大)。

第二种选择是在 KVM 上安装相同的软件包,版本号完全相同(根据dpkg --list),禁用裸机服务器上的所有服务(以保持数据一致),并将/etc/var//usr裸机服务器上的所有其他重要内容放入 tarball 中,然后在 KVM 上将其解压。当然,我也可以通过 rsync 执行此操作,但原理大致相同。

您对于最后一个想法有什么看法?

你还有其他建议吗?

您将如何完成这项任务?

答案1

作为安克斯让我这样做,我会回答我自己的问题:) 我的解决方案并不是那么复杂安克斯's,但我还是想与你们分享。

我实际上所做的是,我首先检查了两个文件系统上的 Inode 和 Block 大小,以确保它们彼此相同(使用tune2fs)。

然后我关闭了所有服务,除了 SSHd 等现有的服务。

完成此操作后,我决定使用apt-clone而不是将软件包和二进制文件从一台机器复制到另一台机器:

# on the physical machine:
apt-get install apt-clone
apt-clone clone packages
# on the virtual machine:
apt-get install apt-clone
apt-clone clone packages.apt-clone.tar.gz
# check on the VM:
vimdiff <(dpkg --list) physical_mchine_packages.txt

接下来,我使用同步数据rsync。我同步的目录:

  • /root
  • /etc(我排除了诸如、、hostname和其他与 kernel/initram/lvm 相关的目录等文件)fstab/default/grub/network/interfaces
  • /usr(不是everythink,取决于你使用的软件)
  • /var(不是everythink,取决于你使用的软件)

最后一步是检查旧物理机的主机名或 IP 地址是否放在某些配置文件中:

find . ! \( -path "*proc*" -o -path "*sys*" -o -path "*var/mail*" -o -path "*var/spool/mqueue*" -o -path "*var/log*" \) -type f -exec grep -iH -- "x.x.x.x" {} \;

就这些。Everythink 现在可以在 VM 中工作了。我希望我可以帮助任何人 :)

答案2

(这个答案讨论了块设备级或者,如果您想在迁移到虚拟时保持分区和启动管理器配置完整,这是最合适的)

你所描述的问题在实践中不一定会发生。我偶然最近避免了这一点:

但问题是目标 KVM 主机的空间比裸机服务器的 sda 要小

文件比主机文件系统大(甚至大得多) - 只要您不执行任何实际将数据写入文件中跳过的区域的操作。

我所做的大致是fstrim / && systemctl stop appserver && mount -o remount,ro / && sync && dd bs=64k if=/dev/nvme0n1 | ssh vmhost dd bs=64k conv=sparse of=..。然后在虚拟机主机上,losetup我将图像提供给fdiskresize2fs更改其(虚拟)大小。由于图像的大部分末尾已经只包含零,因此我对它的操作并没有增加其实际大小。

这种最简单方法的最坏情况空间要求是旧服务器数据内容的 3 倍。一次复制稀疏映像,一次调整大小(即,将其所有内容移至开头而不在其末尾打新洞),然后再一次将原始磁盘映像转换为虚拟机管理使用的格式(或将当时基于文件的映像移动到其自己的逻辑卷)。

需要注意的事项:

  • 执行此操作的方式应取决于计划虚拟化的软件/设置(例如,如果您当前的系统通过 EFI 启动,但您的虚拟化不喜欢这样,那么执行磁盘复制无论如何,您什么时候必须重新做引导加载程序相关的东西?)
  • fstrim(尤其是与损坏的 SSD 或 RAID 结合使用时)可能会造成数据丢失级别的危险。如果您不确定这对您的设置是否安全,请执行写出仅包含空字节的巨大文件替代方案 - 我们只关心未使用的区域是否可以被检测到(是否被清零),而不是磁盘是否知道。
  • 只需将根置于只读状态即可完成工作,但会得到结果就像服务器在虚拟机上重新启动之前崩溃了一样。如果您在停止应用程序后复制图像,则可能会够好了:毕竟您希望您的服务器能够在崩溃后继续运行。

相关内容