如何使用tar进行完整备份和还原,其中系统放在SSD上,家目录放在HDD上?

我如何使用tar进行包含系统(SSD)和用户目录(HDD)的完整备份和还原?

现有的备份和还原方法似乎没有涵盖根目录和用户目录分别位于不同设备的情况。


欢迎来到AU!您是在寻找一次性解决方案还是持续/定期的解决方案?备份目标是本地还是远程?tar并不关心设备和挂载点。请编辑您的帖子以包含额外的信息。 - David Foerster
现有的备份和恢复答案似乎没有涵盖根目录和主目录位于不同设备的情况。原因是这样做是一个不好的主意,创建两个备份文件不仅更聪明,而且更高效。 - Rinzwind
1个回答

建议进行两次备份。如果根目录和/home目录位于不同的分区,那么需要为它们分别进行备份。如果您只想备份一个目录,那么需要在命令中添加很多例外情况。例如:
sudo su
cd /
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system / 
tar -cvpzf backuphome.tar.gz --one-file-system /home/

将备份您的根目录,并排除所有已挂载的分区,如 /media(您不希望备份外部设备(真的不希望)),绝对不要备份像 /dev 或 /proc 这样的东西。而 /home 则会被备份到另一个位置。

在上述方法中,备份存储在 /。最好将其存储在外部介质上;然后您可以在备份.tar.gz 前面放置一个目录,并从第一个命令中删除 --exclude=...

  • backup.tar.gz 是备份文件。
  • --exclude 选项将阻止实际备份被备份。
  • cvpzf:创建、详细显示、保留权限、压缩、使用文件。

  • --one-file-system - 不包括不同文件系统上的文件。如果您想备份其他文件系统,例如 /home 分区或挂载在 /media 上的外部媒体,您需要单独备份它们,或者省略此标志。如果省略此标志,您需要添加更多的 --exclude= 参数来避免不需要的文件系统。这些文件系统包括根目录下的 /proc、/sys、/mnt、/media、/run 和 /dev 目录。/proc 和 /sys 是虚拟文件系统,提供了运行中内核变量的窗口,因此不应尝试备份或恢复它们。/dev 是一个由 udev 动态创建和删除内容的 tmpfs,因此也不应备份或恢复它。同样,/run 是一个保存有关运行系统的变量的 tmpfs,不需要备份(来源)。


所以...如果你真的还想要一个“一句话”,它可能是这样的:
cd /
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --exclude=/proc 
--exclude=/tmp --exclude=/mnt --exclude=/dev --exclude=/sys / 

(我希望我将所有需要排除的内容都包括在内)
恢复将会是
sudo su
cd /
tar xvzf backup.tar.gz

我在tar命令前面没有使用sudo,因为这样会出现权限错误的提示信息(因为文件是由root所有)。

你的两行建议非常有效,除了在备份系统时我收到了一条消息。"/lib64/ld-linux86-64.so2 tar: /: file changed as we read it." 这在备份过程中正常吗? - Buildit
是的。tar会在备份文件本身的备份操作期间通知您文件的更改(它会在备份之前和之后检查文件的状态)。一般来说,这些消息是无害的。如果您拥有自己的软件/数据,并且将其放在其中一个文件中,我会自己重新创建备份。 - Rinzwind
标准的tar不会压缩文件,它只是将所有内容合并到一个文件中(TAR = 磁带存档)。建议尝试使用gtar代替。 - Alan Campbell
1如果命令不会备份某些目录,恢复系统时是否需要重新创建它们?此外,与仅使用Deja-Dup方法相比,这种方法有哪些优势? - user4493605
@Rinzwind 所以应该使用sudo来运行tar命令吗? - stephanmg
@AlanCampbell 这就是 "z" 的作用。 - Rinzwind
1@stephanmg 这取决于内容。如果是个人文件,可能不需要。如果有你没有所有权的文件,就需要使用sudo。因此,备份root会需要。如果你有多个用户,备份/home也会需要 :) - Rinzwind
@Rinzwind:非常抱歉,我误读了你的指示。:( - stephanmg
对于家目录,也可以添加--exclude-vcs来排除.git文件,这样会更好,因为我发现tar会抱怨文件太大。 - Goblinhack