Warum zeigt der Befehl "ls" die Berechtigungen von Dateien in einer FAT32-Partition an?

40

Ich glaube, dass das FAT32-Dateisystem keine Dateiberechtigungen unterstützt. Wenn ich dies jedoch ls -lauf einer FAT32-Partition tue , ls -lzeigt dies, dass die Dateien über Berechtigungen verfügen:

-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

Warum werden ls -ldie Berechtigungen von Dateien angezeigt?

user342731
quelle
Gute Frage! Willkommen
0xSheepdog

Antworten:

71

Das auf der Festplatte gespeicherte Dateisystem speichert keine Dateiberechtigungen, der Dateisystemtreiber muss sie jedoch dem Betriebssystem zur Verfügung stellen, da sie ein integraler Bestandteil des Unix-Dateisystemkonzepts sind und die Systemaufrufschnittstellen keine Möglichkeit haben, die Berechtigungen darzustellen fehlt.

Überlegen Sie auch, was passieren würde, wenn eine Datei überhaupt keine Berechtigungsbits hätte. Wäre es dasselbe wie 0777, dh Zugang zu allen? oder das gleiche wie 0000, dh kein zugriff auf jemanden? Bei beiden handelt es sich jedoch um Dateiberechtigungen. Warum sollten Sie sie nicht anzeigen? Oder tun Sie etwas Nützlicheres und haben Sie die Möglichkeit, sinnvolle Berechtigungen festzulegen.

Der Treiber fälscht also einige Berechtigungen, die für alle Dateien gleich sind. Die Berechtigungen sowie der Eigentümer und die Gruppe der Dateien können zum Zeitpunkt der Bereitstellung konfiguriert werden. Diese werden unter "Mount-Optionen für Fat" in der Manpage mount (8) beschrieben :

Mount-Optionen für fat
(Hinweis: fat ist kein separates Dateisystem, sondern ein gemeinsamer Bestandteil der Dateisysteme msdos, umsdos und vfat.)

uid=valueund gid=value
Legen Sie den Eigentümer und die Gruppe aller Dateien fest. (Standard: die UID und GID des aktuellen Prozesses.)

umask=value
Legen Sie die umask fest (die Bitmaske der Berechtigungen, die nicht vorhanden sind). Die Standardeinstellung ist die umask des aktuellen Prozesses. Der Wert wird in Oktal angegeben.

dmask=value
Stellen Sie die umask ein, die nur auf Verzeichnisse angewendet wird. Die Standardeinstellung ist die umask des aktuellen Prozesses. Der Wert wird in Oktal angegeben.

fmask=value
Legen Sie die Umask fest, die nur auf reguläre Dateien angewendet werden soll. Die Standardeinstellung ist die umask des aktuellen Prozesses. Der Wert wird in Oktal angegeben.

Beachten Sie, dass die Berechtigungen als Masken dargestellt werden, sodass die endgültigen Berechtigungen die Negation der Maske sind. fmask=0133würde dazu führen, dass alle Dateien Berechtigungen haben 0644, oder rw-r--r--.

Außerdem werden die Standardeinstellungen vom Prozessaufruf übernommen. mount()Wenn Sie also mountvon der Befehlszeile aus aufrufen , umaskgelten die Shell- Einstellungen.

ilkkachu
quelle
7
Und der Grund, warum die Berechtigungen gefälscht werden, ist, dass andernfalls ls und jedes andere Programm, das sich mit Dateiberechtigungen befasst (auch nur Ihr Code, der versucht, eine Datei zu lesen), die Logik haben müsste, um alle verschiedenen eingebauten Dateisystemorganisationen zu handhaben.
Jamesqf
4
@jamesqf, ja, und sogar die Systemaufrufschnittstellen haben nicht die Option, "keine Berechtigungen zu haben", da die Berechtigungen immer vorhanden waren. (Das habe ich gedacht, als ich schrieb, dass sie ein "integraler Bestandteil" sind.) Daher sind die Berechtigungen auch immer vorhanden, und Dinge wie ACLs werden so erstellt, dass sie aussagekräftig bleiben.
ilkkachu
2
Normalerweise habe ich den Modus 777 für alle Dateien in FAT-Dateisystemen gesehen (mindestens FAT16 mit einem alten Treiber).
Wald
2
@forest, das von der umaskMount-Option abhängt. Der Standardwert ist umask of mountprocess (siehe die in dieser Antwort verlinkte Manpage).
Ruslan
Aber FAT hat einige Berechtigungen speichern / Attribute (schreibgeschützt, versteckt, System, usw.), auch wenn sie den Plan nicht genau auf die Unix diejenigen. chmod ugo-wIn einer Datei wird das schreibgeschützte Attribut aktiviert. Wenn Sie die fmask=0133Option wie in Ihrem Beispiel verwenden, haben nicht alle Dateien die Berechtigung 0644. Was FAT absolut nicht speichert, ist eine UID und eine GID für jede Datei. Bitte klären Sie; Die Antwort ist in der jetzigen Form sehr irreführend.
Mosvy
22

Die Dateien haben jedoch Berechtigungen. Benutzer john hat RW-Zugriff, während einige zufällige Benutzer nur Lesezugriff haben. Diese Berechtigungen stammen nicht aus dem Dateisystem selbst, sondern aus den Mount-Optionen (-o uid / gid / umask), wodurch sie nicht weniger real werden.

Sie könnten mehrere vfat-Partitionen mit unterschiedlichen Optionen bereitstellen und mithilfe von ls ermitteln, welche Optionen dies sind. Sie könnten sogar mount --bind verwenden , um ein einziges Verzeichnis mit Dateien aus verschiedenen vfat-Partitionen zu erstellen, und ls würde korrekt anzeigen, welche Berechtigungen für jede Datei angegeben wurden.

Roman Odaisky
quelle
15

lsweiß nichts von FAT32, es kennt nur über die virtuelle Dateisystem (VFS) -Schnittstelle vom Kernel mit POSIX ausgesetzt open/ readdir/ statSystemaufrufen.

Linux nicht das Konzept von Dateien unterstützen , die nicht haben , Benutzer / Gruppe / anderen Berechtigungs - Bits struct statenthält einfach ein mode_t st_mode;Element (und uid, gid Mitglieder) , dass der Kernel muss ausfüllen, wenn ls -lmacht stat(2)Systemaufrufe.

Es gibt keinen speziellen Code, der für eines dieser Felder "nicht verfügbar" oder "nicht zutreffend" bedeutet, daher muss sich der vfat-Treiber des Kernels etwas ausdenken . FAT16 / FAT32 verfügt zwar über ein schreibgeschütztes Flag, ansonsten stammen der Besitzer / die Gruppe aus den Mount-Optionen, und auch eine Umask.

Peter Cordes
quelle