前几天,Roger 要求将一个额外功能加入我编写的 ZFS Automatic Snapshots SMF 服务。这个功能是,为每个文件系统配置多个快照计划的能力。

例如,我拥有一个 ZFS 文件系统,已为其配置了一个每周执行一次快照的快照服务,并让它们在系统上保留几个月时间。但是,在白天,我还希望系统每隔一小时可以自动获取该文件系统的快照,但是只保留前 6 个小时的快照。

“容易!”,我想——然后开始编写对该功能的支持。在这个过程中,我还添加了对新的 snapshot -r ZFS 功能的支持,现在 Solaris Nevada 中具有该功能,它的确提高了速度。

但是,当我思考这个功能时,很快就遇到了问题(真糟糕)。当时,每个快照服务的实例配置一组不同的自动快照。例如,这是我桌面上的:

root@haiiro[59] svcs auto-snapshot
STATE          STIME    FMRI
disabled       16:49:03 svc:/system/filesystem/zfs/auto-snapshot:space-test
online         16:08:55 svc:/system/filesystem/zfs/auto-snapshot:space-archive
online         16:08:55 svc:/system/filesystem/zfs/auto-snapshot:space-timf
online         16:08:55 svc:/system/filesystem/zfs/auto-snapshot:tank-root_files ystem
online         16:49:03 svc:/system/filesystem/zfs/auto-snapshot:default

每个实例的 FMRI 细致地限定了每组快照的边界——实例名称没有任何特殊意义,除了显示那一瞬间系统的状态。我获取快照所需的所有有用的信息实际上都存储在实例属性中。

但是,当我开始思考同一文件系统的多个实例时,我总是遇到名称空间冲突(不同于这些

我无法创建实例名称 "svc:/system/filesystem/zfs/auto-snapshot:space-timf:hourly""svc:/system/filesystem/zfs/auto-snapshot:space-timf@hourly""svc:/system/filesystem/zfs/auto-snapshot:space-timf$hourly"—— SMF 不允许实例名称中有这些字符。

我想我在寻求以某种方式细分实例——我曾考虑过在每个实例内有单独的属性组,每个组对应该文件系统的一个不同的计划,但是随后服务的粒度会出现问题:对于给定的文件系统,我无法禁止每小时一次的快照,同时启用每月一次的快照。这也许没关系?

我会继续思考这个问题。另外,我仍在为 cron 作业寻找将快照状态记录到 SMF 日志的最佳方式——将 cron 脚本的输出重定向到每个 FMRI 相应的 restarter/logfile 似乎不是正确的做法。也许再来点儿喝咖啡会有所帮助,但是不管怎么样,欢迎提供更多的想法!

Advertisements