1. 程式人生 > >索引節點和inode的指標結構淺析

索引節點和inode的指標結構淺析

本博文參考維基百科:

索引節點是一個數據結構用來代表一個檔案系統物件,其可以是各種事情,包括一個檔案或一個目錄。每個inode儲存檔案系統物件的資料的屬性和磁碟塊位置(多個)。的檔案系統物件的屬性可包括操縱元資料(例如,修改,JVSANTEN的訪問,修改時間),以及僱主和許可權資料(例如組ID,使用者ID,許可權)。

目錄是分配給索引節點名稱的列表。該目錄包含自己,其母公司,及其每個孩子的條目。

詳細資訊
檔案描述符,檔案表和inode表中的Unix
檔案系統依賴於資料結構有關的檔案,檔案內容旁邊。前者被稱為元資料描述資料-data。每個檔案與相關聯的索引節點,它是由一個整數,通常被稱為所識別的i編號或節點號碼。
索引節點儲存有關的檔案和目錄(資料夾),如檔案所有權,訪問模式(讀,寫,執行許可權),以及檔案型別的資訊。在許多型別的檔案系統實現的,索引節點的最大數目被固定在建立檔案系統,限制檔案的檔案系統能夠容納的最大數量。在檔案系統中的inode一個典型的分配方案是總規模的百分之一。
inode號指標在裝置上的已知位置的inode表。從節點號碼,核心的檔案系統驅動程式都可以訪問的索引節點的內容,其中包括檔案​​的位置 - 從而允許訪問該檔案。
一個檔案的inode編號可以使用發現LS -i命令。該LS -i命令列印在報告的第一列的i節點號。
一些Unix風格檔案系統,如ReiserFS的省略一節點表,但必須儲存以便提供等效的功能等效的資料。該資料可以被稱為統計資料,在參照統計 系統呼叫提供資料給節目。


檔名和目錄的含義:

i節點不包含檔名,唯一的其他檔案的元資料。
Unix目錄是締合結構,其每一個包含一個檔名,一個節點號碼的列表。
檔案系統驅動程式必須搜尋尋找一個特定的檔名,目錄,然後把檔名轉化為正確的對應索引節點號。
該資料的作業系統核心的記憶體中表示稱為結構的inode中的Linux。源自系統BSD使用術語v節點,隨著v的v節點指的是核心的虛擬檔案系統層。


POSIX的inode描述
該POSIX是強烈影響的傳統標準要求的檔案系統行為的UNIX檔案系統。常規檔案必須具有以下屬性:
在該檔案的大小的位元組。
裝置ID(本標識包含檔案的裝置)。
該使用者ID檔案的所有者。
該組ID的檔案。
該檔案模式,它決定了檔案型別以及檔案的所有者,其組以及其他人可以訪問該檔案。
其他系統和使用者的標誌,以進一步保護檔案(限制其使用和修改)。
時間戳告訴當inode中的最後修改(的ctime,索引節點更改時間),該檔案內容的最後一次修改(修改時間,修改時間),並最後訪問(的atime,訪問時間)。
一個連結數,告訴許多如何硬連結指向的inode。
指向儲存檔案內容的磁碟塊(見inode的指標結構)。

該統計系統呼叫檢索檔案的inode編號和一些在inode資訊。


內聯
它可以使感非常小的檔案儲存在inode本身節省空間(無需資料塊)和查詢時間(不需要進一步的接盤)。此檔案系統功能稱為內聯。索引節點和檔案資料的嚴格分離從而可以利用現代檔案系統時不再承擔。


如果一個檔案的資料中分配給指標的資料空間配合,可以方便地使用此空間。例如,EXT2及其後繼儲存符號連結(通常是檔名 ​​)在本方式的資料,如果資料是不超過60個位元組(“快速符號連結”)。[8]


EXT4有一個名為inline_data一個檔案系統選項,當檔案系統建立過程中啟用,將允許EXT4執行內聯。作為一個inode的大小是有限的,這僅適用於非常小的檔案。



inode的指標結構

i節點指標結構是由所採用的一種結構的inode在一個檔案中的Unix檔案系統(UFS)列出一個檔案的的地址的資料塊。它也被許多相關的檔案系統,包括採用EXT3檔案系統,頗受Linux使用者。

結構
在過去,該結構可能是由十三歲指標,但大多數現代的檔案系統使用15指標。這些指標包括(在inode假設15球)的:
十二指標直接指向該檔案的資料塊(直接指標)
一個單獨的間接指標(指向指標的塊,然後指向檔案的資料塊的指標)
一個雙重間接指標(指向指向指標的其他塊的然後指向該檔案的資料塊的指標塊的指標)

一個三重間接指標(指向指向指向指標的其他塊的然後指向該檔案的資料塊的指標的其他塊的指標塊的指標)


主要特點
固定的邏輯塊大小

該結構本文附帶圖中所示部分。該結構允許的inode與固定的邏輯塊大小描述檔案系統非常大的檔案。中央的機制是,地址(也稱為塊間接塊)根據需要僅分配。例如,一個12塊檔案將被僅使用索引節點,因為它的塊裝配到可用的直接指標的數量描述。然而,13塊檔案需要一個間接塊包含第十三地址。


