相关文章
同步和备份程序
系统维护#备份
数据静止加密#磁盘加密场景下的备份
磁盘克隆
将安装迁移到新硬件
文件恢复
系统备份是备份操作系统、文件以及系统特定有用/必需数据的过程。[它]主要确保不仅保存系统中的用户数据,还保存系统的状态或运行状况。这有助于将系统恢复到上次保存的状态以及所有选定的备份数据。[1][死链接 2025-11-17—HTTP 404]
一种常见且通常有效的方法是遵循 3-2-1 策略
保留数据的三个副本,
使用两种不同的存储介质,
将一个副本异地存储。
使用 Btrfs 快照
请参阅 Btrfs#快照、#快照和 /boot 分区,以及 Snapper。
使用 LVM 快照
请参阅 LVM#快照、使用 LVM 创建根文件系统快照,以及 #快照和 /boot 分区。
使用 rsync
请参阅 rsync#作为备份工具。
使用 tar
请参阅 使用 tar 进行全系统备份。
使用 SquashFS
请参阅 使用 SquashFS 进行全系统备份。
注意 SquashFS 不支持 ACL。
可引导备份
在文件系统损坏或更新破坏系统的情况下,拥有可引导的备份会很有用。备份还可以用作更新的测试平台,启用测试仓库等。如果您将系统转移到另一个分区或驱动器并希望从中引导,过程就像更新备份的/etc/fstab和引导加载程序的配置文件一样简单。
本节假定您已将系统备份到另一个驱动器或分区,您当前的引导加载程序工作正常,并且您也希望从备份引导。
更新 fstab
无需重新启动,编辑备份的 fstab 文件,注释掉或删除任何现有条目。为包含备份的分区添加一个条目,如下例所示:
/dev/sdaX / ext4 defaults 0 1
请记住使用正确的设备名称和文件系统类型。
更新引导加载程序的配置文件
对于 Syslinux,您只需复制当前条目,但指向不同的驱动器或分区。
提示 您也可以在引导时临时编辑菜单,而不是编辑syslinux.cfg。当菜单显示时,按Tab键并更改相关条目。分区从一开始计数,驱动器从零开始计数。
对于 GRUB,建议您 自动重新生成主配置文件。如果您想将所有 GRUB 文件全新安装到/boot以外的位置,例如/mnt/newroot/boot,请使用--boot-directory标志。
还要验证/boot/grub/grub.cfg中的新菜单项。确保 UUID 与新分区匹配,否则仍可能引导旧系统。使用 lsblk 查找分区的 UUID
$ lsblk -no NAME,UUID /dev/sdXY
其中/dev/sdXY是所需分区(例如/dev/sdb3)。要列出 GRUB 认为可以引导的分区的 UUID,请使用grep
# grep UUID= /boot/grub/grub.cfg
首次引导
重新启动计算机并在引导加载程序中选择正确的条目。这将首次加载系统。所有外围设备都应被检测到,并且/目录中的空文件夹将被填充。
现在您可以重新编辑/etc/fstab以添加先前删除的分区和挂载点。
快照和 /boot 分区
如果您的 文件系统支持快照(例如 LVM 或 Btrfs),这些快照很可能不包括/boot分区或 ESP。
您可以使用 pacman hook 在内核更新时将引导分区自动复制到您的root分区(确保 hook 文件属于 root)
/etc/pacman.d/hooks/55-bootbackup_pre.hook
[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Path
Target = usr/lib/modules/*/vmlinuz
[Action]
Depends = rsync
Description = Backing up pre /boot...
When = PreTransaction
Exec = /usr/bin/bash -c 'rsync -a --mkpath --delete /boot/ "/.bootbackup/$(date +%Y_%m_%d_%H.%M.%S)_pre"/'
/etc/pacman.d/hooks/95-bootbackup_post.hook
[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Path
Target = usr/lib/modules/*/vmlinuz
[Action]
Depends = rsync
Description = Backing up post /boot...
When = PostTransaction
Exec = /usr/bin/bash -c 'rsync -a --mkpath --delete /boot/ "/.bootbackup/$(date +%Y_%m_%d_%H.%M.%S)_post"/'
自动化
仅手动创建的备份在需要时很少是最新的。因此,建议设置一个自动化流程以确保备份过程定期执行。最常见的解决方案由 systemd/Timers 和 Cron 提供。
对于需要对所有文件进行读取访问的本地系统范围备份,以下 systemd 定时器和服务单元可用作自动化备份流程的模板。
要使用timer单元,请像启用和启动其他单元一样启用并启动它。
/etc/systemd/system/backup.timer
[Unit]
Description=Timer for backups
[Timer]
OnCalendar=weekly
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
以下示例配置为使用最少的必需权限运行,同时阻止普通用户进行修改以提高安全性。
请注意,此示例将在备份运行时启动时阻止关机过程。这确保了备份不会中断,但如果需要保存大量新文件,可能会导致关机/重启延迟。
/etc/systemd/system/backup.service
[Unit]
Description=Backup system
[Service]
Type=simple
User=backupuser
AmbientCapabilities=CAP_DAC_READ_SEARCH
CapabilityBoundingSet=CAP_DAC_READ_SEARCH
DevicePolicy=closed
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateTmp=yes
ProtectClock=yes
ProtectControlGroups=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelModules=yes
ProtectKernelTunables=yes
ProtectProc=invisible
ProtectSystem=full
RemoveIPC=yes
RestrictAddressFamilies=AF_UNIX
RestrictNamespaces=yes
RestrictRealtime=yes
RestrictSUIDSGID=yes
SystemCallFilter=@system-service
UMask=7007
ExecStart=/usr/local/bin/backup.sh
ExecStop=bash -c 'if [ -n "$MAINPID" ]; then tail --pid="$MAINPID" -f /dev/null; fi'
CAP_DAC_READ_SEARCH设置了绕过文件系统中文件读取权限检查的能力;因此,文件系统中的所有文件都将可访问,而无需 root 权限。
对于远程备份,请允许使用网络协议
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6