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


18

我需要将整个Linux根文件系统从发生故障的硬盘驱动器上转移到具有开放可用分区的另一台计算机上。我已经确定这涉及到tarssh,但是我不记得要怎么做。

我大概成像使用新/目标主机上的Live CD来运行的东西是这样的:

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


无关。不是编程问题。但请尝试ssh user@failingsys "tar cfz - /" > oldsys.tar.gz

您要注意不要tar / dev /(例如/ dev / random,/ dev / sdX等)。同上/ proc /
Hennes

Answers:


19

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

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

我不会尝试使用tar之类的东西,因为当文件损坏时它可能无法工作。


如上文etagenklo和@Hennes所述,最终使用rsync。迁移进展顺利。只需修复grub,但这应该还不错。
CHK

8
我还会将-AHX添加为rsync的标志,以保留acls,xattrs和硬链接,从而产生更精确的原始fs副本。
亚历山大·雷梅施

5
我将添加-x来忽略不在根文件系统上的项目,然后您可以跳过--exclude参数以获取各种路径。
Alex

4

如果两台计算机都位于同一(安全)LAN上,则我建议使用另一种方法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到要提取的位置(保留mtime和权限)。错误的主机也使用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)。


3

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

/ dev / sda1 as /然后执行:mkdir / CLEANROOT挂载/ dev / sda1 / CLEANROOT

之后,您将:/ dev / sda1作为/ / dev / sda1作为/ CLEANROOT

这是在两个地方都可以看到的相同文件系统,但是/ CLEANROOT没有附加挂载。然后,您可以在没有任何排除的情况下进行tar或rsync / CLEANROOT,而复制/排除。

当然,当您拥有一些数据分区时,您必须复制另一个数据分区。

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


1

您是否可以物理访问发生故障的主机?

如果这样做,则从实时CD引导。然后使用:

  • 转储 (转储/还原包括权限在内的整个文件系统)。
  • 排除/ dev的Tar。您可以将其与输出到std_out以及通过netcat进行管道传递相结合
    ,排除语法为:tar --exclude='/dev'
  • 或与rsync相同的排除项。例如
    rsync -zvr --exclude /dev/ / destination_computer_name_or_ip
  • 或像这样使用dd
    nc -l 4242 | gunzip | cat > my_full_disk_backup_of_PC_named_foo
    dd if=/dev/sda of=- bs=1M | gzip | nc -p 4242 name_of_the_destination

如果无法从实时CD引导,则上述大多数解决方案将保持不变,但是:

  1. 某些文件可能正在使用/锁定。
  2. 确保不仅排除/ dev /,而且排除/ proc /。
    例如tar --exclude='/dev' --exclude='/proc'

是的,我对这两个主机都具有物理(和根)访问权限。尝试使用rsync。由于不明原因,netcat因故障盒而崩溃。目标文件系统不想挂载。它失败了: #mount /dev/sda1 /mnt/fedora mount: unknown filesystem type 'LVM2_member'
CHK


0

你应该考虑使用rsync

follwoing命令假设两件事:

  1. 您所在的系统上的硬盘驱动器出现故障
  2. 新分区的Linux安装最少且启用了ssh。

rsync / new_partition:/wherever/you/want/

注意:尾部的/很重要,否则文件将最终位于上一级目录中


OP可能要使用-a参数(也许-A),因为它保留了时间,所有权,符号链接(也许还有ACL)等以及-e ssh参数,因为应该将数据传输到另一台计算机。所以rsync -aAv -e ssh root@failingharddrivehost:/ /good_computer/newpartition_mountpoint
mpy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.