Как сделать символическую ссылку доступной только для чтения (`chattr +i /location/symlink `)?

Вы пытаетесь запустить fsckна/dev/sd*(или любом другом )устройстве, которое ссылается на настоящий SD или его раздел, как на незашифрованном устройстве?

Если это так, то это устройство полностью зашифровано, и поэтому fsckне может понять его вообще. Если он обнаружит что-либо, распознаваемое как файловая система, это будет признаком dm-cryptнеработоспособности :предполагается, что зашифрованные данные выглядят как неописуемый псевдослучайный шум.

Вам нужно указать fsckна цель dm-crypt, которая, вероятно, будет называться /dev/mapper/<something>. И это требует использования cryptsetup, чтобы сначала открыть зашифрованное устройство, точно так же, как при подготовке к монтированию зашифрованного устройства, прежде чем пытаться запустить fsckна нем. Поскольку dm-cryptимеет несколько возможных режимов, я не могу предложить правильную команду cryptsetup, не зная больше о вашей настройке. Возможно, ваш файл /etc/crypttabможет содержать необходимые данные?

3
07.07.2020, 18:23
2 ответа

Это не дает решения, но объясняет, почему chattrнельзя сделать символическую ссылку неизменной.

В Linux неизменяемые атрибуты являются частью набора флагов, которые контролируются с помощьюFS_IOC_SETFLAGSioctl. Исторически это было впервые реализовано в ext2, и сам chattrдо сих пор является частью e2fsprogs. Когда он пытается получить флаги , прежде чем установить их, chattrявно проверяет, является ли обрабатываемый файл обычным файлом или каталогом :

.
    if (!lstat(name, &buf) &&
        !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
        goto notsupp;
    }

Можно было бы подумать, что удаление этих проверок или изменение их для разрешения символических ссылок также было бы хорошим первым шагом к разрешению chattrсделать символическую ссылку неизменяемой, но сразу после этого возникает следующее препятствие:

    fd = open (name, OPEN_FLAGS);
    if (fd == -1)
        return -1;
    r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);

ioctlработает с файловыми дескрипторами, что означает, что цель должна быть открыта, прежде чем можно будет установить ее флаги. Симлинки не могут быть открыты для использования с ioctl; в то время какopenподдерживает O_NOFOLLOWи O_NOPATHдля символических ссылок, первый сам по себе не будет работать с ELOOP, а второй вернет файловый дескриптор, который нельзя использовать с ioctl.

4
28.04.2021, 23:14

Поскольку комментировать не могу:

chattr, скорее всего, использует один из системных вызовов chmod, fchmod ()или fchmodat ()или ioctl (, в котором ничего не говорится о символических ссылках ). Правда, сейчас не могу найти. Используя справочные страницы Ubuntu, некоторые из них могли измениться.

Из справочной страницы chmod:

chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used. However, for each sym‐ bolic link listed on the command line, chmod changes the permissions of the pointed-to file. In contrast, chmod ignores symbolic links encoun‐ tered during recursive directory traversals.

Просматривая справочную страницу системных вызовов fchmod,chmod и fchmodat, ни одна из них не реализует их. Команда Chmod -просто разыменует путь, а системный вызов fchmodat ()не реализован в AT _SYMLINK _NOFOLLOW:

AT_SYMLINK_NOFOLLOW If pathname is a symbolic link, do not dereference it: instead operate on the link itself. This flag is not currently implemented.

0
28.04.2021, 23:14

Теги

Похожие вопросы