我有一个缓存目录,用于存储下载后永远不会更改的文件。但是,使用此缓存目录的程序会从缓存中删除文件。是否有任何机制(如熔断/绑定选项)允许我创建一个拒绝的 rw 目录unlink
?
答案1
Linux 中已经为某些文件系统实现了这样的功能:附加模式属性。该属性只能由根用户(或足够的能力)。从chattr
:
属性
设置了“a”属性的文件只能在以下位置打开附加模式用于写作。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 能力的进程才能设置或清除该属性。
实际上,即使没有明确描述,这也会影响目录:人们可以在其中添加(或链接)文件,但不能再删除或重命名它们。
至少支持属性外部4,xfs和BTFS(但例如不在临时文件系统) 文件系统。
完整的例子。正常行为:
$ mkdir mytest
$ echo 1 > mytest/foo
$ mv mytest/foo mytest/bar
$ echo 2 > mytest/foo
$ rm mytest/foo
现在设置了属性:
$ sudo chattr +a mytest
$ echo 3 > mytest/foo
$ rm mytest/foo
rm: cannot remove 'mytest/foo': Operation not permitted
$ rm mytest/bar
rm: cannot remove 'mytest/bar': Operation not permitted
$ mv mytest/foo mytest/baz
mv: cannot move 'mytest/foo' to 'mytest/baz': Operation not permitted
这不会影响文件本身,因为它们没有收到附加模式属性本身:
$ echo 4 >> mytest/foo
$ echo 5 >> mytest/bar
$ cat mytest/foo
3
4
$ cat mytest/bar
1
5
它们仍然可以被截断:
$ : > mytest/foo
$ cat mytest/foo
$
或者在其他地方链接/取消链接:
$ mkdir mytest2
$ ln mytest/foo mytest2/foo
$ rm mytest2/foo
$
消除甚至适用于的限制的唯一方法根,是为了根删除仅附加属性与chattr -a mytest
.