Чому команда “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.