将正在运行的物理服务器复制到虚拟机

将正在运行的物理服务器复制到虚拟机

我有一台运行 Ubuntu 10.04 的服务器。因为我想测试一些维护工作,例如升级到 12.04,所以我认为我应该使用 Virtual Box 创建服务器的 VM 副本。我无法物理访问该服务器,因此我考虑了以下选项:

  • dd将整个硬盘转换为我电脑上的原始图像,然后根据原始dd图像创建 VDI。
  • 安装相同的 ubuntu 版本,安装更新并在本地挂载 VDI,然后将文件系统从服务器 rsync 到已挂载的 VDI,创建服务器的逻辑副本。

rsync 解决方案稍微复杂一些,但似乎可以节省带宽,并允许我创建具有略微不同配置(例如较小的磁盘)的服务器“副本”。

您认为最好的方法是什么? 上述方法之一? 还是其他方法?

答案1

直接使用rsync比我最初想象的更成问题:

  1. 该命令需要在远程计算机上以 root 身份运行。
  2. 我不想启用远程根登录。
  3. 该文件系统基于 LVM,从 LVM 内部的 VDI 文件中挂载 VM 的实际根分区非常麻烦。

出于这些原因,我最终选择了两步流程:

  1. 将所有文件从远程计算机复制到本地主机。
  2. 将文件复制到客户机。

我最终选择了基本版tar,尽管我可以使用rdiffdir提供的来duplicity节省一些带宽。

我首先设置了一个 SSH 隧道,我可以使用它来传输tar文件,这样我就不必将档案写入我正在复制的文件系统中。

local$ ssh user@remote -R 3000:localhost:3000
loacl$ nc -l 3000 > filesystem.tar.gz
remote$ sudo tar -vcz / --exclude={/dev,/proc,/sys,/tmp} | nc localhost 3000

这会在本地主机上创建整个文件系统的 tar 存档。下一步是在客户机上解压它:

guest$ cd /
guest$ nc -l 3000 | sudo tar -xvz
local$ nc guest_ip 3000 < filesystem.tar.gz 

在我的例子中,/etc/fstab文件系统通过 UUID 引用,因此我必须使用 的输出来更新它。我还必须更新(接口名称) 和(IP 地址)guest$ sudo blkid中的网络设置。/etc/udev/rules.d/70-persistent-net.rules/etc/network/interfaces

答案2

不可否认,dd如果您只能远程访问服务器,则采用此方法或创建服务器的其他映像可能会出现带宽问题。

将 Ubuntu 10.04 服务器安装到 VDI 只是为了能够复制现有安装,这实际上并不是必要的(但它可能会节省一些带宽)。

我建议采取以下方法:

  • 使用以下方式创建虚拟机空的所需大小的虚拟硬盘。
  • 使用任意方式启动虚拟机居住(Ubuntu)系统来自.iso 文件。
  • 对硬盘进行分区(包括启动标志并使用与旧服务器相同的文件系统进行格式化)。
  • 将此分区挂载到您的实时环境。
  • 将旧服务器中的所有文件复制到虚拟机的空白分区

    rsync -avze ssh user@host:/ /<mountpoint>
    
  • 将 Grub 和 Grub2 安装到现已填充的 VDI 驱动器的 MBR。

  • 重启。

相关内容