Вы пытаетесь запустить fsck
на/dev/sd*
(или любом другом )устройстве, которое ссылается на настоящий SD или его раздел, как на незашифрованном устройстве?
Если это так, то это устройство полностью зашифровано, и поэтому fsck
не может понять его вообще. Если он обнаружит что-либо, распознаваемое как файловая система, это будет признаком dm-crypt
неработоспособности :предполагается, что зашифрованные данные выглядят как неописуемый псевдослучайный шум.
Вам нужно указать fsck
на цель dm-crypt
, которая, вероятно, будет называться /dev/mapper/<something>
. И это требует использования cryptsetup
, чтобы сначала открыть зашифрованное устройство, точно так же, как при подготовке к монтированию зашифрованного устройства, прежде чем пытаться запустить fsck
на нем. Поскольку dm-crypt
имеет несколько возможных режимов, я не могу предложить правильную команду cryptsetup
, не зная больше о вашей настройке. Возможно, ваш файл /etc/crypttab
может содержать необходимые данные?
Это не дает решения, но объясняет, почему chattr
нельзя сделать символическую ссылку неизменной.
В Linux неизменяемые атрибуты являются частью набора флагов, которые контролируются с помощьюFS_IOC_SETFLAGS
ioctl
. Исторически это было впервые реализовано в 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
.
Поскольку комментировать не могу:
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.