天天看點

Android 檔案系統之 superblock/Inode/Inode tablesuperblock定義:使用dumpe2fs工具dumpsuperblock相關資訊:Inode /Inode table/File/Dentry:參考資料

superblock定義:

顧名思義超級塊,主要是用來存放目前檔案系統的一些全局資訊,包括但不限于:inode個數,block個數,mount時間、mount節點、journal資訊等

superblock資料:

Android 檔案系統之 superblock/Inode/Inode tablesuperblock定義:使用dumpe2fs工具dumpsuperblock相關資訊:Inode /Inode table/File/Dentry:參考資料

圖1 superblock 資料和結構體

使用dumpe2fs工具dumpsuperblock相關資訊:

Android 檔案系統之 superblock/Inode/Inode tablesuperblock定義:使用dumpe2fs工具dumpsuperblock相關資訊:Inode /Inode table/File/Dentry:參考資料

圖2 superblock dump資訊

注:該dump資訊注意同上圖的資訊一一對照更能加深了解。

superblock 資料結構

struct ext4_super_block {
/*00*/  __le32  s_inodes_count;     /* Inodes count */
    __le32  s_blocks_count_lo;  /* Blocks count */
    __le32  s_r_blocks_count_lo;    /* Reserved blocks count */
    __le32  s_free_blocks_count_lo; /* Free blocks count */
/*10*/  __le32  s_free_inodes_count;    /* Free inodes count */
    __le32  s_first_data_block; /* First Data Block */
    __le32  s_log_block_size;   /* Block size */
    __le32  s_log_cluster_size; /* Allocation cluster size */
/*20*/  __le32  s_blocks_per_group; /* # Blocks per group */
    __le32  s_clusters_per_group;   /* # Clusters per group */
    __le32  s_inodes_per_group; /* # Inodes per group */
    __le32  s_mtime;        /* Mount time */
/*30*/  __le32  s_wtime;        /* Write time */
    __le16  s_mnt_count;        /* Mount count */
    __le16  s_max_mnt_count;    /* Maximal mount count */
    __le16  s_magic;        /* Magic signature */
    __le16  s_state;        /* File system state */
    __le16  s_errors;       /* Behaviour when detecting errors */
    __le16  s_minor_rev_level;  /* minor revision level */
/*40*/  __le32  s_lastcheck;        /* time of last check */
    __le32  s_checkinterval;    /* max. time between checks */
    __le32  s_creator_os;       /* OS */
    __le32  s_rev_level;        /* Revision level */
        //.....
};
           

Inode /Inode table/File/Dentry:

Inode:節點,是檔案(對象、實體)在檔案系統中的唯一标示。可以這麼來了解,Inode是底層封裝給檔案系統的最小操作單元。

Inode是在UNIX* 檔案系統中用于描述檔案系統對象(如一個檔案或者目錄)的一個資料結構,每個inode都存儲有相關屬性以及系統對象資料的存儲位置。

Inode是檔案(對象、實體)在檔案系統中的唯一辨別。獨立的檔案系統提供了filename和唯一inode辨別符之間的轉換方法。inode結構的一部分如下圖五所示,同僚也展示了其他的一些同inode強相關的結構。

在這裡我們需要注意 inode_operations file_operations。這些結構所對應的最小操作單元是inode。例如:inode_operations定義了對inode上的目錄的操作,file_operations定義了inode上檔案的操作(通常叫做系統調用)

Inode table:Inode 表,描述inode的一個數組。The inode table is a linear array of struct ext4_inode

File:已打開檔案在記憶體中的表示,主要用于加你程序和磁盤上檔案的對應關系;通常有sys_open()建立。

Dentry:目錄對象,代表一個目錄項(包含該目錄對象的索引節點,子目錄連結清單、父目錄連結清單對象以及與他攻擊的目錄對象連結清單使用計數等)是路徑的一部分

(路徑中每個組成部分都由一個索引節點對象表示),隻存在與記憶體中。

