Чому команда “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відображаються дозволи файлів?


Гарне питання! Ласкаво просимо
0xSheepdog

Відповіді:


71

Файлова система, що зберігається на диску, не зберігає файлові дозволи, але драйвер файлової системи повинен надавати їх операційній системі, оскільки вони є невід'ємною частиною концепції файлової системи Unix, а інтерфейси системного виклику не можуть представити, що дозволи зниклий безвісти.

Також подумайте, що буде, якщо у файлу взагалі не було дозволів? Чи це було б те саме 0777, тобто доступ до всіх; або те саме 0000, тобто немає доступу до когось? Але обидва ці є права доступу до файлів, так чому б не показати їх? Або зробіть щось більш корисне і знайдіть спосіб встановити деякі розумні дозволи.

Отже, драйвер підробляє деякі дозволи, однакові для всіх файлів. Дозволи разом із власником файлів та групою можна настроювати під час монтажу. Вони описані у розділі "Параметри кріплення жиру" на ман-сторінці (8) :

Параметри
монтажу жиру (Примітка: жир - це не окрема файлова система, а загальна частина файлових систем 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.


7
І причина, в якій це підроблені дозволи, полягає в тому, що в іншому випадку ls, і будь-яка інша програма, яка розглядала дозволи файлів (навіть лише ваш код, який намагається прочитати файл), повинна мати логіку для обробки всіх різних організацій файлової системи, вбудованих у них.
jamesqf

4
@jamesqf, так, і навіть інтерфейси системного виклику не мають можливості "не мати дозволів", оскільки дозволи завжди були. (Про це я думав, коли писав, що вони є "невід'ємною частиною".) Тому дозволи завжди також є, і такі речі, як ACL, робляться так, щоб вони мали значення.
ilkkachu

2
Зазвичай я бачив режим 777 для всіх файлів у файлових системах FAT (принаймні FAT16 зі старим драйвером).
ліс

2
@forest, це залежить від umaskпараметра монтажу, для якого значенням за замовчуванням є umask mountпроцесу (див. сторінку man, посилання на яку у цій відповіді).
Руслан

Але FAT робить зберегти деякі дозволу / атрибутів (тільки для читання, прихований, системний і т.д.), навіть якщо вони не відображаються в точності ті Unix. chmod ugo-wу файлі буде увімкнено атрибут лише для читання. Використання fmask=0133параметра, як у вашому прикладі, не призведе до того, що всі файли мають дозвіл 0644. Те, що FAT абсолютно не зберігається, - це uid та gid для кожного файлу. Поясніть будь ласка; відповідь на даний момент є дуже оманливою.
mosvy

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.