我需要将整个 Linux 根文件系统从故障硬盘转移到另一台具有开放可用分区的计算机上。我非常确定这涉及tar
和ssh
,但我记不清具体如何操作了。
我想象可能使用新/目标主机上的 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
,并将传入的数据通过管道传输到tar
extract(保留修改时间和权限)。坏主机也会使用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 -