Dlaczego polecenie „ls” pokazuje uprawnienia do plików na partycji FAT32?

40

Uważam, że system plików FAT32 nie obsługuje uprawnień do plików, jednak gdy robię to ls -lna partycji FAT32, ls -lpokazuje, że pliki mają uprawnienia:

-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

Dlaczego ls -lwyświetla uprawnienia do plików?

użytkownik342731
źródło
Dobre pytanie! Witamy
0xSheepdog

Odpowiedzi:

71

System plików przechowywany na dysku nie przechowuje uprawnień do plików, ale sterownik systemu plików musi dostarczyć je do systemu operacyjnego, ponieważ są one integralną częścią koncepcji systemu plików Unix, a interfejsy wywołań systemowych nie mogą w żaden sposób pokazać, że uprawnienia są brakujący.

Zastanów się także, co by się stało, gdyby plik nie miał żadnych bitów uprawnień? Czy byłoby to to samo, co 0777, tj. Dostęp do wszystkich; lub to samo, co oznacza 0000brak dostępu do nikogo? Ale oba uprawnieniami do plików, więc dlaczego ich nie pokazać? Lub zrób coś bardziej użytecznego i ustal sposób na rozsądne uprawnienia.

Tak więc sterownik fałszuje niektóre uprawnienia, takie same dla wszystkich plików. Uprawnienia wraz z właścicielem i grupą plików można konfigurować w czasie montowania. Są one opisane w sekcji „Opcje montowania dla tłuszczu” na stronie podręcznika mount (8) :

Opcje montowania dla fat
(uwaga: fat nie jest oddzielnym systemem plików, ale wspólną częścią systemów plików msdos, umsdos i vfat.)

uid=valuei gid=value
Ustaw właściciela i grupę wszystkich plików. (Domyślnie: UID i GID bieżącego procesu.)

umask=value
Ustaw umask (maskę bitową uprawnień, które nie są obecne). Domyślnie jest to umask bieżącego procesu. Wartość podana jest ósemkowo.

dmask=value
Ustaw umask stosowane tylko do katalogów. Domyślnie jest to umask bieżącego procesu. Wartość podana jest ósemkowo.

fmask=value
Ustaw umask stosowany tylko do zwykłych plików. Domyślnie jest to umask bieżącego procesu. Wartość podana jest ósemkowo.

Pamiętaj, że uprawnienia są prezentowane jako maski, więc ostateczne uprawnienia są negacją maski. fmask=0133spowoduje, że wszystkie pliki będą miały uprawnienia 0644, lub rw-r--r--.

Ponadto wartości domyślne są dziedziczone z wywołania procesu mount(), więc jeśli zadzwonisz mountz wiersza poleceń, umaskzastosowane zostaną powłoki .

ilkkachu
źródło
7
A powodem fałszywych uprawnień jest to, że w przeciwnym razie ls i każdy inny program, który sprawdzał uprawnienia do plików (nawet tylko twój kod próbujący odczytać plik) musiałby mieć logikę do obsługi wszystkich wbudowanych różnych organizacji systemów plików.
jamesqf
4
@jamesqf, tak, a nawet interfejsy wywołań systemowych nie mają opcji „nie mieć uprawnień”, ponieważ uprawnienia zawsze tam były. (Właśnie o tym myślałem, kiedy napisałem, że są one „integralną częścią”.) Dlatego też uprawnienia zawsze będą tam istnieć, a takie rzeczy jak listy ACL są tworzone, aby zachować ich znaczenie.
ilkkachu
2
Zwykle widziałem tryb 777 dla wszystkich plików w systemach plików FAT (przynajmniej FAT16 ze starym sterownikiem).
las
2
@forest, który zależy od umaskopcji montowania, dla której wartością domyślną jest umask mountprocesu (patrz strona podręcznika , do której link znajduje się w tej odpowiedzi).
Ruslan
Ale FAT nie przechowywać pewne uprawnienia / atrybutów (tylko do odczytu, ukryty, system, itp), nawet jeśli nie na mapie dokładnie do tych Unix. chmod ugo-wna pliku włączy atrybut tylko do odczytu. Użycie fmask=0133opcji jak w przykładzie nie spowoduje, że wszystkie pliki będą miały uprawnienia 0644. To, czego FAT absolutnie nie przechowuje, to uid i gid dla każdego pliku. Proszę o wyjaśnienie; obecna odpowiedź jest bardzo myląca.
mosvy
22

Ale pliki mają uprawnienia. Użytkownik John ma dostęp do RW, a niektórzy losowi użytkownicy mają dostęp tylko do odczytu. Te uprawnienia nie pochodziły z samego systemu plików, ale raczej z opcji montowania (-o uid / gid / umask), co nie czyni ich mniej rzeczywistymi.

Możesz mieć wiele partycji vfat podłączonych z różnymi opcjami i możesz użyć ls do ustalenia, jakie były te opcje. Możesz nawet użyć mount --bind, aby pojedynczy katalog zawierał pliki z różnych partycji vfat, a ls poprawnie pokazuje, jakie uprawnienia zostały określone dla każdego pliku.

Roman Odaisky
źródło
15

lsnie wie o FAT32, wie tylko o interfejsie wirtualnego systemu plików (VFS) odsłoniętym przez jądro za pomocą wywołań systemowych POSIX open/ readdir/ stat.

Linux nie wspiera koncepcję pliki nie mają użytkownik / grupa / pozostałe bity uprawnień, struct statpo prostu zawiera mode_t st_mode;człon (i uid i GID członków), że jądro musi wypełnić, gdy ls -lczyni stat(2)wywołań systemowych.

Nie ma specjalnego kodu, który oznacza „niedostępny” lub „nie dotyczy” żadnego z tych pól, więc sterownik vfat jądra musi coś wymyślić. FAT16 / FAT32 ma flagę tylko do odczytu, ale poza tym właściciel / grupa pochodzą z opcji montowania, podobnie jak umask.

Peter Cordes
źródło