如何使符号链接只读(`chattr +i /location/symlink`)?

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”?,但没有可以应用于此处的解决方案。

Ste*_*itt 7

这并没有提供解决方案,但它解释了为什么chattr可以使符号链接不可变。

\n

在 Linux 上,不可变属性是一组标志的一部分,这些标志使用FS_IOC_SETFLAGS ioctl. 从历史上看,这是首先在 ext2 中实现的,并且chattr它本身仍然是e2fsprogs. 当它尝试检索 flags时,在设置它们之前,chattr显式检查 it\xe2\x80\x99s 处理的文件是否是常规文件或目录:

\n
    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,但此后立即出现下一个障碍:

\n
    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)\n

ioctl对文件描述符进行操作,这意味着必须先打开目标,然后才能设置其标志。符号链接可以\xe2\x80\x99t 打开以与ioctl;一起使用 虽然在符号链接上open支持O_NOFOLLOWO_NOPATH,但前者本身将失败,并显示ELOOP,而后者将返回一个文件描述符,该文件描述符可以与 一起使用\xe2\x80\x99t ioctl

\n