我计划将 btrfs 用于 NAS 系统。
现在我想知道是否可以在文件/文件夹级别将内容回滚到快照。我问这个问题是因为通常只想回滚单个项目,同时保持驱动器其余部分的状态。
是否有一些本地方法可以做到这一点,或者如果没有,如何最好地实现这一目标?我读从 btrfs 快照恢复单个文件,无需执行完整复制这似乎是一种方法,但不太方便。不过,这可能是最好的方法。
答案1
拍摄快照基本上会创建一个子卷,该子卷可以在基本卷的目录结构中访问。从那里,只要有适当的权限,就可以浏览它并复制文件或文件夹。--reflink
复制选项似乎不需要,虽然这更好,所以复制时不会重复。
使用 btrfs 工具
(可选)为快照创建子卷:
btrfs subvolume create .my_snapshots
创建快照:
btrfs subvolume snapshot -r /mnt_point /mnt_point/.my_snapshots/snapshot1
使用该-r
标志使快照只读(https://wiki.archlinux.org/index.php/btrfs#Snapshots)。
如果不先创建子卷并且不使其只读,它可能看起来像这样:
btrfs subvolume snapshot /mnt_point /mnt_point/snapshot1
然后可以通过从快照复制文件或文件夹来实现恢复:
cp /mnt_point/.my_snapshots/snapshot1/sub/dir/file /sub/dir/file
(源自https://lore.kernel.org/linux-btrfs/[电子邮件受保护]/t/#m16db5d9f29d26f41a8adb4499ffe3e220a85d9b8)
外部工具(以 snapper 为例)
使用 snapper 等外部工具有一些好处,因为它们使处理快照更加方便并且具有有用的功能。
首先,需要为要为其创建快照的(子)卷创建一个配置文件:
snapper -c config-name create-config /mnt_point
这将创建一个名为config-name
.请注意,这通常还可以创建基于时间的自动快照以及在某些逻辑之后清理快照的规则。请注意,此类规则不会删除手动创建的快照。
然后可以使用以下命令手动拍摄快照:
snapper -c config-name create --description description-content
其中config-name
是先前创建的配置的名称,description-content
可以填写快照的一些描述。
(源自https://wiki.archlinux.org/index.php/Snapper)
然后,恢复的工作方式与上面的 btrfs 工具部分类似,访问已安装的快照并复制内容。
此外,snapper 还提供了一个命令,该命令也可用于根据以下内容撤消对当前卷的更改:openSUSE 文档。但请注意,这可能会导致数据不一致。还有红帽文档声明不要将该命令与根文件系统一起使用。
理论上,文件可以通过以下方式恢复:
snapper -c config-name -v undochange SNAPSHOT_ID..0 FILENAME
其中SNAPSHOT_ID
是要恢复的快照的 ID(并..0
指示文件恢复到主卷),FILENAME
是要恢复的文件的路径。还可以指定多个文件。
答案2
BTRFS 快照在子卷级别上工作。这意味着您可以“回滚”子卷,但不能“回滚”单个文件。
由于子卷在文件系统中显示为目录,因此可以说可以回滚目录。
为了回滚单个文件,我使用了引用链接副本,如您提供的链接所示。但是,我已经通过自动安装了相关的子卷,/etc/fstab
因此没有任何不便。
答案3
从航站楼出发
假设您使用 BTRFS 本机快照
浏览到/.snapshot/@timestamp_folder/subfolder
快照中文件所在的位置。然后运行以下命令并将单个文件“复制/同步”到新位置。
sudo rsync myfile.txt /shares/backups/restored/restored.txt
也可能适用于文件夹(尚未测试)。