block size:塊大小,通常為4k(可變的),通常不會超過page seize。

File Descriptor:在類UNIX*作業系統中,檔案描述符是一個抽象的用于通路檔案或者其他輸入輸出資源一個訓示符。file descriptor大于零,file descriptor的最大值通常由作業系統限定。

看了上面的定義是不是有點兒饒?沒關系,看下下面的邏輯圖:

Android 檔案系統之 superblock/Inode/Inode tablesuperblock定義:使用dumpe2fs工具dumpsuperblock相關資訊:Inode /Inode table/File/Dentry:參考資料

圖3 inode dentry等之間關系

從上圖我們看到,有三個程序process1、process2、process3,并且有與之對應的三個檔案對象file object1 、file_object2和file_object3,這都是一一對應的。file_object1 、file_object2卻對應到了同一個dentry object

而兩個(不一定就隻是兩個,可能一個、或多個)dentry object隻對應一個inode object;inode object的相關資訊在superblock中有存儲的。

這樣我們就一下子從作業系統程序級别聯系到了磁盤存儲級别了。其實這裡有一個更好的了解方式就是,分為兩層:軟體層、硬體層;軟體層你看得見摸不着,隻是一種狀态;硬體層你能通過技術手段看到,不隻是狀态更是一種持續。

Dentry 和 Inode

通過上圖3,大緻了解了Dentry、Inode、File、superblock之間的關系。但是也容易看到這之間的關系最重要的當屬Dentry和Inode之間的關系了,這裡着重介紹下。

假設我們有如下結構

/
|
foo
|   \
bar  bar2
           

在上面所示的結構中,可以提取到如下資訊:

有4個inode,分别是foo,bar,bar2,/

有3個denry, 分别是bar–>foo、bar2–>foo、foo–>/

對于上述的關系,做一個簡單的說明。對于一個d_name為bar的dentry來說,該dentry擁有一個指向底層檔案名為bar的指針d_inode、一個指向父dentry的指針d_parent。對于root dentry來說,d_parent指向自己。

從dentry到inode之間由d_inode指針來維護。一個inode可以對應多個dentry,多個dentry隻能對應一個inode。在同一檔案系統中,一個檔案可以被多個dentry引用(硬連結)。這種dentry到inode之間的映射關系有這樣一種特性:

除非目前檔案的所有dentry引用都被删除,否則目前file是不會被删除的。

檔案和目錄的操作者是程序,其實質是操作想用的資料結構。在程序所操作的資料結構中包含了指向dentry的指針。

Inode和superblock

Inode也同superblock之間儲存有密切的聯系。在inode的結構體中有一個指向superblock的指針i_sb。superblock是一個描述了目前檔案系統狀态的結構體,通常是存儲在實體裝置上。

mount

這裡介紹下mount,之前一直搞不懂mount到底要幹嘛。

将檔案系統和儲存設備聯系起來的方法:挂載(mounting)。mount指令通常被用于将檔案系統和目前檔案目錄級别聯系起來。在mount過程中需要提供檔案系統類型、檔案系統、挂載點。

  • 第一步:基于目前檔案系統中的檔案建立一個檔案系統file256mb.img(file256mb.img對于目前檔案系統來說是一個檔案)。

    dd if=/dev/zero of=file256mb.img bs=4k count=65536

  • 第二步:使用mke2fs在file265mb.img上建立檔案系統(從file256mb.img自身角度來說,他是一個檔案系統了)

    mke2fs -t ext4 -c file265mb.img

  • 第三步:建立一個挂載點(從目前系統角度來說,他就是一個目錄,一個檔案;但是從即将要挂在檔案系統的角度來說,他就是一個儲存設備)

    mkdir /path/to/mount/point

  • 第四步:将檔案系統挂載到目前檔案級别(将檔案系統和儲存設備關聯起來) mount -t ext4

    file256mb.img /path/to/point

參考資料

File_descriptor

Inode

Ext4_Disk_Layout

繼續閱讀