Mengapa perintah "ls" menunjukkan izin file di partisi FAT32?

40

Saya percaya bahwa sistem file FAT32 tidak mendukung izin file, namun ketika saya melakukannya ls -lpada partisi FAT32, ls -lmenunjukkan bahwa file memiliki izin:

-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

Mengapa ls -lmenampilkan izin file?

pengguna342731
sumber
Pertanyaan bagus! Selamat datang
0xSheepdog

Jawaban:

71

Filesystem yang disimpan di disk tidak menyimpan izin file, tetapi driver filesystem harus menyediakannya ke sistem operasi karena mereka merupakan bagian integral dari konsep sistem file Unix dan antarmuka panggilan sistem tidak memiliki cara untuk menyajikan bahwa izin tersebut hilang.

Juga pertimbangkan apa yang akan terjadi jika file tidak memiliki bit izin sama sekali? Apakah sama dengan 0777, yaitu akses ke semua; atau sama dengan 0000, yaitu tidak ada akses ke siapa pun? Namun keduanya adalah izin file, jadi mengapa tidak perlihatkan? Atau lakukan sesuatu yang lebih bermanfaat dan memiliki cara untuk mengatur beberapa izin yang masuk akal.

Jadi, pengemudi memalsukan beberapa izin, yang sama untuk semua file. Izin bersama dengan pemilik dan grup file dapat dikonfigurasi pada waktu pemasangan. Ini dijelaskan di bawah "Mount options for fat" di halaman manual mount (8) :

Mount opsi untuk lemak
(Catatan: lemak bukan sistem file terpisah, tetapi bagian umum dari sistem file msdos, umsdos dan vfat.)

uid=valuedan gid=value
Atur pemilik dan grup semua file. (Default: UID dan GID dari proses saat ini.)

umask=value
Setel umask (bitmask dari izin yang tidak ada). Standarnya adalah umask dari proses saat ini. Nilai diberikan dalam oktal.

dmask=value
Setel umask yang diterapkan hanya pada direktori. Standarnya adalah umask dari proses saat ini. Nilai diberikan dalam oktal.

fmask=value
Atur umask yang diterapkan hanya untuk file biasa. Standarnya adalah umask dari proses saat ini. Nilai diberikan dalam oktal.

Perhatikan bahwa izin disajikan sebagai topeng, jadi izin final adalah negasi dari topeng. fmask=0133akan menghasilkan semua file yang memiliki izin 0644, atau rw-r--r--.

Selain itu, default diwarisi dari proses pemanggilan mount(), jadi jika Anda menelepon mountdari baris perintah, shell umaskakan berlaku.

ilkkachu
sumber
7
Dan alasan itu memalsukan izin adalah bahwa jika tidak, dan program lain yang melihat izin file (bahkan hanya kode Anda mencoba membaca file) harus memiliki logika untuk menangani semua organisasi sistem file yang berbeda yang dibangun di dalamnya.
jamesqf
4
@ jamesqf, ya, dan bahkan antarmuka panggilan sistem tidak memiliki opsi "tidak memiliki izin", karena izin selalu ada di sana. (Itulah yang saya pikirkan ketika saya menulis mereka adalah "bagian integral".) Oleh karena itu, izin selalu ada di sana, dan hal-hal seperti ACL dibuat agar tetap bermakna.
ilkkachu
2
Saya biasanya melihat mode 777 untuk semua file dalam sistem file FAT (FAT16 dengan driver lama, setidaknya).
hutan
2
@ forest yang tergantung pada umaskopsi mount, yang nilai defaultnya adalah umask mountproses (lihat halaman manual yang ditautkan dalam jawaban ini).
Ruslan
Tetapi FAT memang menyimpan beberapa izin / atribut (read-only, hidden, system, dll), bahkan jika mereka tidak memetakan secara persis ke yang Unix. chmod ugo-wpada file akan mengaktifkan atribut read-only. Menggunakan fmask=0133opsi seperti pada contoh Anda tidak akan menghasilkan semua file memiliki izin 0644. Apa FAT benar-benar tidak menyimpan adalah uid dan gid untuk setiap file. Mohon klarifikasi; jawabannya seperti itu sangat menyesatkan.
Mosvy
22

Tetapi file memiliki izin. Pengguna john memiliki akses RW, sementara beberapa pengguna acak hanya memiliki akses baca. Izin ini tidak berasal dari filesystem itu sendiri melainkan dari opsi mount (-o uid / gid / umask), yang tidak membuatnya kurang nyata.

Anda bisa membuat beberapa partisi vfat di-mount dengan opsi yang berbeda dan Anda bisa menggunakan ls untuk menentukan opsi-opsi itu. Anda bahkan dapat menggunakan mount --bind untuk membuat direktori tunggal berisi file dari partisi vfat yang berbeda, dan ls akan dengan benar menunjukkan izin apa yang telah ditentukan untuk setiap file.

Roman Odaisky
sumber
15

lstidak tahu tentang FAT32, ia hanya tahu tentang antarmuka Sistem File Virtual (VFS) yang diekspos oleh kernel dengan panggilan POSIX open/ readdir/ statsistem.

Linux tidak mendukung konsep file yang tidak memiliki bit izin pengguna / grup / lainnya, struct statcukup berisi mode_t st_mode;anggota (dan uid, anggota gid) yang harus diisi oleh kernel ketika ls -lmelakukan stat(2)panggilan sistem.

Tidak ada kode khusus yang berarti "tidak tersedia" atau "tidak berlaku" untuk bidang-bidang tersebut, sehingga driver vfat kernel harus membuat sesuatu. FAT16 / FAT32 memang memiliki flag read-only, tetapi sebaliknya pemilik / grup berasal dari opsi mount, dan begitu juga umask.

Peter Cordes
sumber