2010-01-20 10 views
16

Quy ước ngôn ngữ C đếm chỉ số mảng từ 0. Tại sao số inode bắt đầu từ 1 và không 0?Tại sao số inode bắt đầu từ 1 chứ không phải 0?

Nếu inode 0 được dành riêng cho một số sử dụng đặc biệt, thì ý nghĩa của inode 0 là gì?

+0

Bạn có một tài liệu tham khảo để sao lưu các tuyên bố rằng một số inode không thể là 0 trong bất kỳ hệ thống tập tin?Tôi không thể tìm thấy. –

+0

Vì vậy, báo giá của bạn chính xác trả lời câu hỏi của bạn, phải không? –

+1

Vâng, nhưng tôi không vào sản xuất, và đang tìm kiếm câu trả lời cho mục đích học tập thuần túy;) –

Trả lời

22

Thông thường, inode 0 được đặt trước vì giá trị trả về 0 thường báo hiệu lỗi. Nhiều phương thức trong hạt nhân Linux - đặc biệt là trong lớp VFS được chia sẻ bởi tất cả các hệ thống tệp - trả về một ino_t, ví dụ: find_inode_number.

Có nhiều số inode được đặt trước. Ví dụ trong ext2:

#define EXT2_BAD_INO    1  /* Bad blocks inode */ 
#define EXT2_ROOT_INO   2  /* Root inode */ 
#define EXT2_BOOT_LOADER_INO  5  /* Boot loader inode */ 
#define EXT2_UNDEL_DIR_INO  6  /* Undelete directory inode */ 

ext3 có:

#define EXT3_BAD_INO    1  /* Bad blocks inode */ 
#define EXT3_ROOT_INO   2  /* Root inode */ 
#define EXT3_BOOT_LOADER_INO  5  /* Boot loader inode */ 
#define EXT3_UNDEL_DIR_INO  6  /* Undelete directory inode */ 
#define EXT3_RESIZE_INO   7  /* Reserved group descriptors inode */ 
#define EXT3_JOURNAL_INO   8  /* Journal inode */ 

ext4 có:

#define EXT4_BAD_INO    1  /* Bad blocks inode */ 
#define EXT4_ROOT_INO   2  /* Root inode */ 
#define EXT4_USR_QUOTA_INO  3  /* User quota inode */ 
#define EXT4_GRP_QUOTA_INO  4  /* Group quota inode */ 
#define EXT4_BOOT_LOADER_INO  5  /* Boot loader inode */ 
#define EXT4_UNDEL_DIR_INO  6  /* Undelete directory inode */ 
#define EXT4_RESIZE_INO   7  /* Reserved group descriptors inode */ 
#define EXT4_JOURNAL_INO   8  /* Journal inode */ 

file hệ thống khác sử dụng ino 1 như số inode root. Nói chung, một hệ thống tập tin là miễn phí để lựa chọn số inode của nó và các giá trị ino dành riêng của nó (ngoại trừ 0).

+0

Tệp tiêu đề: fs/ext4/ext4.h –

+0

Cũng thấy macro 'EXT2_FIRST_INO()' - nó không thực sự là một hằng số. – MSalters

23

0 được sử dụng làm sentinel value để chỉ ra null hoặc không có inode. tương tự như cách con trỏ có thể được NULL trong C. mà không có một sentinel, bạn sẽ cần thêm một chút để kiểm tra nếu một inode trong một cấu trúc đã được thiết lập hay không.

biết thêm ở đây:

Tất cả các địa chỉ khối và inode bắt đầu từ 1. Khối đầu tiên trên đĩa là khối 1. 0 được sử dụng để chỉ không khối. (File thưa thớt có thể có những bên trong chúng)

http://uranus.chrysocome.net/explore2fs/es2fs.htm

ví dụ, trong hệ thống tập tin cũ, nơi các thư mục được biểu diễn dưới dạng một mảng cố định các mục tập tin, xóa một tập tin sẽ cho kết quả trong việc thiết inode của entry mà val đến 0. khi duyệt qua thư mục, bất kỳ mục nhập nào có inode bằng 0 sẽ bị bỏ qua.

+0

Có vẻ như inode 1 cũng được bảo lưu cùng với inode 0 cho một số mục đích đặc biệt. –

+1

Điều đó dường như cụ thể đối với ext2fs. Câu hỏi của bạn là về hệ thống tập tin nói chung. –

+1

@Alok: một gia đình của unix fs chia sẻ khái niệm inode. không công nhận 0 theo quy ước. – jspcal

0

Khi tôi đã viết một hệ thống tệp cũ, tôi đã sử dụng inode 0 cho tệp giả .badblocks.

Trên một số hệ thống tệp .badblocks thực sự xuất hiện trong thư mục gốc dưới dạng tệp thông thường do root và chế độ 0. sở hữu có thể mở nhưng đọc hoặc viết không xác định.

Có một số truyền thống cổ xưa mà các nút bắt đầu từ 1, số 1 là .badblocks và # 2 là thư mục gốc. Mặc dù .badblocks không được bảo đảm đặc biệt, nhiều hệ thống tập tin vẫn nằm ngoài con đường của chúng để tạo ra thư mục gốC# 2.