Почему команда «ls» показывает права доступа к файлам в разделе FAT32?

40

Я считаю, что файловая система FAT32 не поддерживает права доступа к файлам, однако, когда я делаю ls -lна раздел FAT32, ls -lпоказывает, что файлы имеют разрешения:

-rw-r--r-- 1 john john 11 Mar 20 15:43 file1.txt
-rw-r--r-- 1 john john 5 Mar 20 15:49 file2.txt

Почему ls -lотображаются права доступа к файлам?

user342731
источник
Хороший вопрос! Добро пожаловать
0xSheepdog

Ответы:

71

Файловая система, хранящаяся на диске, не хранит разрешения для файлов, но драйвер файловой системы должен предоставлять их операционной системе, поскольку они являются неотъемлемой частью концепции файловой системы Unix, а интерфейсы системных вызовов не могут представить, что разрешения отсутствует.

Также подумайте, что произойдет, если у файла вообще не будет битов разрешения? Будет ли это так же, как 0777, то есть доступ ко всем; или так же, как 0000, т.е. нет доступа ни к кому? Но оба они имеют права доступа к файлам, так почему бы не показать их? Или сделайте что-нибудь более полезное и у вас есть возможность установить разумные разрешения.

Таким образом, драйвер подделывает некоторые разрешения, одинаковые для всех файлов. Разрешения вместе с владельцем и группой файлов настраиваются во время монтирования. Они описаны в разделе «Опции монтирования для сала» на странице руководства mount (8) :


Параметры монтирования для fat (Примечание: fat - это не отдельная файловая система, а общая часть файловых систем msdos, umsdos и vfat.)

uid=valueи gid=value
установите владельца и группу всех файлов. (По умолчанию: UID и GID текущего процесса.)

umask=value
Установите umask (битовая маска разрешений, которых нет). По умолчанию используется umask текущего процесса. Значение дано в восьмеричном виде.

dmask=value
Установите umask, примененный только к каталогам. По умолчанию используется umask текущего процесса. Значение дано в восьмеричном виде.

fmask=value
Установите umask, примененный только к обычным файлам. По умолчанию используется umask текущего процесса. Значение дано в восьмеричном виде.

Обратите внимание, что разрешения представлены в виде масок, поэтому окончательные разрешения являются отрицанием маски. fmask=0133приведет ко всем файлам, имеющим разрешения 0644, или rw-r--r--.

Кроме того, значения по умолчанию наследуются от вызова процесса mount(), поэтому, если вы вызываете mountиз командной строки, оболочки umaskбудут применяться.

ilkkachu
источник
7
И причина, по которой он фальсифицирует разрешения, заключается в том, что в противном случае ls и любая другая программа, которая проверяла права доступа к файлу (даже просто ваш код, пытающийся прочитать файл), должны были бы иметь логику для обработки всех различных встроенных организаций файловой системы.
Джеймс
4
@jamesqf, да, и даже интерфейсы системных вызовов не имеют опции «не иметь разрешений», так как разрешения всегда были там. (Это было то, о чем я думал, когда писал, что они являются «неотъемлемой частью».) Следовательно, права доступа всегда будут присутствовать, и такие вещи, как ACL, будут созданы для того, чтобы они были значимыми.
ilkkachu
2
Обычно я видел режим 777 для всех файлов в файловых системах FAT (по крайней мере, FAT16 со старым драйвером).
лес
2
@forest, который зависит от umaskопции монтирования, для которой значением по умолчанию является umask mountпроцесса (см. справочную страницу, на которую ссылается этот ответ).
Руслан
Но FAT делает сохранить некоторые разрешения / атрибутов (только для чтения, скрытый, системный и т.д.), даже если они не отображаются в точности те Unix. chmod ugo-wдля файла включит атрибут только для чтения. Использование fmask=0133опции, как в вашем примере, приведет не ко всем файлам с разрешением 0644. То, что FAT абсолютно не хранит, это uid и gid для каждого файла. Просьба уточнить; ответ в его нынешнем виде очень вводит в заблуждение.
Мосви
22

Но файлы имеют разрешения. Пользователь john имеет доступ к RW, а некоторые случайные пользователи имеют доступ только для чтения. Эти разрешения были получены не от самой файловой системы, а от параметров монтирования (-o uid / gid / umask), что не делает их менее реальными.

Вы можете смонтировать несколько разделов vfat с разными опциями, и вы можете использовать ls, чтобы определить, что это за опции. Вы даже можете использовать команду mount --bind, чтобы в одном каталоге содержались файлы из разных разделов vfat, и ls правильно показывал бы, какие разрешения были указаны для каждого файла.

Роман Одайский
источник
15

lsне знает о файловой системе FAT32, он знает только о файловой системе (VFS) Интерфейс виртуального выставленного ядра с POSIX open/ readdir/ statсистемных вызовов.

Linux не поддерживает концепцию файлов , которые не имеют пользователь / группа / другие биты разрешения, struct statпросто содержит mode_t st_mode;элемент (и UID, GID членов) , что ядро должно заполнить , когда ls -lделает stat(2)системные вызовы.

Не существует специального кода, который означает «недоступен» или «неприменим» для любого из этих полей, поэтому драйвер ядра vfat должен что-то придумать. FAT16 / FAT32 имеет флаг только для чтения, но в противном случае владелец / группа зависят от параметров монтирования, как и umask.

Питер Кордес
источник