繼上一篇文章:http://www.cnblogs.com/linhaostudy/p/7427027.html
二、inode結構體:(轉自http://blog.csdn.net/shanshanpt/article/details/38943731)
inode結構體在(include/linux/fs.h中):
保存的其實是實際的數據的一些信息,這些信息稱為“元數據”(也就是對文件屬性的描述)。例如:文件大小,設備標識符,用戶標識符,用戶組標識符,文件模式,擴展屬性,文件讀取或修改的時間戳,鏈接數量,指向存儲該內容的磁盤區塊的指針,文件分類等等。
( 注意數據分成:元數據+數據本身 )
同時注意:inode有兩種,一種是VFS的inode,一種是具體文件系統的inode。前者在內存中,后者在磁盤中。所以每次其實是將磁盤中的inode調進填充內存中的inode,這樣才是算使用了磁盤文件inode。
注意inode怎樣生成的:每個inode節點的大小,一般是128字節或256字節。inode節點的總數,在格式化時就給定(現代OS可以動態變化),一般每2KB就設置一個inode。一般文件系統中很少有文件小於2KB的,所以預定按照2KB分,一般inode是用不完的。所以inode在文件系統安裝的時候會有一個默認數量,后期會根據實際的需要發生變化。
注意inode號:inode號是唯一的,表示不同的文件。其實在Linux內部的時候,訪問文件都是通過inode號來進行的,所謂文件名僅僅是給用戶容易使用的。當我們打開一個文件的時候,首先,系統找到這個文件名對應的inode號;然后,通過inode號,得到inode信息,最后,由inode找到文件數據所在的block,現在可以處理文件數據了。
inode和文件的關系:當創建一個文件的時候,就給文件分配了一個inode。一個inode只對應一個實際文件,一個文件也會只有一個inode。inodes最大數量就是文件的最大數量。
1 struct inode { 2 umode_t i_mode; 3 unsigned short i_opflags; 4 uid_t i_uid; 5 gid_t i_gid; 6 unsigned int i_flags; 7 8 #ifdef CONFIG_FS_POSIX_ACL 9 struct posix_acl *i_acl; 10 struct posix_acl *i_default_acl; 11 #endif 12 13 const struct inode_operations *i_op; 14 struct super_block *i_sb; 15 struct address_space *i_mapping; 16 17 #ifdef CONFIG_SECURITY 18 void *i_security; 19 #endif 20 21 /* Stat data, not accessed from path walking */ 22 unsigned long i_ino; 23 /* 24 * Filesystems may only read i_nlink directly. They shall use the 25 * following functions for modification: 26 * 27 * (set|clear|inc|drop)_nlink 28 * inode_(inc|dec)_link_count 29 */ 30 union { 31 const unsigned int i_nlink; 32 unsigned int __i_nlink; 33 }; 34 dev_t i_rdev; 35 struct timespec i_atime; 36 struct timespec i_mtime; 37 struct timespec i_ctime; 38 spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ 39 unsigned short i_bytes; 40 blkcnt_t i_blocks; 41 loff_t i_size; 42 43 #ifdef __NEED_I_SIZE_ORDERED 44 seqcount_t i_size_seqcount; 45 #endif 46 47 /* Misc */ 48 unsigned long i_state; 49 struct mutex i_mutex; 50 51 unsigned long dirtied_when; /* jiffies of first dirtying */ 52 53 struct hlist_node i_hash; 54 struct list_head i_wb_list; /* backing dev IO list */ 55 struct list_head i_lru; /* inode LRU list */ 56 struct list_head i_sb_list; 57 union { 58 struct list_head i_dentry; 59 struct rcu_head i_rcu; 60 }; 61 atomic_t i_count; 62 unsigned int i_blkbits; 63 u64 i_version; 64 atomic_t i_dio_count; 65 atomic_t i_writecount; 66 const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ 67 struct file_lock *i_flock; 68 struct address_space i_data; 69 #ifdef CONFIG_QUOTA 70 struct dquot *i_dquot[MAXQUOTAS]; 71 #endif 72 struct list_head i_devices; 73 union { 74 struct pipe_inode_info *i_pipe; 75 struct block_device *i_bdev; 76 struct cdev *i_cdev; 77 }; 78 79 __u32 i_generation; 80 81 #ifdef CONFIG_FSNOTIFY 82 __u32 i_fsnotify_mask; /* all events this inode cares about */ 83 struct hlist_head i_fsnotify_marks; 84 #endif 85 86 #ifdef CONFIG_IMA 87 atomic_t i_readcount; /* struct files open RO */ 88 #endif 89 void *i_private; /* fs or device private pointer */ 90 };
i_hash:指向hash鏈表指針,用於inode的hash表,下面會說
i_list:指向索引節點鏈表指針,用於inode之間的連接,下面會說
i_dentry:指向目錄項鏈表指針,注意一個inodes可以對應多個dentry,因為一個實際的文件可能被鏈接到其他的文件,那么就會有另一個dentry,這個鏈表就是將所有的與本inode有關的dentry都連在一起。
i_dirty_buffers和i_dirty_data_buffers:臟數據緩沖區
i_ino:索引節點號,每個inode都是唯一的
i_count:引用計數
i_dev:如果inode代表設備,那么就是設備號
i_mode:文件的類型和訪問權限
i_nlink:與該節點建立鏈接的文件數(硬鏈接數)
i_uid:文件擁有者標號
i_gid:文件所在組標號
i_rdev:實際的設備標識
注意i_dev和i_rdev之間區別:如果是普通的文件,例如磁盤文件,存儲在某塊磁盤上,那么i_dev代表的就是保存這個文件的磁盤號,但是如果此處是特殊文件例如就是磁盤本身(因為所有的設備也看做文件處理),那么i_rdev就代表這個磁盤實際的磁盤號。
i_size:inode所代表的的文件的大小,以字節為單位
i_atime:文件最后一次訪問時間
i_mtime:文件最后一次修改時間
i_ctime:inode最后一次修改時間
i_blkbits:塊大小,字節單位
i_blksize:塊大小,bit單位
i_blocks:文件所占塊數
i_version:版本號
i_bytes:文件中最后一個塊的字節數
i_sem:指向用於同步操作的信號量結構
i_alloc_sem:保護inode上的IO操作不被另一個打斷
i_zombie:僵屍inode信號量
i_op:索引節點操作
i_fop:文件操作
i_sb:inode所屬文件系統的超級塊指針
i_wait:指向索引節點等待隊列指針
i_flock:文件鎖鏈表
注意下面:address_space不是代表某個地址空間,而是用於描述頁高速緩存中的頁面的。一個文件對應一個address_space,一個address_space和一個偏移量可以確定一個頁高速緩存中的頁面。
i_mapping:表示向誰請求頁面
i_data:表示被inode讀寫的頁面
i_dquot:inode的磁盤限額
關於磁盤限額:在多任務環境下,對於每個用戶的磁盤使用限制是必須的,起到一個公平性作用。
磁盤限額分為兩種:block限額和inode限額,而且對於一個特文件系統來說,使用的限額機制都是一樣的,所以限額的操作函數
放在super_block中就OK!
i_devices:設備鏈表。共用同一個驅動程序的設備形成的鏈表。
i_pipe:指向管道文件(如果文件是管道文件時使用)
i_bdev:指向塊設備文件指針(如果文件是塊設備文件時使用)
i_cdev:指向字符設備文件指針(如果文件是字符設備時使用)
i_dnotify_mask:目錄通知事件掩碼
i_dnotify:用於目錄通知
i_state:索引節點的狀態標識:I_NEW,I_LOCK,I_FREEING
i_flags:索引節點的安裝標識
i_sock:如果是套接字文件則為True
i_write_count:記錄多少進程以刻寫模式打開此文件
i_attr_flags:文件創建標識
i_generation:保留
u:具體的inode信息
注意管理inode的四個鏈表:
inode_unused:將目前還沒有使用的inode鏈接起來(通過i_list域鏈接)
inode_in_use:目前正在使用的inode鏈接起來(通過i_list域鏈接)
super_block中的s_dirty:將所有修改過的inode鏈接起來,這個字段在super_block中(通過i_list域鏈接起來)
inode_hashtable:注意為了加快inode的查找效率,將正在使用的inode和臟inode也會放在inode_hashtable這樣一個hash結構中,
但是,不同的inode的hash值可能相等,所以將hash值相等的這些inode通過這個i_hash字段連接起來。