Timeshift
Timeshift 是由 Tony George 最初创建的一个工具,现已成为 Xapp 项目的一部分。
Timeshift 可帮助在固定时间间隔内创建文件系统的增量快照,然后可在以后恢复以撤销对系统的所有更改。
它支持所有文件系统的 rsync 快照,并利用内置快照功能来支持配置为使用 @ 和 @home 子卷布局的 Btrfs 驱动器,分别用于 根和 home 目录。
安装
安装 timeshift 包并 启用/启动您选择的 cron 计划程序(请参阅 cron#Configuration)。这将确保 Timeshift 应用程序中计划的快照按预期运行。
或者,可以安装 timeshift-systemd-timerAUR 来代替使用 cron 计划程序。
配置
Timeshift 可以通过 timeshift-gtk 图形用户界面进行完全配置,但如果无法运行图形应用程序,则可以直接编辑其配置文件。将模板文件 /etc/timeshift/default.json 复制到 /etc/timeshift/timeshift.json 并编辑您想更改的设置。
- 如果您想启用 btrfs 模式,请确保您的子卷布局是兼容的。请参阅 #配置 btrfs 快照。
- 排除模式是从上到下应用的,第一个匹配项会覆盖后续的匹配项。
- Btrfs 模式不支持排除选项。请参阅 #从 Btrfs 快照中排除目录。
这是一个基于 rsync 的配置示例,它保留三个每周快照,并设置规则排除 /var/cache、/var/tmp 和 /home/archie 目录,同时将 /home/archie/.config 目录及其内容包含到快照中。
/etc/timeshift/timeshift.json
{
"backup_device_uuid" : "root-partition UUID",
"do_first_run" : "false",
"btrfs_mode" : "false",
"include_btrfs_home_for_backup" : "false",
"include_btrfs_home_for_restore" : "false",
"schedule_weekly" : "true",
"count_weekly" : "3",
"date_format" : "%Y-%m-%d %H:%M:%S",
"exclude" : [
"/var/cache/**",
"/var/tmp/**",
"+ /home/archie/.config/***",
"/home/archie/**"
],
"exclude-apps" : []
}
用法
快照可以通过 timeshift-gtk 图形用户界面以及 timeshift 命令行用户界面工具进行管理。
timeshift 时,请使用 --scripted 键。列出快照
# timeshift --list
创建快照
# timeshift --create --comments "comment"
恢复快照
# timeshift --restore --snapshot "snapshot"
删除快照
# timeshift --delete --snapshot "snapshot"
配置 btrfs 快照
Timeshift 需要一个 扁平 Btrfs 布局,并带有用于 /(可选 /home)的子卷,分别命名为 /@ 和 /@home。
安装时创建受支持的 Btrfs 布局
以下说明假定您正在遵循 安装指南。
在 Btrfs 文件系统被 创建并 挂载到 /mnt 后,立即 创建名为 /mnt/@ 和 /mnt/@home 的子卷。 卸载 /mnt 并使用 subvol 参数挂载子卷。
# mount -o subvol=@ /dev/root_partition /mnt # mount --mkdir -o subvol=@home /dev/root_partition /mnt/home
正常进行安装。
将已安装的系统转换为兼容的 Btrfs 布局
以下说明假定系统安装在顶级(ID=5)子卷中,您可能需要根据您的配置进行调整。
首先,创建一个名为 /@ 的根目录快照并将其挂载到 /mnt。
# btrfs subvolume snapshot / /@ # mount -o subvol=@ /dev/root-partition /mnt
创建 /@home 子卷,将用户数据移入其中,并将其挂载到 /mnt/home。
# mv /mnt/home/* /@home # mount -o subvol=@home /mnt/home
将您的 EFI 系统分区挂载到 /mnt/esp(如果您有的话)。 chroot 到 /mnt,重新安装并重新配置 引导加载程序。对于带有 GRUB 的 amd64 EFI 系统,只需运行
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB # grub-mkconfig -o /boot/grub/grub.cfg
就足够了,但如果您使用任何其他没有自动配置的引导加载程序,则需要手动将 rootflags=subvol=@ 添加到内核选项(请参阅 Kernel parameters#Boot loader configuration)。
编辑 fstab 文件,使 / 的条目包含 subvol=@ 挂载选项,并为 /home 添加一个条目,其中包含 subvol=@home 挂载选项。以下是其可能外观的示例:
... UUID=d8efe946-8d28-40d6-943a-70af51a8d2cd / btrfs defaults,subvol=@ 0 0 UUID=d8efe946-8d28-40d6-943a-70af51a8d2cd /home btrfs defaults,subvol=@home 0 0 ...
退出 chroot,重新启动并使用 mount 命令确认所有操作都已正确完成。使用 mount -o subvolid=5 /dev/root-partition /mnt 挂载顶级目录并清理旧根目录。
从 Btrfs 快照中排除目录
Btrfs 模式不支持从快照中排除单个文件和目录。但是,可以通过在顶级目录中创建其他子卷并将它们挂载到目录的位置来在一定程度上解决此问题,这实际上将排除它们。
以下是如何排除 /var/log 目录的示例,以防止系统日志回滚,并在系统损坏后方便检查它们:
首先挂载顶级目录并在其中创建子卷。
# mount -o subvolid=5 /dev/root-partition /mnt # btrfs subvolume create /mnt/@var_log
向 fstab 添加一个新条目。
UUID=root-partition-UUID /var/log btrfs defaults,subvol=@var_log 0 0
GRUB 条目用于 btrfs 快照
要每次 生成 GRUB 配置时将快照添加到 GRUB 菜单,请安装 grub-btrfs 包。它附带 grub-btrfsd.service,可以 启用以在创建新快照时自动更新 GRUB 配置。
grub-btrfsd 需要 inotify-tools 包才能运行。为了让 grub-btrfsd 与 Timeshift 一起工作,请通过运行以下命令编辑服务:
# systemctl edit --full grub-btrfsd
并更改以下行:
ExecStart=/usr/bin/grub-btrfsd /.snapshots --syslog
更改为
ExecStart=/usr/bin/grub-btrfsd --syslog --timeshift-auto
保存更改后,重新启动服务。
故障排除
Timeshift GUI 在 Wayland 上无法启动
Xwayland 只允许启动 X 服务器的用户将其客户端连接到它(请参阅 Running GUI applications as root#Wayland)。
由于 Timeshift 需要 root 权限,尝试通过应用程序启动器或终端使用命令 timeshift-launcher 启动 Timeshift GUI 会导致错误,其中包含 xhost: command not found。
遇到此错误的用户也可能会看到他们的 身份验证代理提示输入密码,但输入密码后 Timeshift GUI 仍未启动。 [1][死链 2025-03-15—HTTP 404] 这是因为命令 timeshift-launcher 需要 xorg-xhost 包:请安装它。
如果 GTK 无法打开您的显示器,并且您在终端中收到警告消息,则表示 root 用户需要访问图形 X 服务器(显示 :0、:1 等)。
通常,只有启动图形会话的用户才能在您的合成器中打开新窗口,而您需要以 root 用户身份执行 timeshift,因此无法打开 GUI。
$ xhost +SI:localuser:root
删除按钮无效/"目录非空"错误
如果 GUI 中的删除按钮静默失败,并且 timeshift --delete --snapshot snapshot 产生以下结果:
E: ERROR: Could not destroy subvolume/snapshot: Directory not empty
这意味着快照包含一个或多个嵌套子卷,需要手动删除。为此,您需要挂载顶级子卷并查看子卷列表。
# mount -o subvolid=5 /dev/root_partition /mnt # btrfs subvolume list /mnt
如果您看到位于快照内的任何子卷,请确保它们不包含任何您想复制的内容,并通过运行以下命令删除它们:
# btrfs subvolume remove /mnt/timeshift-btrfs/snapshots/snapshot/@/path/to/subvolume
然后正常使用 timeshift 删除快照。或者,您可以通过运行 rm -rf /mnt/timeshift-btrfs/snapshots/snapshot 来删除整个快照以及所有嵌套的子卷。
通常,此问题发生的原因是 systemd-nspawn 会自动创建 /var/lib/machines 和 /var/lib/portables 子卷。您可以事先将它们创建为目录来避免此问题 [2]。
# mkdir -p /var/lib/machines /var/lib/portables