跳转至内容

系统备份

来自 ArchWiki

系统备份是备份操作系统、文件以及系统特定有用/必需数据的过程。[它]主要确保不仅保存系统中的用户数据,还保存系统的状态或运行状况。这有助于将系统恢复到上次保存的状态以及所有选定的备份数据。[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 分区

如果您的 文件系统支持快照(例如 LVMBtrfs),这些快照很可能不包括/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/TimersCron 提供。

对于需要对所有文件进行读取访问的本地系统范围备份,以下 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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.