在我们的服务器上,我们有一个 cron 作业,它定期调用chown
ZFSchmod
文件系统中的目录。通常这不会更改用户和权限,因为目录已经具有相同的属性。
还有另外一个 cron job 任务会定期创建该文件系统的快照。
圣诞节期间我独自一人在办公室,所以服务器上应该没有变化,但我发现 ZFS 快照不是空的。
已为池和数据集设置了以下属性:
compression=on (lz4)
atime=off
xattr=sa
acltype=posixacl
chown
如果andchmod
调用没有改变任何内容,为什么快照不为空?
有没有什么办法可以防止这种情况发生?
(不,我无法禁用该 cron 作业。)
发生这种情况的原因是两件事的结合。
当使用 chmod 将权限设置为原来的权限(强制)时,chmod 会打印一条消息,但实际上它仍会执行调用来设置文件上的更改模式。我们可以使用 strace 看到这一点
注意第 31 行上方对 的调用
fchmodat()
。这会导致操作系统将新的模式位写入 inode。ZFS 像 zpool 中的所有其他信息一样维护 inode 信息,并且它也是写时复制的。块被读取、修改,然后写回到磁盘,元数据被级联到根节点。尽管实际上不需要更改,但该更改在快照中是可见的。
根据 chmod 的实际实现,这可能会或可能不会在其他操作系统上发生。
编辑:删除了关于 atime 跟踪的评论,因为问题指出它已被禁用。
但确实如此。如果您重写以前的值,它们仍会被写入,并且文件条目也会被写入。这是一个变化。
为了防止这些“空”更改,您需要读取当前值,将它们与所需状态进行比较,并且仅在需要更改时才写入。
正如@paladin 指出的那样,可能存在一种更好的方法来处理文件权限。