从一个主机到另一个主机的完整克隆

从一个主机到另一个主机的完整克隆

我有一台运行 Ubuntu Server 18.04 的无头迷你电脑 - 没什么特别的,只有一台“Beelink Gemini X55”8GB RAM、128Gb SSD。与 VPS 替代品甚至我工作的地方的一些生产企业服务器相比,它的基准测试相当令人印象深刻。

它目前正在托管我的实时网站。

我刚刚购买了另一台 X55 迷你电脑 - 硬件和规格完全相同 - 目的是将其用作开发服务器。

我想克隆现有的生产服务器,制作相同的副本,只更改主机名和静态 IP 地址条目等。

最好的方法是什么?是否有一些磁盘复制工具可以从实时 Linux 操作系统创建映像,然后可以使用该映像从新系统上的 USB 设备启动,从而创建可启动映像?

我在 Windows 中使用处理 VSS 复制的“Macrium Reflect”成功完成了此操作。但是,据我所知,没有 Linux 替代方案。

我没有在这台机器上运行 GUI,所以无论我最终使用什么解决方案都需要仅基于命令行。

答案1

“没有 Linux 替代品”,因为 Linux 内置了如此重要的功能,无需任何第三方软件。不过,你必须完成几个步骤。

我们假设您“坐在”机器旁,我称之为“本地”,并且您需要将其配置为另一个“远程”系统的克隆。

在新机器上,您只需启动任何 Linux Live CD(无论哪个,如果您需要基于文本的 CD,请使用 Gentoo 安装 CD)。以您每天使用的相同模式启动(选择 UEFI 或传统 BIOS;使用传统模式启动时无法设置 UEFI 启动)。

从它连接到远程主机,请求反向端口转发:

ssh remote-host -R 12345:localhost:12345

这将允许您稍后通过此 SSH 连接通过网络发送磁盘数据。然后保持此控制台打开,并切换到另一个控制台,您将在其中准备本地磁盘并运行接收命令,该命令解压网络流并写入文件。

将本地磁盘准备为所需的结构。您可以在远程控制台中查找原始系统的分区方式,lsblkblkid并且fdisk -l /dev/whatever是您的朋友。因此,这些命令应该在两个系统上给出类似的答案。然后将根文件系统挂载到本地(目标)系统的某个位置,例如/mnt/newroot

mkdir /mnt/newroot
mount /dev/rootdeviceyouchose /mnt/newroot
cd /mnt/newroot

现在我们要运行接收和解包命令。它看起来像这样:

netcat -l -p 12345 | tar -xpf -

它应该“挂起”,因为它现在正在等待以 tarball 格式发送到 TCP 端口 12345 的数据被提取 ( -x)。它还将恢复权限 ( -p)。

切换到远程(原始)控制台(SSH 正在运行)并准备打包和发送:

mkdir /run/root-bind
mount --bind / /run/root-bind
cd /run/root-bind
tar -cpf - * | netcat localhost 12345

您可以-v向两者添加 (verbose) 标志来监控进度。完成后tar不要忘记清理 (umount和目录)。rm

一切看起来都像这样(我从随机服务器复制临时文件,但/复制的内容完全相同):

接收方:

merlin@muon /tmp/1 $ netcat -l -p 15151 | tar -xpvf - 
./debian-buster64/
./debian-buster64/linux
./debian-buster64/initrd.gz
./grub/
./grub/grub.cfg
./grubnetx64.efi.signed
./pxelinux.0
./pxelinux.cfg/
./pxelinux.cfg/default

发送方:

merlin@muon ~ $ ssh ns -R 15151:localhost:15151
Linux ns 3.2.0-6-amd64 #1 SMP Debian 3.2.102-1 x86_64

merlin@ns:~$ cd tftp/
merlin@ns:~/tftp$ tar -cvpf - ./* | netcat localhost 15151
./debian-buster64/
./debian-buster64/linux
./debian-buster64/initrd.gz
./grub/
./grub/grub.cfg
./grubnetx64.efi.signed
./pxelinux.0
./pxelinux.cfg/
./pxelinux.cfg/default

注意,--bind不是递归的。如果在 下安装了其他文件系统/,例如/boot等,则不会通过此操作复制这些文件系统。因此,在 / 之后,您可以以相同的方式克隆所有其他文件系统。可以使用而不是/var将所有内容合并到单个 fs 中,但这可能会使下一步变得更加困难。--rbind--bind

您重新创建了文件系统,因此您必须在克隆的系统上修复 /etc/fstab。blkid将显示新的 UUID、标签等,您必须在 中用新标签替换旧标签/mnt/newroot/etc/fstab。现在更新 IP 地址、主机名等是个好主意。

现在所有文件数据都已复制,fstab 已修复,您需要恢复引导加载程序。通常,您chroot进入系统并重新安装引导加载程序。如何进行引导恢复的说明取决于您使用的发行版,通常在其手册中提供。此外,它还取决于您使用的是传统 BIOS 引导还是现代 UEFI 引导。我不确定 Debian 说明是否适用于 Ubuntu,但它应该有效:

mount --rbind /dev /mnt/newroot/dev
mount --rbind /sys /mnt/newroot/sys
mount -t proc proc /mnt/newroot/proc
chroot /mnt/newroot
mount /dev/boot /boot # if it is a separate partition
mount /dev/device-for-esp /boot/efi # if you use an EFI System Partition
grub-install dummy # for UEFI
grub-install /dev/diskname # for legacy
update-grub

然后重启。就完成了。

答案2

通常用于复制整个驱动器dd,但是它会逐位复制,甚至复制空白空间,因此可能会有点慢:

dd if=/dev=sda of=dev/sdb

其中sdasdb分别表示旧驱动器和新驱动器。

有人说,cat速度更快:

cat /dev/sda > /dev/sdb

partclone可能更适合,因为它应该只复制使用过的块,从而跳过空白空间的问题:

partclone -b -s /dev/sda -o /dev/sdb

在所有情况下,请确保您知道是什么sdasdb并且您不想弄乱您的驱动器....我还建议您制作一个可启动的、无头的实时 USB,并在驱动器不处于实时状态时复制驱动器,或者在实时状态时复制非根分区,并在关闭时复制其余分区,以减少服务器的停机时间。

相关内容