跳转至内容

Timeshift

来自 ArchWiki

Timeshift 是由 Tony George 最初创建的一个工具,现已成为 Xapp 项目的一部分。

Timeshift 可帮助在固定时间间隔内创建文件系统的增量快照,然后可在以后恢复以撤销对系统的所有更改。

它支持所有文件系统的 rsync 快照,并利用内置快照功能来支持配置为使用 @@home 子卷布局的 Btrfs 驱动器,分别用于 home 目录。

安装

安装 timeshift 包并 启用/启动您选择的 cron 计划程序(请参阅 cron#Configuration)。这将确保 Timeshift 应用程序中计划的快照按预期运行。

注意 timeshift 包目前硬依赖 cronie 作为 cron 计划程序。

或者,可以安装 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

正常进行安装。

警告 如果 //homesubvolid 挂载参数是由 genfstab 生成的,请务必将其从 Fstab 文件中删除,否则恢复快照后将无法启动。

将已安装的系统转换为兼容的 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
警告 此命令可以允许任何本地用户访问您的 X 屏幕。不建议在多用户系统上运行 xhost。有关更多详细信息,请参阅 xhostRunning GUI applications as 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