我遇到了以下问题:我们有一个专用的(裸机)硬件服务器(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
我将图像提供给fdisk
并resize2fs
更改其(虚拟)大小。由于图像的大部分末尾已经只包含零,因此我对它的操作并没有增加其实际大小。
这种最简单方法的最坏情况空间要求是旧服务器数据内容的 3 倍。一次复制稀疏映像,一次调整大小(即,将其所有内容移至开头而不在其末尾打新洞),然后再一次将原始磁盘映像转换为虚拟机管理使用的格式(或将当时基于文件的映像移动到其自己的逻辑卷)。
需要注意的事项:
- 执行此操作的方式应取决于计划虚拟化的软件/设置(例如,如果您当前的系统通过 EFI 启动,但您的虚拟化不喜欢这样,那么执行磁盘复制无论如何,您什么时候必须重新做引导加载程序相关的东西?)
- fstrim(尤其是与损坏的 SSD 或 RAID 结合使用时)可能会造成数据丢失级别的危险。如果您不确定这对您的设置是否安全,请执行写出仅包含空字节的巨大文件替代方案 - 我们只关心未使用的区域是否可以被检测到(是否被清零),而不是磁盘是否知道。
- 只需将根置于只读状态即可完成工作,但会得到结果就像服务器在虚拟机上重新启动之前崩溃了一样。如果您在停止应用程序后复制图像,则可能会够好了:毕竟您希望您的服务器能够在崩溃后继续运行。