如何对整个硬盘及分区表做完整增量可搜索备份?UEFI环境实现方法
当然有办法!UEFI时代虽然多了个EFI分区,但整套备份逻辑其实和MBR时代一脉相承,只是需要多照顾几个关键点而已。我给你梳理一套既完整支持增量、又能直接搜索的方案:
一、先搞定分区表与引导核心备份
UEFI用的是GPT分区表,不像MBR只存开头63扇区,GPT有主分区表+备份分区表的冗余设计,所以备份要更严谨:
- 备份GPT分区表:用
sgdisk工具(比dd更靠谱的GPT管理工具),执行:
这个文件很小(只有1KB左右),一定要存到安全的外部存储里。sgdisk --backup=/path/to/your-gpt-backup.gpt /dev/sda - 额外备份GPT备份头:GPT的备份分区表存在硬盘最后34个扇区,如果开头的主分区表损坏,这个备份头能救场,命令:
dd if=/dev/sda of=/path/to/gpt-backup-header.img bs=512 count=34 skip=$(( $(blockdev --getsz /dev/sda) - 34 )) - 备份EFI分区:EFI分区是FAT32格式,里面存的是UEFI引导文件,用
rsync做增量备份最方便(比dd镜像省空间,而且文件可直接查看):
要是你偏好镜像备份,也可以用rsync -avh --delete /boot/efi/ /path/to/efi-backup-directory/dd if=/dev/sda1 of=/path/to/efi.img bs=512,但rsync更适合长期增量维护。
二、主分区(/)的增量可搜索备份
这部分和MBR时代的rsync逻辑几乎一样,只是优化了参数保证完整性:
- 基础增量备份命令:
解释下关键参数:rsync -avhAX --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/root-backup/-A保留文件ACL权限,-X保留扩展属性--delete同步删除备份目录里已在源目录删除的文件,保证备份和当前系统一致--exclude排除虚拟文件系统和临时目录,这些内容完全没必要备份
- 版本化增量备份(更方便回滚与搜索):
用--link-dest参数让新备份硬链接到上一次的备份文件,这样只有变化的文件会占用新空间,每个备份都是完整的系统视图,还能直接搜索:
之后你可以直接在# 假设上次备份目录是 /path/to/root-backup-20240501 rsync -avhAX --delete --link-dest=/path/to/root-backup-20240501 --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/root-backup-$(date +%Y%m%d)/path/to/root-backup-20240502里用find、grep搜索文件,和在本地系统里操作完全一样。
三、Swap分区的处理
Swap分区里存的是临时内存交换数据,重启就清空了,完全不需要备份。但你需要记录它的UUID,方便恢复时重新创建:
- 记录Swap UUID:
把输出里的UUID记下来,恢复时用blkid /dev/sda3 | grep UUIDmkswap /dev/sda3创建新swap,再修改/etc/fstab把UUID设回原来的值就行。
四、恢复操作的关键步骤
如果哪天系统挂了,按这个顺序恢复:
- 恢复GPT分区表:先运行
sgdisk --load-backup=/path/to/your-gpt-backup.gpt /dev/sda,要是主分区表损坏,先恢复备份头:dd if=/path/to/gpt-backup-header.img of=/dev/sda bs=512 count=34 seek=$(( $(blockdev --getsz /dev/sda) - 34 )) - 恢复EFI分区:如果是rsync备份,直接挂载新的EFI分区后同步:
镜像备份的话就用mount /dev/sda1 /mnt/efi rsync -avh /path/to/efi-backup-directory/ /mnt/efi/dd if=/path/to/efi.img of=/dev/sda1 bs=512。 - 恢复主分区:挂载新的根分区后同步备份:
mount /dev/sda2 /mnt/root rsync -avhAX /path/to/root-backup/ /mnt/root/ - 修复引导:挂载EFI和根分区后,重新安装GRUB(以x86_64架构为例):
mount --bind /dev /mnt/root/dev mount --bind /proc /mnt/root/proc mount --bind /sys /mnt/root/sys chroot /mnt/root grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB update-grub exit - 重建Swap分区:按照之前记录的UUID创建swap,更新
/etc/fstab。
一些实用小贴士
- 定期验证备份:比如把备份的根分区挂载到本地,检查关键文件(比如
/etc/passwd、/boot/vmlinuz)是否完整,测试分区表恢复是否正常。 - 自动化备份:把这些命令写成脚本,用
cron定时运行,比如每周日凌晨2点自动做增量备份,省得手动操作。 - 可搜索性保障:因为rsync备份的是真实的文件系统结构,所以你可以直接用系统自带的搜索工具(比如
find、rg)在备份目录里查找文件,和本地系统毫无区别。
内容的提问来源于stack exchange,提问作者Mephisto




