是否可以使用 rsync 从 root 中的目录恢复 root?

是否可以使用 rsync 从 root 中的目录恢复 root?

我预期的事件顺序如下:

备份大部分根目录

sudo rsync -aAXv --delete --exclude={/dev/*,/proc/*,/sys/*,/mnt/*,/media/*} / /BACKUP

反转过程

sudo rsync -aAXv --delete --exclude={/dev/*,/proc/*,/sys/*,/mnt/*,/media/*} /BACKUP /

我很紧张尝试第二部分而不首先进行一些健全性检查,因此这篇文章。输出--dry-run看起来都不错,但仍然想先检查一下

答案1

对于使用 rsync 的完整系统备份恢复,我已成功使用:

备份命令:

sudo rsync -aHAXS --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /backup

我还添加了-H硬链接。我强烈建议你使用它。并且-S,如果您的文件稀疏。我有很多用于虚拟机的。

为了恢复,我使用了 live cd/usb,安装了空的、新格式化的即将-/磁盘,/mnt然后,

恢复命令:

sudo rsync -aHAXS --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /backup/* /mnt

照顾好即将到来的/etc/fstab/mnt/etc/fstab),也看看grub.cfg,重新启动,一切顺利。

关于排除,lost+found在某些文件系统中不可用,例如XFS,因此如果使用此类文件系统,则可以省略;如果包含在内的话也没有什么坏处。

答案2

最好的健全性检查实际上是从备份启动
这是 100% 确定的唯一方法,通过真实测试!
据我所知,您无法从根目录内的文件夹执行此操作。 (实际上,我使用的目标是“根树内的文件夹”,但在 /media/$USER/RootBackup 处,它实际上是另一个文件系统。)您甚至不需要恢复备份即可立即使用它,以防您处于快点,如果发生了不好的事情,只需从备份启动,然后再恢复!

使用rsync,您可以在需要时随时更新根的备份,速度相当快。每次在 ubuntu 20.04 上更新内核和其他核心包之前我都会这样做。

观察:如果您也使用 LVM,我放弃了 LVM 快照作为极其缓慢的选项。

我正在使用这个命令:
sudo rsync -axHAXv --delete-excluded / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /media/$USER/RootBackup/
我随后运行它几次以确保没有更改重要文件。
--delete-excluded 的重要性是真正保持同步(相同)。

我还单独备份/boot,因为它是安装在那里的另一个分区,其中:
sudo rsync -axHAXv --delete-excluded /boot/ --exclude=/lost+found /media/$USER/RootBackup/boot/

第一次运行它后,执行以下操作:
grub-update
但是它在这里无法正常工作,它一直指向LVM设备,而不是我创建的新文件系统,所以我这样做了:

mount |grep RootBackup #copy the device name, ex.: sdb4
ls /dev/disk/by-uuid/ -l |grep sdb4 # copy the UUID ex.: 4e97fe69-93ae-4e6a-a2cc-3406cb21176c

grub-update现在将新的menuentry从grub.cfg复制到/boot/grub/custom.cfg(我这里使用gpt,您可能不需要这个,只需根据需要复制并修改生成的menuentry ):

menuentry 'RootBackup by UUID' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'osproberfailed-manualadjustment-gnulinux-simple-4e97fe69-93ae-4e6a-a2cc-3406cb21176c' {
    insmod part_gpt
    insmod ext2
    set root='hd3,gpt13'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd3,gpt13 --hint-efi=hd3,gpt13 --hint-baremetal=ahci3,gpt13  4e97fe69-93ae-4e6a-a2cc-3406cb21176c
    else
      search --no-floppy --fs-uuid --set=root 4e97fe69-93ae-4e6a-a2cc-3406cb21176c
    fi
    linux /boot/vmlinuz root=UUID=4e97fe69-93ae-4e6a-a2cc-3406cb21176c ro quiet splash $vt_handoff debug --verbose
    initrd /boot/initrd.img
}

观察:自动生成菜单项后需要的重要修改grub-update是:

  • 授予正确的 UUID 已设置。请注意,search命令linux使用相同的 UUID,因为整个备份最终位于单个分区中。
  • vmlinuz 和 initrd 必须在“/boot/”中搜索,并且使用自动符号链接不需要维护
  • linux 命令必须使用,root=UUID=...因为 /dev/sdb4 随机更改为 sdc4 并且不可靠
  • 不要使用 PARTUUID,因为它不起作用。

要恢复,请从备份启动,因此源路径将为 /,但目标路径将是您必须安装的其他路径。

以防万一您没有运行主根备份过程太长时间:

  • 从工作备份根启动
  • 创造来自主根 FS 的第二个备份
  • 将工作备份根恢复到主根 FS 上
  • 从主根 FS 启动
  • 一旦发现某些内容丢失或错误,请从刚刚创建的第二个备份中获取所需内容。

我希望你能像我现在在台式电脑上一样平静,不间断,并且需要通过关键更新来更新核心系统文件! :)

相关内容