我有一台运行 Ubuntu 10.04 的服务器。因为我想测试一些维护工作,例如升级到 12.04,所以我认为我应该使用 Virtual Box 创建服务器的 VM 副本。我无法物理访问该服务器,因此我考虑了以下选项:
dd
将整个硬盘转换为我电脑上的原始图像,然后根据原始dd
图像创建 VDI。- 安装相同的 ubuntu 版本,安装更新并在本地挂载 VDI,然后将文件系统从服务器 rsync 到已挂载的 VDI,创建服务器的逻辑副本。
rsync 解决方案稍微复杂一些,但似乎可以节省带宽,并允许我创建具有略微不同配置(例如较小的磁盘)的服务器“副本”。
您认为最好的方法是什么? 上述方法之一? 还是其他方法?
答案1
直接使用rsync
比我最初想象的更成问题:
- 该命令需要在远程计算机上以 root 身份运行。
- 我不想启用远程根登录。
- 该文件系统基于 LVM,从 LVM 内部的 VDI 文件中挂载 VM 的实际根分区非常麻烦。
出于这些原因,我最终选择了两步流程:
- 将所有文件从远程计算机复制到本地主机。
- 将文件复制到客户机。
我最终选择了基本版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。
- 重启。