是否有支持自定义文件大小限制的文件系统?

是否有支持自定义文件大小限制的文件系统?

我知道 EXT4 有一个 max_dir_size_kb 挂载选项来设置每个目录的最大大小。不过,它没有类似的选项来指定单个文件的最大大小。有人知道另一个可以做到这一点的文件系统吗?我检查了 XFS、ZFS 和 ReiserFS,但没有找到任何东西,尽管我不是这些文件系统的专家。

更具体地说明我想要实现的目标:我想限制可以存储在 Samba 共享上的单个文件的大小(单个文件,而不是全局配额,例如防止用户存储超过给定大小的文件)。 Samba 没有此选项,并且 Linux /etc/security/limits.conf 也不适用于 Samba(请参阅https://askubuntu.com/questions/1315369/is-obey-pam-restrictions-still-supposed-to-work-in-samba-4-ubuntu-20-04,答案是:Samba 开发人员解释说,/etc/security/limits.conf 中设置的文件大小限制不会强制执行)。

所以我的想法是在文件系统级别定义该限制,但似乎没有文件系统支持此功能。

答案1

在 Lustre 2.12 及更高版本中,可以通过指定具有固定大小组件端且没有“最大文件”的 PFL 布局来指定每个文件、每个目录或每个文件系统的最大文件大小限制size”组件,例如:

   $ lfs setstripe -E 1G -c 1 /path/to/<file|directory>

在其下创建的文件directory大小限制为 1GiB(例如在日志目录中),如果directory是根目录,则适用于所有文件新的文件系统中的文件,除非另有说明。也就是说,你大概不想设置 Lustre 供您使用,除非您的 Samba 服务器需要很多容量/性能扩展。

向 ext4 添加这样的限制也不是很难。它已经必须处理不同的maxbytes值,具体取决于文件是块映射(旧样式,4TB 限制)还是范围映射(新样式,16TB 限制)。通过参数设置s_maxbytes和值将非常简单,并且很可能被上游接受(您可以同时修补服务器内核)。s_bitmap_maxbytes/sys/fs/ext4/<dev>/maxbytes

唯一棘手的部分是 sysfs 值应该用作降低限制与现有限制。不应将 maxbytes 设置为高于现有限制。如果参数设置得更高,则sysfs 处理程序中将需要一些代码来重置s_maxbytes和/或s_bitmap_maxbytes恢复到旧限制。maxbytes如果将其作为单独的参数存储在超级块中,则编码会更容易s_sysfs_maxbytes,但是每次使用时都需要检查它,这会慢一些,并且非常这些值不太可能在运行时改变。它还需要s_*_maxbytes用助手替换代码中的所有访问,例如:

loff_t ext4_inode_get_maxbytes(struct inode *inode)
{
        loff_t maxbytes;

        if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
                maxbytes = inode->i_sb->s_maxbytes;
        else
                maxbytes = EXT4_SB(inode->i_sb)->s_bitmap_maxbytes;

        if (maxbytes > EXT4_SB(inode->i_sb)->s_sysfs_maxbytes)
                maxbytes = EXT4_SB(inode->i_sb)->s_sysfs_maxbytes;

        return maxbytes;
}

即使具有相对基本的编码技能,这也可以由内核新手完成,主要是搜索剪切和替换。

相关内容