Tại sao lệnh của lsvs lsv hiển thị quyền của các tệp trong phân vùng FAT32?


40

Tôi tin rằng hệ thống tệp FAT32 không hỗ trợ quyền truy cập tệp, tuy nhiên khi tôi thực hiện ls -ltrên phân vùng FAT32, ls -lcho thấy các tệp có quyền:

-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

Tại sao ls -lhiển thị các quyền của tập tin?


Câu hỏi hay! Chào mừng
0xSheepdog

Câu trả lời:


71

Hệ thống tệp được lưu trữ trên đĩa không lưu trữ quyền truy cập tệp, nhưng trình điều khiển hệ thống tệp phải cung cấp chúng cho hệ điều hành vì chúng là một phần không thể thiếu của khái niệm hệ thống tệp Unix và giao diện gọi hệ thống không có cách nào để trình bày rằng các quyền đó là còn thiếu.

Cũng xem xét điều gì sẽ xảy ra nếu một tập tin không có bất kỳ bit quyền nào cả? Nó sẽ giống như 0777, tức là truy cập vào tất cả; hoặc giống như 0000, tức là không có quyền truy cập cho bất cứ ai? Nhưng cả hai đều quyền của tập tin, vậy tại sao không hiển thị chúng? Hoặc làm một cái gì đó hữu ích hơn và có một cách để thiết lập một số quyền hợp lý.

Vì vậy, trình điều khiển giả mạo một số quyền, cùng một quyền cho tất cả các tệp. Các quyền cùng với chủ sở hữu và nhóm của tệp có thể được cấu hình tại thời điểm gắn kết. Chúng được mô tả trong phần "Tùy chọn gắn kết cho chất béo" trong trang người đàn ông gắn kết (8) :

Tùy chọn gắn kết cho chất béo
(Lưu ý: chất béo không phải là một hệ thống tệp riêng biệt, mà là một phần chung của các hệ thống tệp msdos, umsdos và vfat.)

uid=valuegid=value
Đặt chủ sở hữu và nhóm của tất cả các tệp. (Mặc định: UID và GID của quy trình hiện tại.)

umask=value
Đặt ô (bitmask của các quyền không có). Mặc định là ô của quy trình hiện tại. Giá trị được đưa ra trong bát phân.

dmask=value
Đặt ô chỉ áp dụng cho các thư mục. Mặc định là ô của quy trình hiện tại. Giá trị được đưa ra trong bát phân.

fmask=value
Đặt ô chỉ áp dụng cho các tệp thông thường. Mặc định là ô của quy trình hiện tại. Giá trị được đưa ra trong bát phân.

Lưu ý rằng các quyền được trình bày dưới dạng mặt nạ, vì vậy các quyền cuối cùng là phủ định của mặt nạ. fmask=0133sẽ dẫn đến tất cả các tệp có quyền 0644, hoặc rw-r--r--.

Ngoài ra, mặc định được kế thừa từ quá trình gọi mount(), vì vậy nếu bạn gọi mounttừ dòng lệnh, shell umasksẽ được áp dụng.


7
Và lý do nó giả mạo các quyền là vì nếu không, và bất kỳ chương trình nào khác xem quyền truy cập tệp (ngay cả mã của bạn đang cố đọc tệp) sẽ phải có logic để xử lý tất cả các tổ chức hệ thống tệp khác nhau được tích hợp.
jamesqf

4
@jamesqf, vâng, và thậm chí các giao diện gọi hệ thống không có tùy chọn "không có quyền", vì các quyền luôn ở đó. (Đó là những gì tôi đã nghĩ khi tôi viết chúng là "một phần không thể thiếu".) Vì vậy, các quyền luôn luôn ở đó và những thứ như ACL được tạo ra để giữ cho chúng có ý nghĩa.
ilkkachu

2
Tôi thường thấy chế độ 777 cho tất cả các tệp trong hệ thống tệp FAT (ít nhất là FAT16 với trình điều khiển cũ).
rừng

2
@forest phụ thuộc vào umasktùy chọn gắn kết, trong đó giá trị mặc định là ô của mountquá trình (xem trang hướng dẫn được liên kết trong câu trả lời này).
Ruslan

Nhưng FAT không lưu trữ một số điều khoản / thuộc tính (read-only, ẩn, hệ thống, vv), ngay cả khi họ không lập bản đồ chính xác để những người Unix. chmod ugo-wtrên một tệp sẽ bật thuộc tính chỉ đọc. Sử dụng fmask=0133tùy chọn như trong ví dụ của bạn sẽ không dẫn đến tất cả các tệp có quyền 0644. Những gì FAT hoàn toàn không lưu trữ là một uid và một gid cho mỗi tệp. Vui lòng làm rõ; Câu trả lời vì nó rất sai lệch.
mosvy

22

Nhưng các tập tin có quyền. Người dùng john có quyền truy cập RW, trong khi một số người dùng ngẫu nhiên chỉ có quyền truy cập đọc. Các quyền này không đến từ chính hệ thống tập tin mà là từ các tùy chọn gắn kết (-o uid / gid / umask), điều này không làm cho chúng trở nên ít thực tế hơn.

Bạn có thể có nhiều phân vùng vfat được gắn với các tùy chọn khác nhau và bạn có thể sử dụng ls để xác định các tùy chọn đó là gì. Bạn thậm chí có thể sử dụng mount --bind để có một thư mục chứa các tệp từ các phân vùng vfat khác nhau và ls sẽ hiển thị chính xác quyền nào đã được chỉ định cho mỗi tệp.


15

lskhông biết về FAT32, nó chỉ biết về giao diện Hệ thống tập tin ảo (VFS) được trình bày bởi kernel với các cuộc gọi hệ thống POSIX open/ readdir/ stat.

Linux không hỗ trợ khái niệm các tệp không có người dùng / nhóm / bit quyền khác, struct statchỉ đơn giản chứa một mode_t st_mode;thành viên (và uid, gid thành viên) mà kernel phải điền khi ls -lthực hiện stat(2)các cuộc gọi hệ thống.

Không có mã đặc biệt có nghĩa là "không khả dụng" hoặc "không áp dụng" cho bất kỳ trường nào trong số đó, vì vậy trình điều khiển vfat của kernel phải tạo ra thứ gì đó. FAT16 / FAT32 không có cờ chỉ đọc, nhưng nếu không thì chủ sở hữu / nhóm đến từ các tùy chọn gắn kết, và cũng có một ô.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.