2011-01-05 30 views
20

Tại sao bạn không thể truy cập tệp khi bạn chỉ biết inode của nó, mà không tìm kiếm tệp có liên kết đến inode đó? Liên kết cứng tới tệp không chứa gì ngoài tên và số cho bạn biết nơi tìm mã inode với tất cả thông tin thực về tệp. Tôi đã rất ngạc nhiên khi được thông báo rằng không có cách nào để sử dụng số inode trực tiếp để mở một tập tin.Tại sao các tệp không thể được thao tác bằng inode?

Điều này có vẻ như một khả năng vô hại và hữu ích cho hệ thống cung cấp. Tại sao nó không được cung cấp?

+2

Trường hợp sử dụng để thực hiện việc này là gì? – user562374

+0

@user Câu hỏi được lấy cảm hứng từ câu hỏi này. http://stackoverflow.com/questions/4605851/how-to-get-directory-name-by-inode-value-in-c Tôi cũng có thể thấy nó đang được sử dụng để truyền tệp cho người dùng khác có quyền truy cập vào nhưng không có quyền truy cập vào cấu trúc thư mục của tôi. –

+3

Đó chính xác là lý do không được phép. Nếu truy cập tệp theo số inode được cho phép, bạn có thể chỉ cần thử mọi số inode và bỏ qua tất cả các quyền của thư mục. –

Trả lời

15

Một số hệ điều hành do có cơ sở đó. Ví dụ, OS X cần nó để hỗ trợ Carbon File Manager và trên Linux, bạn có thể sử dụng debugfs. Tất nhiên, bạn có thể làm điều đó trên bất kỳ UNIX từ dòng lệnh thông qua find -inum, nhưng lý do thực sự bạn không thể truy cập tệp bằng inode là nó không đặc biệt hữu ích. Nó không loại bỏ quyền truy cập tệp, bởi vì nếu có tệp bạn có thể đọc trong thư mục bạn không thể đọc hoặc thực thi, thì việc mở inode cho phép bạn khám phá nó.

Lý do không hữu ích là bạn cần tìm số inode qua cuộc gọi *stat(), tại thời điểm đó bạn đã tên tệp (hoặc fd mở) ... hoặc bạn cần đoán inum.

+4

Ah, nhưng nếu bạn đóng tập tin và sau đó muốn mở lại nó sau này, bạn sẽ không phải đánh dấu nó. – johnnycrash

+0

@johnnycrash điều gì khiến bạn nhận được? Bạn không thể nói về bất kỳ hiệu suất có ý nghĩa nào khi bạn sắp sử dụng một tệp trên một số phương tiện lưu trữ thực sự chậm. –

+3

@johnnycrash bạn sẽ không chắc chắn rằng bạn sẽ mở cùng một tập tin thực sự: inode tương tự có thể đã bị phá hủy và tái sử dụng bởi hệ thống tập tin cho một tập tin mới, và bạn sẽ không có bất kỳ cách nào để kiểm tra xem điều đó đã xảy ra. – pqnet

17

Lý do bảo mật - để truy cập tệp mà bạn cần có quyền đối với tệp AS WELL AS cho phép tìm kiếm tất cả các thư mục từ thư mục gốc cần để tải tệp. Nếu bạn có thể truy cập một tệp bằng inode, bạn có thể bỏ qua các kiểm tra trên các thư mục chứa.

Điều này cho phép bạn tạo tệp có thể được một nhóm người dùng truy cập (hoặc một nhóm nhóm) và không phải bất kỳ ai khác - tạo thư mục chỉ có thể truy cập bởi người dùng (một thư cho mỗi người dùng), và sau đó liên kết cứng tệp vào tất cả các thư mục đó - bất kỳ ai cũng có thể truy cập tệp nhưng chỉ thực sự có thể được truy cập bởi người có quyền tìm kiếm trên một trong các thư mục được liên kết.

+3

Khả năng giả định để truy cập tệp theo số inode có thể bị hạn chế đối với 'root'. –

4

Để trả lời nhận xét của bạn: Để "truyền tệp", bạn có thể sử dụng fd truyền qua ổ cắm AF_LOCAL bằng phương tiện SCM_RIGHTS (xem man 7 unix).

3

Btrfs không có ioctl cho điều đó (BTRFS_IOC_INO_PATHS added in this patch), tuy nhiên nó không cố gắng kiểm tra quyền dọc theo đường dẫn và chỉ được dành riêng cho thư mục gốc.

2

Chắc chắn nếu bạn đã tra cứu một tệp qua một đường dẫn, bạn không cần phải lặp lại nhiều lần?

stat(f,&s); i=open(f,O_MODE); 

liên quan đến hai con lưới thông qua cấu trúc thư mục. Điều này làm hao mòn các chu kỳ CPU với các hoạt động chuỗi không cần thiết. Vâng, bộ nhớ cache fs được thiết kế tốt sẽ cản trở phần lớn sự kém hiệu quả này từ một người dùng cuối bình thường, nhưng công việc lặp lại không có lý do gì là xấu nếu không phải là ngớ ngẩn.

+0

Bạn lưu trữ inode trong cơ sở dữ liệu và tránh một vài chu kỳ truy cập, đây là dozends của mili giây không phải là nano giây cho hoạt động chuỗi. Nhanh gấp 1000 lần, đặc biệt nếu bạn sắp xếp các số inode. – Lothar

+0

Điều này cho tôi một số ý tưởng. Nhận xét @Lothar là đúng tại chỗ: nếu bạn bỏ qua việc sử dụng tên thông qua hệ thống tệp, về cơ bản bạn phải triển khai một số tương đương bằng cách sử dụng cơ sở dữ liệu. Nếu bạn đang mở cùng một tập tin trên một và muốn các vấn đề thực sự duy nhất có thể được để tránh phân tích cú pháp hàng triệu trên các tập tin trong cùng một thư mục một lần nữa và một lần nữa ... giải pháp? chỉ liên kết cứng đến những tệp này trong một thư mục chứa nhiều tệp ít hơn. Điều này sẽ tránh hầu hết các chu kỳ CPU bị mất, về cơ bản làm gần giống như truy cập bằng inode. – kriss

Các vấn đề liên quan