是否可以创建一个拒绝取消链接/删除的缓存目录?

是否可以创建一个拒绝取消链接/删除的缓存目录?

我有一个缓存目录,用于存储下载后永远不会更改的文件。但是,使用此缓存目录的程序会从缓存中删除文件。是否有任何机制(如熔断/绑定选项)允许我创建一个拒绝的 rw 目录unlink

答案1

Linux 中已经为某些文件系统实现了这样的功能:附加模式属性。该属性只能由用户(或足够的能力)。从chattr:

属性

设置了“a”属性的文件只能在以下位置打开附加模式用于写作。只有超级用户或拥有 CAP_LINUX_IMMUTABLE 能力的进程才能设置或清除该属性。

实际上,即使没有明确描述,这也会影响目录:人们可以在其中添加(或链接)文件,但不能再删除或重命名它们。

至少支持属性外部4,xfsBTFS(但例如不在临时文件系统) 文件系统。

完整的例子。正常行为:

$ 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.

相关内容