2.1 文件系統中INODE的基本概念
inode譯成中文就是索引節點,它用來存放檔案及目錄的基本信息,包含時間、檔名、使用者及羣組等。inode分爲內存中的inode和文件系統中的inode,爲了避免混淆,稱前者爲VFS inode, 而後者以EXT2爲代表,稱爲Ext2 inode。下面分別對VFS inode與Ext2 inode做一下簡單的描述:
(1) VFS inode包含文件訪問權限、屬主、組、大小、生成時間、訪問時間、最後修改時間等信息。它是linux管理文件系統的最基本單位,也是文件系統連接任何子目錄、文件的橋樑。inode結構中的靜態信息取自物理設備上的文件系統,由文件系統指定的函數填寫,它只存在於內存中,可以通過inode緩存訪問。雖然每個文件都有相應的inode結點,但是只有在需要的時候系統纔會在內存中爲其建立相應的inode數據結構,建立的inode結構將形成一個鏈表,我們可以通過遍歷這個鏈表去得到我們需要的文件結點,VFS也爲已分配的inode構造緩存和哈希表,以提高系統性能。inode結構中的struct inode_operations *i_op爲我們提供了一個inode操作列表,通過這個列表提供的函數我們可以對VFS inode結點進行各種操作。每個inode結構都有一個i結點號i_ino,在同一個文件系統中每個i結點號是唯一的。
(2) EXT2 inode用來定義文件系統的結構以及描述系統中每個文件的管理信息,每個文件都有且只有一個inode,即使文件中沒有數據,其索引結點也是存在的。每個文件用一個單獨的Ext2 inode結構來描述,而且每一個inode都有唯一的標誌號。Ext2 inode爲內存中的inode結構提供了文件的基本信息,隨着內存中inode結構的變化,系統也將更新Ext2 inode中相應的內容。Ext2 inode對應的是Ext2_inode結構。
2.2 INODE
INODE類是一個抽象類,主要用於表示File/Directory的層次關係。
它爲它的實現類定義了一系列的protected方法,它們包括:setPermissionStatus();設置文件的權限、getPermissionStatus();得到文件的權限、updatePermissionStatus();修改文件的權限。得到用戶、設定用戶等等。
同時還有部分抽象方法。如:abstract boolean isDirectory();用來判定這個INode是目錄還是文件。abstract int collectSubtreeBlocksAndClear(List<Block> v);用於返回這個子樹的所有文件數,當這個INode被刪除的時候,清除這個子樹下面的所有引用。
還有一些default方法。如void setLocalName(String name)設置文件名,得到INode的最後一次修改時間。INodeDirectory getParent();得到一個父的INode。long getModificationTime()。得到最後一次的修改時間。
INodeDirectory和INodeFile是INode的兩個主要實現類。這部分主要應用了合成模式,INodeFile是葉子節點,它沒有內部的樹結構。而INodeDirectory是樹枝節點,它還可以包含子樹。
INode的相關類如下所示:
2.3 INodeDirectory
INodeDirectory主要定義了一個INodeFile的目錄結構,它有幾個常用的構造函數
INodeDirectory(String name, PermissionStatus permissions)、INodeDirectory (Permission Status permissions, long mTime) 其中long mTime是最後的修改時間。INodeDirectory(INodeDirectory other)這個構造函數的作用是,直接把當前目錄複製成其它的目錄。
問題4:int getExistingPathINodes(byte[][] components, INode[] existing)其中的components是一個二維數組,爲什麼要弄成byte型的?existing這個一維數組存儲的是當前INode的路徑麼,爲什麼要限制這個數組的大小(難道是由於先前設定的子目錄的個數)?這個函數返回的是現在存活的INode的節點的個數?
在INode[] getExistingPathINodes(String path) 函數中調用了this.getExistingPathINodes(components, inodes); 它又不返回個值,不是白調用了?
假設路徑是/c1/c2/c3 根據/分隔成c1、c2、c3 這時String[] str1[0]=c1 ,str2[1]=c2, str3[2]=c3 。static byte[][] getPathComponents(String[] strings)再把這一組String轉化爲byte[][]的二維數組。
2.4 INodeDirectoryWithQuota
INodeDirectoryWithQuota是INodeDirectory的子類,它有一些定量的限制,如一個文件夾中的子文件夾的數量的限制
2.5 INodeFile
INodeFile中有三個最爲重要的元數據,它們分別是:
protected BlockInfo blocks[] = null;//這個INodeFile所包含的塊
protected short blockReplication;//複製的次數
protected long preferredBlockSize;//可以看出是對Block大小的一個定義
猜想:其中,blocks是一個BlockInfo的數組,它用來指向這個文件所在的第一個Block,而每一個Block又有三個指針域,這樣通過鏈式的結構就能夠完整地讀取一個文件了。
這個類中大都是一些對這個文件所屬的Block的操作,比較容易理解。
2.6 INodeFileUnderConstruction
這個類是INodeFile的子類,它表示的是正在構造中的INodeFile。INodeFile和INodeFileUnderConstruction這兩個類中共有兩個比較有意思的方法它們分別是:
INodeFileUnderConstruction toINodeFileUnderConstruction()和INodeFile convert ToInodeFile()它們的作用分別是把一個INodeFile變爲UnderConstruction和把一個INodeFileUnderConstruction變爲一個INodeFile。