Perché il comando "ls" mostra le autorizzazioni dei file in una partizione FAT32?


40

Credo che il file system FAT32 non supporti le autorizzazioni dei file, tuttavia quando lo faccio ls -lsu una partizione FAT32, ls -lmostra che i file dispongono delle autorizzazioni:

-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

Perché vengono ls -lvisualizzate le autorizzazioni dei file?


Buona domanda! Benvenuto
0xSheepdog

Risposte:


71

Il filesystem come archiviato su disco non memorizza le autorizzazioni dei file, ma il driver del filesystem deve fornirle al sistema operativo poiché sono parte integrante del concetto di filesystem Unix e le interfacce di chiamata del sistema non hanno modo di presentare che le autorizzazioni sono mancante.

Considera anche cosa accadrebbe se un file non avesse alcun bit di autorizzazione? Sarebbe lo stesso 0777, cioè l'accesso a tutti; o lo stesso di 0000, cioè nessun accesso a nessuno? Ma entrambi sono permessi sui file, quindi perché non mostrarli? O fai qualcosa di più utile e hai un modo per impostare alcune autorizzazioni sensibili.

Quindi, il driver falsa alcune autorizzazioni, le stesse per tutti i file. Le autorizzazioni insieme al proprietario e al gruppo dei file sono configurabili al momento del montaggio. Questi sono descritti in "Opzioni di mount per fat" nella pagina man mount (8) :

Opzioni di mount per fat
(Nota: fat non è un filesystem separato, ma una parte comune dei filesystem msdos, umsdos e vfat.)

uid=valuee gid=value
imposta il proprietario e il gruppo di tutti i file. (Impostazione predefinita: UID e GID del processo corrente.)

umask=value
Imposta umask (la maschera di bit delle autorizzazioni che non sono presenti). L'impostazione predefinita è umask del processo corrente. Il valore è indicato in ottale.

dmask=value
Imposta l'umask applicata solo alle directory. L'impostazione predefinita è umask del processo corrente. Il valore è indicato in ottale.

fmask=value
Imposta l'umask applicato solo ai file normali. L'impostazione predefinita è umask del processo corrente. Il valore è indicato in ottale.

Si noti che le autorizzazioni sono presentate come maschere, quindi le autorizzazioni finali sono la negazione della maschera. fmask=0133risulterebbe in tutti i file con autorizzazioni 0644o rw-r--r--.

Inoltre, i valori predefiniti vengono ereditati dalla chiamata del processo mount(), quindi se si chiama mountdalla riga di comando, umaskverranno applicate le shell .


7
E il motivo per cui falsa le autorizzazioni è che altrimenti ls, e qualsiasi altro programma che guardasse le autorizzazioni dei file (anche solo il tuo codice che prova a leggere un file) dovrebbe avere la logica per gestire tutte le diverse organizzazioni di file system integrate.
jamesqf

4
@jamesqf, yes, e anche le interfacce di chiamata di sistema non hanno l'opzione di "non avere le autorizzazioni", poiché le autorizzazioni sono sempre state lì. (Era quello che stavo pensando quando ho scritto che sono una "parte integrante".) Pertanto, anche i permessi devono essere sempre lì, e le cose come le ACL sono fatte in modo da renderle significative.
ilkkachu,

2
Di solito ho visto la modalità 777 per tutti i file nei filesystem FAT (almeno FAT16 con un vecchio driver).
foresta

2
La foresta dipende umaskdall'opzione mount, per la quale il valore predefinito è umask of mountprocess (vedere la pagina man collegata a questa risposta).
Ruslan,

Ma il grasso fa memorizzare alcune autorizzazioni / attributi (sola lettura, nascosto, di sistema, ecc), anche se non esattamente mappa a quelli Unix. chmod ugo-wsu un file attiverà l'attributo di sola lettura. L'uso fmask=0133dell'opzione come nell'esempio non comporterà che tutti i file abbiano l'autorizzazione 0644. Ciò che FAT non memorizza assolutamente è un uid e un gid per ogni file. Si prega di precisare; la risposta così com'è è molto fuorviante.
mosvy

22

Ma i file hanno le autorizzazioni. L'utente John ha accesso RW, mentre alcuni utenti casuali hanno solo accesso in lettura. Queste autorizzazioni non provenivano dal filesystem stesso ma piuttosto dalle opzioni di mount (-ouid / gid / umask), il che non le rende meno reali.

Potresti avere più partizioni vfat montate con diverse opzioni e puoi usare ls per determinare quali fossero quelle opzioni. Si potrebbe anche usare mount --bind per avere una singola directory contenente file da diverse partizioni vfat, e ls mostrerebbe correttamente quali autorizzazioni sono state specificate per ciascun file.


15

lsnon conosce FAT32, conosce solo l'interfaccia del filesystem virtuale (VFS) esposta dal kernel con chiamate POSIX open/ readdir/ statsystem.

Linux non supporta il concetto di file che non hanno bit di autorizzazione utente / gruppo / altro, struct statcontiene semplicemente un mode_t st_mode;membro (e uid, membri gid) che il kernel deve compilare quando ls -leffettua stat(2)chiamate di sistema.

Non esiste un codice speciale che significhi "non disponibile" o "non applicabile" per nessuno di questi campi, quindi il driver vfat del kernel deve inventare qualcosa. FAT16 / FAT32 ha un flag di sola lettura, ma per il resto il proprietario / gruppo proviene da opzioni di mount, e così fa un umask.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.