TrueNAS SCALE ACL权限配置中递归应用和应用到子数据集两个选项的区别
最近刚刚开始折腾TrueNAS,也是在跟着大佬们学习中,不管是core还是scale,现在大家都喜欢用ACL来配置访问权限了,ACL权限里面又区分POSIX和NFSv4,但是不管是哪一种ACL,在保存权限的时候都能看到两个选项,“递归的应用权限”apply permissions recursively 和“应用权限到子数据集”apply permissions to child datasets,其中应用权限到子数据集这个选项要勾选了递归才能选择。
我自己在折腾的时候一直都不明白这两个选项到底是怎么发挥作用的,网上好像也没找到类似的教程或者说明,今天我自己研究了一下,把我研究出来的分享一下吧,如果有问题欢迎大佬们指出!
我这篇文章的测试环境是 TrueNAS SCALE 22.02.1版本,ACL版本用的是NFSv4。

这里插一句题外话,就是TrueNAS SCALE的ACL权限的继承还是有点问题的,就是在你新建了一个pool之后,你把pool的ACL版本设置成NFSv4之后,在pool下面新建dataset的时候,dataset的ACL版本是没法继承pool里面的ACL版本的,必须再次手动修改新增dataset的ACL版本才行。当dataset的ACL版本设置好了之后,dataset里面再新建dataset的时候ACL版本就能继承了。(然后我最后发现,既然如此,其实根本不需要设置pool的ACL版本了,只设置dataset的就好了,反正都没用。。。)

回归正题。
这里我主要对比三种情况:1.ACL配置完之后,不选择递归,直接保存。2.ACL配置完之后,选择递归,不选择子数据集。3.ACL配置完之后,选择递归,选择子数据集。
我在pool里面新建了第一级dataset叫做maintest1,在maintest1里面再新建了一个dataset叫做subtest1。然后在smb里面打开maintest1的访问权限。

现在开始配置ACL权限:
1、首先默认的owner@和group@不动,反正现在smb不能root用户登陆了,这里设置啥也没用。然后删掉everyone@选项,表示除了root没有人可以访问这个路径了。然后我们用账号g001登陆smb测试一下,确实无法访问了,说明ACL是生效的。


再回到ACL里面,添加一个user选项,加入一个我们之前创建好的用户g001,权限选择modify,不勾选递归,直接保存。

刷新smb,发现我可以正常的打开maintest1文件夹,可以看到文件夹里面原来有一个叫做subtest1的子dataset,一个new文件夹和一个123456的文件,这些文件都是我之前通过其他方式创建的,主要是为了配合我们这次的实验。

我这里是以g001的身份登陆的,ACL权限因为没有选递归,所以只配置到maintest1这一层,maintest1下面的文件和文件夹都没有被赋予ACL的权限,所以我无法进一步打开subtest1和new文件夹,也无法读取123456这个文件,但是我可以在maintest1这个文件夹下面新建和删除文件夹,因为我新建的文件夹所有权是g001。




2、然后回到ACL的配置页面,这次保存的时候把递归勾选上。

再回到maintest1文件夹,刷新一下。发现new文件夹可以打开了,包括new再里面一层的文件夹都可以打开了,也能新建文件了,因为我们上面选的递归生效了,这个递归会把该层文件夹下面的所有文件夹和文件都赋予你配置的ACL权限了。同理,123456的文件也能正常读取和修改了。


然后我们可以发现,subtest1仍然无法访问,这就说明ACL的递归对truenas创建的子dataset是无效的。

3、这就引出我们最后一个尝试方法了。
再回到ACL的配置页面,这次保存的时候把递归和子dataset的选项都勾选上。

再回到maintest1文件夹,刷新一下。发现subtest1文件夹可以打开了,包括subtest1再里面一层的文件夹都可以打开了,也能新建文件了。同时new文件夹依旧可以访问和修改。


通过这三个实验应该就能很明确配置ACL权限的时候,递归和子dataset这两个选项的区别了,大家实际使用的时候可以按需设置了!