29.4 UFS 磁盘快照
FreeBSD 提供了与软更新(Soft Updates)结合使用的文件系统快照功能。UFS 快照允许用户创建指定文件系统的镜像,可作为文件处理。
快照文件必须创建在所快照的文件系统内,每个 UFS 文件系统最多可创建 20 个快照。活动快照会记录在超级块中,并在系统重启后仍然存在。不再需要某个快照时,可使用 rm(1) 删除。尽管可以按任意顺序删除快照,但由于其他快照可能占用部分已释放的块,可能无法彻底回收所有已使用的空间。创建快照时,内核会设置 SF_SNAPSHOT 文件标志以防止意外修改。
29.4.1 创建快照
可使用 mksnap_ffs(8) 创建 / 的快照,并存储到 /.snap/snap1:
# mksnap_ffs /.snap/snap1技巧
mksnap_ffs 会自动对指定目录所在的文件系统创建快照,不支持直接指定文件系统。以上示例基于 UFS 标准安装,因此将对整个根分区创建快照。
也可以通过 mount(8) 创建快照。如果要将 / 的快照保存到文件 /home/ykla/snapshot/snap,可使用以下命令:
# mkdir -p /home/ykla/snapshot/
# mount -u -o snapshot /home/ykla/snapshot/snap /UFS 快照文件的大小等于其源文件系统的大小,但实际占用空间与 ZFS 类似:
# ls -loh /home/ykla/snapshot/snap # 逻辑占用存储
-r-------- 1 root ykla snapshot 19G May 1 01:55 /home/ykla/snapshot/snap
# du -hl /home/ykla/snapshot/snap # 真实占用存储
6.1M /home/ykla/snapshot/snap29.4.2 文件标志
SF_SNAPSHOT 文件标志在快照文件创建时设置(无论通过 mksnap_ffs(8) 还是 mount(8) 的 snapshot 操作),该标志可防止对快照文件的意外修改。不过,rm(1) 对快照文件做了例外处理,即使设有 SF_SNAPSHOT 标志也可以删除,无需事先清除该标志。
可使用 find(1) 查找文件系统中的快照文件,例如 /:
# find / -flags snapshot
/.snap/snap1
/home/ykla/snapshot/snap29.4.3 挂载快照
快照可作为文件系统的冻结镜像挂载。如果要以只读方式挂载快照 /home/ykla/snapshot/snap,可执行以下命令:
# mdconfig -a -t vnode -f /home/ykla/snapshot/snap -u 4
# mount -r /dev/md4 /mnt
# ls /mnt/
.snap dev libexec rescue var
.sujournal entropy media root
COPYRIGHT etc mnt sbin
bin home net tmp
boot lib proc usr选项说明:
| 参数 | 含义 |
|---|---|
-a | 创建 md 设备 |
-t vnode | 用文件作为磁盘 |
-f file | 指定快照文件 |
-u 4 | 指定至 md4,防止冲突 |
挂载后,冻结的 / 即可通过 /mnt 访问,所有内容均保持快照创建时的状态。唯一例外是,任何更早的快照将显示为空文件。卸载快照可执行以下命令:
# umount /mnt
# mdconfig -d -u 429.4.4 参考文献
- McKusick M. McKusick.com[EB/OL]. [2026-04-30]. https://www.mckusick.com/. 有关软更新和文件系统快照的更多信息(包括技术论文),可访问 Kirk McKusick 的网站。