位置資料易於
i節點指標結構不僅允許檔案容易地分配給非連續塊,它也允許在一個檔案中的特定位置的資料可以很容易地定位。因為邏輯塊大小是固定的,這是可能的。例如,如果每個塊為8KB,檔案資料,在120至128 kB的將被指向的第一間接塊的第四指標(假定12直接指標在inode指標結構)。


間接塊

不像i節點,其被固定在數量和在檔案系統中的一個特殊的部分分配,所述間接塊可以是任何數目的,並在檔案系統中作為資料塊的相同的部分被分配。在間接塊的指標的數目是依賴於塊的指標的塊大小和尺寸。例如:用一個512位元組的塊大小,和4個位元組的塊的指標,每個間接塊可以由128(512/4)的指標。

關聯到檔案的目錄入口( dentry )結構. 裝置驅動編寫者正常地不需要關心 dentry 結構, 除了作為 filp->f_dentry->d_inode 存取 inode 結構.
file 結構如下所示:
  struct file {
  union {
  struct list_head fu_list; 檔案物件連結串列指標linux/include/linux/list.h
  struct rcu_head fu_rcuhead; RCU(Read-Copy Update)是Linux 2.6核心中新的鎖機制
  } f_u;
  struct path f_path; 包含dentry和mnt兩個成員,用於確定檔案路徑
  #define f_dentry f_path.dentry f_path的成員之一,當前檔案的dentry結構
  #define f_vfsmnt f_path.mnt 表示當前檔案所在檔案系統的掛載根目錄
  const struct file_operations *f_op; 與該檔案相關聯的操作函式
  atomic_t f_count; 檔案的引用計數(有多少程序開啟該檔案)
  unsigned int f_flags; 對應於open時指定的flag
  mode_t f_mode; 讀寫模式:open的mod_t mode引數
  off_t f_pos; 該檔案在當前程序中的檔案偏移量
  struct fown_struct f_owner; 該結構的作用是通過訊號進行I/O時間通知的資料。
  unsigned int f_uid, f_gid; 檔案所有者id,所有者組id
  struct file_ra_state f_ra; 在linux/include/linux/fs.h中定義,檔案預讀相關
  unsigned long f_version;
  #ifdef CONFIG_SECURITY
  void *f_security;
  #endif
  
  void *private_data;
  #ifdef CONFIG_EPOLL
  
  struct list_head f_ep_links;
  spinlock_t f_ep_lock;
  #endif
  struct address_space *f_mapping;
  };


檔案結構體代表一個開啟的檔案,系統中的每個開啟的檔案在核心空間都有一個關聯的struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,核心釋放這個資料結構。在核心建立和驅動原始碼中,struct file的指標通常被命名為file或filp。

接下來,核心中用inode結構表示具體的檔案,而用file結構表示開啟的檔案描述符。Linux2.6.27核心中,inode結構體具體定義如下:

struct inode {
struct hlist_node    i_hash;
struct list_head    i_list;
struct list_head    i_sb_list;
struct list_head    i_dentry;
unsigned long        i_ino;
atomic_t        i_count;
unsigned int        i_nlink;
uid_t            i_uid;
gid_t            i_gid;
 dev_t            i_rdev;   //該成員表示裝置檔案的inode結構,它包含了真正的裝置編號。
u64            i_version;
loff_t            i_size;
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t        i_size_seqcount;
#endif
struct timespec        i_atime;
struct timespec        i_mtime;
struct timespec        i_ctime;
unsigned int        i_blkbits;
blkcnt_t        i_blocks;
unsigned short          i_bytes;
umode_t            i_mode;
spinlock_t        i_lock;    
struct mutex        i_mutex;
struct rw_semaphore    i_alloc_sem;
const struct inode_operations    *i_op;
const struct file_operations    *i_fop;    
struct super_block    *i_sb;
struct file_lock    *i_flock;
struct address_space    *i_mapping;
struct address_space    i_data;
#ifdef CONFIG_QUOTA
struct dquot        *i_dquot[MAXQUOTAS];
#endif
struct list_head    i_devices;
union {
struct pipe_inode_info    *i_pipe;
struct block_device    *i_bdev;
 struct cdev        *i_cdev; //該成員表示字元裝置的核心的 內部結構。當inode指向一個字元裝置檔案時,該成員包含了指向struct cdev結構的指標,其中cdev結構是字元裝置結構體。
};
int            i_cindex;


__u32            i_generation;


#ifdef CONFIG_DNOTIFY
unsigned long        i_dnotify_mask;
struct dnotify_struct    *i_dnotify;
#endif


#ifdef CONFIG_INOTIFY
struct list_head    inotify_watches;
struct mutex        inotify_mutex;    
#endif


unsigned long        i_state;
unsigned long        dirtied_when;    


unsigned int        i_flags;


atomic_t        i_writecount;
#ifdef CONFIG_SECURITY
void            *i_security;
#endif
void            *i_private;
};