如何使用 ssh 和 tar 将整个 Linux 根文件系统复制到新硬盘

如何使用 ssh 和 tar 将整个 Linux 根文件系统复制到新硬盘

我需要将整个 Linux 根文件系统从故障硬盘转移到另一台具有开放可用分区的计算机上。我非常确定这涉及tarssh,但我记不清具体如何操作了。

我想象可能使用新/目标主机上的 Live CD 来运行某物像这样:

ssh user@failingharddrivehost "some tar command | piped into something else"

答案1

使用 rsync。在新主机上,您可以使用

rsync -avP --numeric-ids --exclude='/dev' --exclude='/proc' --exclude='/sys' root@failedharddrivehost:/ /path/to/destination/

我不会尝试使用像 tar 这样的程序,因为当文件损坏时它可能无法工作。

答案2

为什么要与目录排除相结合?将同一设备安装到另一个目录中不是更好的主意吗?现代内核允许这种方式。例如,您已经安装了

/dev/sda1 as /然后执行:mkdir /CLEANROOT mount /dev/sda1 /CLEANROOT

之后您将获得: /dev/sda1 as / /dev/sda1 as /CLEANROOT

这是在两个位置可见的同一文件系统,但 /CLEANROOT 没有附加挂载。然后,您可以 tar 或 rsync /CLEANROOT,无需任何排除,而是复制带有排除的 /。

当然,当您有数据分区时,您必须复制其他数据分区。

复制分区是服务器恢复的第一步。另一个步骤是重新生成引导扇区,否则系统将无法从复制的磁盘启动。当您从安装/救援 CD 或 U 盘启动时,救援模式很有用。

答案3

如果两台计算机都在同一个(安全的)局域网上,我建议使用不同的方法netcat。这种方法通常更快,因为它不加密数据。

root@good_host$ cd good_partition; netcat -l -p 1234 | tar xvpmf -
root@bad_host$ tar -cv -f- --exclude=/proc --exclude=/sys / | netcat good_host.ip 1234

这会打开好机器上的监听端口 1234 netcat -l -p 1234,并将传入的数据通过管道传输到tarextract(保留修改时间和权限)。坏主机也会使用tar和将数据发送到此端口netcat。我添加了一些--exclude参数,因为/proc/sys是虚拟文件系统,因此在新主机上无用。(尤其是(/proc/kcore)中代表 RAM 的文件将添加不必要的数据量)。

但是,您(也)应该考虑转储dd故障驱动器的分区:

user@good_host$ cd good_partition; netcat -l -p 1234 > dump_of_bad_partition_1.dd
root@bad_host$ dd if=/dev/sda1 | netcat good_host.ip 1234

您必须采用/dev/sda1正确的设备。对故障驱动器上的其他分区也执行此操作。

通过该转储,您可以确定您没有错过任何tar无法捕获的重要元数据(例如 ACL)。

答案4

这里介绍了如何使用tar和复制文件ssh基本上,您可以运行以下命令之一,具体取决于您要复制本地 -> 远程还是远程 -> 本地:

tar cf - files... | ssh remotehost -c 'cd /destination && tar xvf -'

ssh remotehost -c 'cd /destination && tar cf - files' | tar xvf -

相关内容