int*_*ika 5 ext4 symlink files xattr delete
我们如何锁定符号链接以使其无法被删除?
使用普通的文件/目录chattr +i /file/location
可以实现这一点,但是使用符号链接来实现这一点,我们得到chattr: Operation not supported while reading flags on my-file
。
还有一个类似的问题,如何为我的“/etc/resolv.conf”设置“chattr +i”?,但没有可以应用于此处的解决方案。
这并没有提供解决方案,但它解释了为什么chattr
可以使符号链接不可变。
在 Linux 上,不可变属性是一组标志的一部分,这些标志使用FS_IOC_SETFLAGS
ioctl
. 从历史上看,这是首先在 ext2 中实现的,并且chattr
它本身仍然是e2fsprogs
. 当它尝试检索 flags时,在设置它们之前,chattr
显式检查 it\xe2\x80\x99s 处理的文件是否是常规文件或目录:
if (!lstat(name, &buf) &&\n !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {\n goto notsupp;\n }\n
Run Code Online (Sandbox Code Playgroud)\n人们可能认为删除这些检查,或者更改它们以允许符号链接,将是允许符号链接不可变的良好第一步chattr
,但此后立即出现下一个障碍:
fd = open (name, OPEN_FLAGS);\n if (fd == -1)\n return -1;\n r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);\n
Run Code Online (Sandbox Code Playgroud)\nioctl
对文件描述符进行操作,这意味着必须先打开目标,然后才能设置其标志。符号链接可以\xe2\x80\x99t 打开以与ioctl
;一起使用 虽然在符号链接上open
支持O_NOFOLLOW
和O_NOPATH
,但前者本身将失败,并显示ELOOP
,而后者将返回一个文件描述符,该文件描述符可以与 一起使用\xe2\x80\x99t ioctl
。