Làm thế nào các tệp / thư mục bị ẩn khỏi ls -a trong khi vẫn có thể truy cập được trong hệ thống tuân thủ POSIX?


9

Ví dụ, trong ZFS trong FreeBSD và ZoL, có một .zfsthư mục ma thuật bên trong mỗi điểm gắn kết của zpool và bạn có thể sử dụng zfs set snapdir=visibleđể .zfshiển thị thư mục đó .

Điều khiến tôi tò mò là: nếu cài đặt đó được đặt thành "ẩn", thì .zfsthư mục thực sự bị ẩn khỏi đầu ra của mộtls -a hoặc hoàn thành tự động đường dẫn shell, trong khi vẫn có thể truy cập được (bạn vẫn có thể truy cập cdhoặc gọi statnó )?

Tôi thực sự không thể bao bọc tâm trí của mình xung quanh sự thật này, bởi vì bằng cách nào đó tôi nghĩ rằng nếu có thứ gì đó ở đó và có thể truy cập được thì nó sẽ được liệt kê ls -a- ngay cả khi nó chỉ là ma thuật / ảo trong tự nhiên.

Bất cứ ai có thể giải thích làm thế nào điều này làm việc? Có cách nào phù hợp với POSIX để có một thư mục bị ẩn ls -atrong khi vẫn có thể truy cập được không? Bạn làm nó như thế nào?


2
Một lý do chính đáng để "ẩn" .zfsthư mục khỏi ls(và các tiện ích không gian người dùng khác sử dụng readdir()) là để xem những gì xảy ra với .zfsthư mục hiển thị . Chạy một cái gì đó giống như find . -name somefilenamevới một .zfsthư mục hiển thị , findtiện ích sẽ đi xuống .zfsthư mục và tìm kiếm thông qua mỗi ảnh chụp nhanh cho tên tệp đó, cũng như hệ thống tệp "hoạt động" thực tế.
Andrew Henle

Câu trả lời:


7

Chà, làm thế nào để làm điều đó là đủ dễ dàng: lslấy danh sách của nó từ một tòa nhà chọc trời (hoặc, trên Linux, chức năng libc) được gọi readdir. Thay đổi vào một thư mục được thực hiện với một tòa nhà riêng biệt , chdir. statcũng là một tòa nhà khác, như hầu hết các hoạt động tập tin khác.

Nói tóm lại, "những gì trong thư mục này?" và "truy cập thư mục này" là các yêu cầu hoàn toàn riêng biệt của kernel, vì vậy chúng có thể được lập trình để hoạt động khác nhau.

Vì vậy, để tạo một thư mục không xuất hiện ls -a, bạn chỉ cần bỏ qua kernel từ kết quả readdir. Nhưng nó vẫn hoạt động với chdir(v.v.), vì đó là một tòa nhà khác.

Điều này không khác lắm so với việc có một thư mục mà bạn có +xquyền, nhưng không -r : bạn có thể truy cập các tệp và thư mục bên trong cdnó, v.v., nhưng lssẽ thất bại. Tôi tin rằng những thứ khác đã sử dụng sự sắp xếp này quá, ví dụ như (và đây là từ bộ nhớ mờ mà không cần tìm kiếm) AFS có một /afskhông gian tên toàn cầu nơi bạn có thể kết nối với bất kỳ máy chủ AFS nào bằng cách cdnhập vào tên của nó; một lstrên /afssẽ không hiển thị tất cả các máy chủ của thế giới, mặc dù. Tôi đã thấy các hệ thống tập tin FUSE làm tương tự (ví dụ: cdđể kết nối với máy chủ FTP ẩn danh).

(Tôi không chắc liệu sự sắp xếp zfs có tuân thủ nghiêm ngặt POSIX hay không).


1
Trên Linux, có một getdents()cuộc gọi hệ thống kết thúc việc gọi readdir()triển khai của VFS , do đó, việc triển khai ZFS là không quan trọng để bỏ qua .zfsmục nhập nếu thuộc snapdirtính được đặt thành hidden. Xem lxr.free-electrons.com/source/fs/readdir.c?v=2.6.35 để biết nguồn. Thông số kỹ thuật của POSIX dường như được diễn đạt sao cho việc loại bỏ thư mục không tuân thủ nghiêm ngặt tiêu chuẩn nhưng tôi cho rằng người ta có thể lập luận rằng "thư mục" là một chi tiết triển khai được tùy chọn hiển thị dưới dạng thư mục.
Andrew Henle

Điều này tuân thủ POSIX vì hành vi không thể phân biệt được với quy trình đồng thời luôn xóa tệp ẩn ngay trước khi bất kỳ ai cố gắng liệt kê nó (ví dụ bằng cách gọi readdir) và tạo nó ngay trước khi bất kỳ ai cố gắng truy cập (ví dụ: bằng cách gọi chdir).
Gilles 'SO- ngừng trở nên xấu xa'
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.