|
藍森林 http://www.lslnet.com 2006年8月18日 15:18
學習linux的inode,已經把我學暈了!!!
是我看的資料有問題,還是我腦袋有問題!!
就是沒看明白!!
嗨!! |
學習linux的inode,已經把我學暈了!!!
Ext2 文件系統的硬盤佈局
本文主要講述 Linux 上比較流行的 ext2 文件系統在硬盤分區上的詳細佈局情況。Ext2 文件系統加上日誌支持的下一個版本是 ext3 文件系統,它和 ext2 文件系統在硬盤佈局上是一樣的,其差別僅僅是 ext3 文件系統在硬盤上多出了一個特殊的 inode(可以理解為一個特殊文件),用來記錄文件系統的日誌,也即所謂的 journal。由於本文並不討論日誌文件,所以本文的內容對於 ext2 和 ext3 都是適用的。
1 前言
本文的資料來源是 Linux 內核中 ext3 文件系統的源代碼。為了便於讀者查閱源代碼,本文中一些關鍵的技術詞彙都使用了內核源代碼中所使用的英語單詞,而沒有使用相應的中文翻譯。(這種方法是否恰當,還請讀者朋友們指教。)
2 粗略的描述
對於 ext2 文件系統來說,硬盤分區首先被劃分為一個個的 block,一個 ext2 文件系統上的每個 block 都是一樣大小的,但是對於不同的 ext2 文件系統,block 的大小可以有區別。典型的 block 大小是 1024 bytes 或者 4096 bytes。這個大小在創建 ext2 文件系統的時候被決定,它可以由系統管理員指定,也可以由文件系統的創建程序根據硬盤分區的大小,自動選擇一個較合理的值。這些 blocks 被聚在一起分成幾個大的 block group。每個 block group 中有多少個 block 是固定的。
每個 block group 都相對應一個 group descriptor,這些 group descriptor 被聚在一起放在硬盤分區的開頭部分,跟在 super block 的後面。所謂 super block,我們下面還要講到。在這個 descriptor 當中有幾個重要的 block 指針。我們這裡所說的 block 指針,就是指硬盤分區上的 block 號數,比如,指針的值為 0,我們就說它是指向硬盤分區上的 block 0;指針的值為 1023,我們就說它是指向硬盤分區上的 block 1023。我們注意到,一個硬盤分區上的 block 計數是從 0 開始的,並且這個計數對於這個硬盤分區來說是全局性質的。
在 block group 的 group descriptor 中,其中有一個 block 指針指向這個 block group 的 block bitmap,block bitmap 中的每個 bit 表示一個 block,如果該 bit 為 0,表示該 block 中有數據,如果 bit 為 1,則表示該 block 是空閒的。注意,這個 block bitmap 本身也正好只有一個 block 那麼大小。假設 block 大小為 S bytes,那麼 block bitmap 當中只能記載 8*S 個 block 的情況(因為一個 byte 等於 8 個 bits,而一個 bit 對應一個 block)。這也就是說,一個 block group 最多只能有 8*S*S bytes 這麼大。
在 block group 的 group descriptor 中另有一個 block 指針指向 inode bitmap,這個 bitmap 同樣也是正好有一個 block 那麼大,裡面的每一個 bit 相對應一個 inode。硬盤上的一個 inode 大體上相對應於文件系統上的一個文件或者目錄。關於 inode,我們下面還要進一步講到。
在 block group 的 descriptor 中另一個重要的 block 指針,是指向所謂的 inode table。這個 inode table 就不止一個 block 那麼大了。這個 inode table 就是這個 block group 中所聚集到的全部 inode 放在一起形成的。
一個 inode 當中記載的最關鍵的信息,是這個 inode 中的用戶數據存放在什麼地方。我們在前面提到,一個 inode 大體上相對應於文件系統中的一個文件,那麼用戶文件的內容存放在什麼地方,這就是一個 inode 要回答的問題。一個 inode 通過提供一系列的 block 指針,來回答這個問題。這些 block 指針指向的 block,裡面就存放了用戶文件的內容。
2.1 回顧
現在我們回顧一下。硬盤分區首先被分為好多個 block。這些 block 聚在一起,被分成幾組,也就是 block group。每個 block group 都有一個 group descriptor。所有這些 descriptor 被聚在一起,放在硬盤分區的開頭部分,跟在 super block 的後面。從 group descriptor 我們可以通過 block 指針,找到這個 block group 的 inode table 和 block bitmap 等等。從 inode table 裡面,我們就可以看到一個個的 inode 了。從一個 inode,我們通過它裡面的 block 指針,就可以進而找到存放用戶數據的那些 block。我們還要提一下,block 指針不是可以到處亂指的。一個 block group 的 block bitmap 和 inode bitmap 以及 inode table,都依次存放在這個 block group 的開頭部分,而那些存放用戶數據的 block 就緊跟在它們的後面。一個 block group 結束後,另一個 block group 又跟著開始。
3 詳細的佈局情況
3.1 Super Block
所謂 ext2 文件系統的 super block,就是硬盤分區開頭(開頭的第一個 byte 是 byte 0)從 byte 1024 開始往後的一部分數據。由於 block size 最小是 1024 bytes,所以 super block 可能是在 block 1 中(此時 block 的大小正好是 1024 bytes),也可能是在 block 0 中。
硬盤分區上 ext3 文件系統的 super block 的詳細情況如下。其中 __u32 是表示 unsigned 不帶符號的 32 bits 的數據類型,其餘類推。這是 Linux 內核中所用到的數據類型,如果是開發用戶空間(user-space)的程序,可以根據具體計算機平台的情況,用 unsigned long 等等來代替。下面列表中關於 fragments 的部分可以忽略,Linux 上的 ext3 文件系統並沒有實現 fragments 這個特性。另外要注意,ext3 文件系統在硬盤分區上的數據是按照 Intel 的 Little-endian 格式存放的,如果是在 PC 以外的平台上開發 ext3 相關的程序,要特別注意這一點。如果只是在 PC 上做開發,倒不用特別注意。
struct ext3_super_block {
/*00*/ __u32 s_inodes_count; /* inodes 計數 */
__u32 s_blocks_count; /* blocks 計數 */
__u32 s_r_blocks_count; /* 保留的 blocks 計數 */
__u32 s_free_blocks_count; /* 空閒的 blocks 計數 */
/*10*/ __u32 s_free_inodes_count; /* 空閒的 inodes 計數 */
__u32 s_first_data_block; /* 第一個數據 block */
__u32 s_log_block_size; /* block 的大小 */
__s32 s_log_frag_size; /* 可以忽略 */
/*20*/ __u32 s_blocks_per_group; /* 每 block group 的 block 數量 */
__u32 s_frags_per_group; /* 可以忽略 */
__u32 s_inodes_per_group; /* 每 block group 的 inode 數量 */
__u32 s_mtime; /* Mount time */
/*30*/ __u32 s_wtime; /* Write time */
__u16 s_mnt_count; /* Mount count */
__s16 s_max_mnt_count; /* Maximal mount count */
__u16 s_magic; /* Magic 簽名 */
__u16 s_state; /* File system state */
__u16 s_errors; /* Behaviour when detecting errors */
__u16 s_minor_rev_level; /* minor revision level */
/*40*/ __u32 s_lastcheck; /* time of last check */
__u32 s_checkinterval; /* max. time between checks */
__u32 s_creator_os; /* 可以忽略 */
__u32 s_rev_level; /* Revision level */
/*50*/ __u16 s_def_resuid; /* Default uid for reserved blocks */
__u16 s_def_resgid; /* Default gid for reserved blocks */
__u32 s_first_ino; /* First non-reserved inode */
__u16 s_inode_size; /* size of inode structure */
__u16 s_block_group_nr; /* block group # of this superblock */
__u32 s_feature_compat; /* compatible feature set */
/*60*/ __u32 s_feature_incompat; /* incompatible feature set */
__u32 s_feature_ro_compat; /* readonly-compatible feature set */
/*68*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */
/*78*/ char s_volume_name[16]; /* volume name */
/*88*/ char s_last_mounted[64]; /* directory where last mounted */
/*C8*/ __u32 s_algorithm_usage_bitmap; /* 可以忽略 */
__u8 s_prealloc_blocks; /* 可以忽略 */
__u8 s_prealloc_dir_blocks; /* 可以忽略 */
__u16 s_padding1; /* 可以忽略 */
/*D0*/ __u8 s_journal_uuid[16]; /* uuid of journal superblock */
/*E0*/ __u32 s_journal_inum; /* 日誌文件的 inode 號數 */
__u32 s_journal_dev; /* 日誌文件的設備號 */
__u32 s_last_orphan; /* start of list of inodes to delete */
/*EC*/ __u32 s_reserved[197]; /* 可以忽略 */
};
我們可以看到,super block 一共有 1024 bytes 那麼大。在 super block 中,我們第一個要關心的字段是 magic 簽名,對於 ext2 和 ext3 文件系統來說,這個字段的值應該正好等於 0xEF53。如果不等的話,那麼這個硬盤分區上肯定不是一個正常的 ext2 或 ext3 文件系統。從這裡,我們也可以估計到,ext2 和 ext3 的兼容性一定是很強的,不然的話,Linux 內核的開發者應該會為 ext3 文件系統另選一個 magic 簽名才對。
在 super block 中另一個重要的字段是 s_log_block_size。從這個字段,我們可以得出真正的 block 的大小。我們把真正 block 的大小記作 B,B = 1 << (s_log_block_size + 10),單位是 bytes。舉例來說,如果這個字段是 0,那麼 block 的大小就是 1024 bytes,這正好就是最小的 block 大小;如果這個字段是 2,那麼 block 大小就是 4096 bytes。從這裡我們就得到了 block 的大小這一非常重要的數據。
3.2 Group Descriptors
我們繼續往下,看跟在 super block 後面的一堆 group descriptors。首先注意到 super block 是從 byte 1024 開始,一共有 1024 bytes 那麼大。而 group descriptors 是從 super block 後面的第一個 block 開始。也就是說,如果 super block 是在 block 0,那麼 group descriptors 就是從 block 1 開始;如果 super block 是在 block 1,那麼 group descriptors 就是從 block 2 開始。因為 super block 一共只有 1024 bytes 那麼大,所以不會超出一個 block 的邊界。如果一個 block 正好是 1024 bytes 那麼大的話,我們看到 group descriptors 就是緊跟在 super block 後面的了,沒有留一點空隙。而如果一個 block 是 4096 bytes 那麼大的話,那麼在 group descriptors(從 byte 4096 開始)和 super block 的結尾之間,就有一定的空隙(4096 - 2048 bytes)。
那麼硬盤分區上一共有多少個 block group,或者說一共有多少個 group descriptors,這我們要在 super block 中找答案。super block 中的 s_blocks_count 記錄了硬盤分區上的 block 的總數,而 s_blocks_per_group 記錄了每個 group 中有多少個 block。顯然,文件系統上的 block groups 數量,我們把它記作 G,G = (s_blocks_count - s_first_data_block - 1) / s_blocks_per_group + 1。為什麼要減去 s_first_data_block,因為 s_blocks_count 是硬盤分區上全部的 block 的數量,而在 s_first_data_block 之前的 block 是不歸 block group 管的,所以當然要減去。最後為什麼又要加一,這是因為尾巴上可能多出來一些 block,這些 block 我們要把它劃在一個相對較小的 group 裡面。
注意,硬盤分區上的所有這些 group descriptors 要能塞在一個 block 裡面。也就是說 groups_count * descriptor_size 必須小於等於 block_size。
知道了硬盤分區上一共有多少個 block group,我們就可以把這麼多個 group descriptors 讀出來了。先來看看 group descriptor 是什麼樣子的。
struct ext3_group_desc
{
__u32 bg_block_bitmap; /* block 指針指向 block bitmap */
__u32 bg_inode_bitmap; /* block 指針指向 inode bitmap */
__u32 bg_inode_table; /* block 指針指向 inodes table */
__u16 bg_free_blocks_count; /* 空閒的 blocks 計數 */
__u16 bg_free_inodes_count; /* 空閒的 inodes 計數 */
__u16 bg_used_dirs_count; /* 目錄計數 */
__u16 bg_pad; /* 可以忽略 */
__u32 bg_reserved[3]; /* 可以忽略 */
};
每個 group descriptor 是 32 bytes 那麼大。從上面,我們看到了三個關鍵的 block 指針,這三個關鍵的 block 指針,我們已經在前面都提到過了。
3.3 Inode
前面都準備好了以後,我們現在終於可以開始讀取文件了。首先要讀的,當然是文件系統的根目錄。注意,這裡所謂的根目錄,是相對於這一個文件系統或者說硬盤分區而言的,它並不一定是整個 Linux 操作系統上的根目錄。這裡的這個 root 目錄存放在一個固定的 inode 中,這就是文件系統上的 inode 2。需要提到 inode 計數同 block 計數一樣,也是全局性質的。這裡需要特別注意的是,inode 計數是從 1 開始的,而前面我們提到過 block 計數是從 0 開始,這個不同在開發程序的時候要特別留心。(這一奇怪的 inode 計數方法,曾經讓本文作者大傷腦筋。)
那麼,我們先來看一下得到一個 inode 號數以後,怎樣讀取這個 inode 中的用戶數據。在 super block 中有一個字段 s_inodes_per_group 記載了每個 block group 中有多少個 inode。用我們得到的 inode 號數除以 s_inodes_per_group,我們就知道了我們要的這個 inode 是在哪一個 block group 裡面,這個除法的餘數也告訴我們,我們要的這個 inode 是這個 block group 裡面的第幾個 inode;然後,我們可以先找到這個 block group 的 group descriptor,從這個 descriptor,我們找到這個 group 的 inode table,再從 inode table 找到我們要的第幾個 inode,再以後,我們就可以開始讀取 inode 中的用戶數據了。
這個公式是這樣的:block_group = (ino - 1) / s_inodes_per_group。這裡 ino 就是我們的 inode 號數。而 offset = (ino - 1) % s_inodes_per_group,這個 offset 就指出了我們要的 inode 是這個 block group 裡面的第幾個 inode。
找到這個 inode 之後,我們來具體的看看 inode 是什麼樣的。
struct ext3_inode {
__u16 i_mode; /* File mode */
__u16 i_uid; /* Low 16 bits of Owner Uid */
__u32 i_size; /* 文件大小,單位是 byte */
__u32 i_atime; /* Access time */
__u32 i_ctime; /* Creation time */
__u32 i_mtime; /* Modification time */
__u32 i_dtime; /* Deletion Time */
__u16 i_gid; /* Low 16 bits of Group Id */
__u16 i_links_count; /* Links count */
__u32 i_blocks; /* blocks 計數 */
__u32 i_flags; /* File flags */
__u32 l_i_reserved1; /* 可以忽略 */
__u32 i_block[EXT3_N_BLOCKS]; /* 一組 block 指針 */
__u32 i_generation; /* 可以忽略 */
__u32 i_file_acl; /* 可以忽略 */
__u32 i_dir_acl; /* 可以忽略 */
__u32 i_faddr; /* 可以忽略 */
__u8 l_i_frag; /* 可以忽略 */
__u8 l_i_fsize; /* 可以忽略 */
__u16 i_pad1; /* 可以忽略 */
__u16 l_i_uid_high; /* 可以忽略 */
__u16 l_i_gid_high; /* 可以忽略 */
__u32 l_i_reserved2; /* 可以忽略 */
};
我們看到在 inode 裡面可以存放 EXT3_N_BLOCKS(= 15)這麼多個 block 指針。用戶數據就從這些 block 裡面獲得。15 個 blocks 不一定放得下全部的用戶數據,在這裡 ext3 文件系統採取了一種分層的結構。這組 15 個 block 指針的前 12 個是所謂的 direct blocks,裡面直接存放的就是用戶數據。第 13 個 block,也就是所謂的 indirect block,裡面存放的全部是 block 指針,這些 block 指針指向的 block 才被用來存放用戶數據。第 14 個 block 是所謂的 double indirect block,裡面存放的全是 block 指針,這些 block 指針指向的 block 也被全部用來存放 block 指針,而這些 block 指針指向的 block,才被用來存放用戶數據。第 15 個 block 是所謂的 triple indirect block,比上面說的 double indirect block 有多了一層 block 指針。作為練習,讀者可以計算一下,這樣的分層結構可以使一個 inode 中最多存放多少字節的用戶數據。(計算所需的信息是否已經足夠?還缺少哪一個關鍵數據?)
一個 inode 裡面實際有多少個 block,這是由 inode 字段 i_size 再通過計算得到的。i_size 記錄的是文件或者目錄的實際大小,用它的值除以 block 的大小,就可以得出這個 inode 一共佔有幾個 block。注意上面的 i_blocks 字段,粗心的讀者可能會以為是這一字段記錄了一個 inode 中實際用到多少個 block,其實不是的。那麼這一字段是幹什麼用的呢,讀者朋友們可以借這個機會,體驗一下閱讀 Linux 內核源代碼的樂趣。;-)
3.4 文件系統的目錄結構
現在我們已經可以讀取 inode 的內容了,再往後,我們將要讀取文件系統上文件和目錄的內容。讀取文件的內容,只要把相應的 inode 的內容全部讀出來就行了;而目錄只是一種固定格式的文件,這個文件按照固定的格式記錄了目錄中有哪些文件,以及它們的文件名,和 inode 號數等等。
struct ext3_dir_entry_2 {
__u32 inode; /* Inode 號數 */
__u16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
__u8 file_type;
char name[EXT3_NAME_LEN]; /* File name */
};
上面用到的 EXT3_NAME_LEN 是 255。注意,在硬盤分區上的 dir entry 不是固定長度的,每個 dir entry 的長度由上面的 rec_len 字段記錄。
4 小結
有了以上的這些信息,我們就可以讀取一個 ext3 文件系統的全部內容了。如果讀者有 Windows 驅動程序開發的經驗,從本文的信息,開發一個 Windows 下只讀的 ext3 文件系統是可能的。但是要想又讀又寫,那還需要瞭解 Ext3 的日誌文件的結構,而本文限於篇幅,並沒有包括這方面的內容。
參考文獻
1 Remy Card, Theodore Ts'o, Stephen Tweedie, Design and Implementation of the Second Extended Filesystem, http://web.mit.edu/tytso/www/linux/ext2intro.html
2 Linux Kernel 2.4.18 Source Code, http://lxr.linux.no/source/fs/ext3/ |
學習linux的inode,已經把我學暈了!!!
Linux文件系統類型全接觸
隨著Linux的不斷發展,Linux所支持的文件系統類型也在迅速擴充。伴隨著 Linux 2.4 版本的發行,出現了大量的文件系統可能性,其中包括 ReiserFS、XFS、JFS 和其它文件系統。每一個不同版本的Linux所支持的文件系統類型種類都有所不同,如何知道自己的Linux發行版本的類型哪?可以這樣操作:(以筆者使用的Mandrake Linux 8.2為例,)
以超級用戶權限登陸Linux,進入/Lib/modules/2.4.18-6mdk/kernel/fs目錄執行命令(不同Linux發行版本的Fs目錄有些不同你可以用查找FS文件夾的方法找到它,見圖-1):
#ls
圖-1 Mandrake Linux 支持的文件系統類型
/Lib/modules/2.4.18-6mdk/kernel/fs中查出當前系統所支持的文件系統種類。從圖-1中可以看到筆者使用的Mandrake Linux 8.2支持的文件系統非常多。Linux系統核心支持十多種文件系統類型:jfs、 ReiserFS、ext、ext2、ext3、iso9660、xfs、 minx、msdos、umsdos、Vfat、NTFS、Hpfs、Nfs、smb、sysv、proc等。
這裡我們對最常用的幾個文件系統的發展情況和優缺點作詳細介紹:ext、ext2、ext3、jsf、 、xfs、ReiserFS。
一、 ext
ext是第一個專門為Linux的文件系統類型,叫做擴展文件系統。它在1992年4月完成的。它為Linux的發展取得了重要作用。但是在性能和兼容性上存在許多缺陷。現在已經很少使用了。
二、 ext2
ext2是為解決ext文件系統的缺陷而設計的可擴展的高性能的文件系統。又被稱為二級擴展文件系統。它是在1993年發佈的,設計者是Rey Card。ext2是Linux文件系統類型中使用最多的格式。並且在速度和CPU利用率上較突出,是 GNU/Linux 系統中標準的文件系統,其特點為存取文件的性能極好,對於中小型的文件更顯示出優勢,這主要得利於其簇快取層的優良設計。Ext2 可以支持256字節的長文件名,其單一文件大小與文件系統本身的容量上限與文件系統本身的簇大小有關,在一般常見的Intel x86兼容處理器的系統中,簇最大為 4KB, 則單一文件大小上限為 2048GB, 而文件系統的容量上限為 6384GB。儘管Linux可以支持種類繁多的文件系統,但是2000年以前幾乎所有的Linux發行版都用ext2作為默認的文件系統。
ext2的缺點:ext2的設計者主要考慮的是文件系統性能方面的問題。ext2在寫入文件內容的同時並沒有同時寫入文件的meta-data(和文件有關的信息,例如:權限、所有者以及創建和訪問時間)。換句話說,Linux先寫入文件的內容,然後等到有空的時候才寫入文件的meta-data。這樣若出現寫入文件內容之後但在寫入文件的meta-data之前系統突然斷電,就可能造成在文件系統就會處於不一致的狀態。在一個有大量文件操作的系統中出現這種情況會導致很嚴重的後果。另外但由於目前核心 2.4 所能使用的單一分割區最大只有 2048GB,儘管文件系統的容量上限為 6384G但是實際上能使用的文件系統容量最多也只有 2048GB。
三、 ext3
ext3是由開放資源社區開發的日誌文件系統,主要開發人員是Stephen tweedie。ext3被設計成是ext2的升級版本,盡可能地方便用戶從ext2fs向ext3fs遷移。ext3在ext2的基礎上加入了記錄元數據的日誌功能,努力保持向前和向後的兼容性。這個文件系統被稱為ext2的下一個版本。也就是在保有目前 ext2 的格式之下再加上日誌功能。ext3是一種日誌式文件系統。日誌式文件系統的優越性在於:由於文件系統都有快取層參與運作,如不使用時必須將文件系統卸下,以便將快取層的資料寫回磁盤中。因此每當系統要關機時,必須將其所有的文件系統全部卸下後才能進行關機。如果在文件系統尚未卸下前就關機 (如停電) 時,下次重開機後會造成文件系統的資料不一致,故這時必須做文件系統的重整工作,將不一致與錯誤的地方修復。然而,此一重整的工作是相當耗時的,特別是容量大的文件系統,而且也不能百分之百保證所有的資料都不會流失。故這在大型的伺服器上可能會造成問題。
ext3的缺點:其最大的缺點是沒有現代文件系統所具有的能提高文件數據處理速度和解壓的高性能,另外使用ext3文件系統時要注意硬盤限額問題,在這個問題解決之前,不推薦在重要的企業應用上採用ext3+disk quota(磁盤配額)。
四、 jsf
jsf提供了基於日誌的字節級文件系統,該文件系統是為面向事務的高性能系統而開發的。jsf(Journaled File System Technology for Linux)的開發者包括AIX(IBM的Unix)的jsf的主要開發者。在AIX上,jfs已經經受住了考驗。它是可靠、快速和容易使用的。2000年2月,ibm宣佈在一個開放資源許可證下,移植linux版的JSF文件系統。JSFs也是一個有大量用戶安裝使用的企業級文件系統。它具有可伸縮性和健壯性,與非日誌文件系統相比,它的優點是其快速重啟能力:Jfs 能夠在幾秒或幾分鐘內就把文件系統恢復到一致狀態。雖然 jsf 主要是為滿足服務器(從單處理器系統到高級多處理器和群集系統)的高吞吐量和可靠性需求而設計的,jsf 還可用於想得到高性能和可靠性的客戶機配置因為在系統崩潰時,jsf 能提供快速文件系統重啟時間,所以它是因特網文件服務器的關鍵技術。使用數據庫日誌處理技術,jsf 能在幾秒或幾分鐘之內把文件系統恢復到一致狀態。而在非日誌文件系統中,文件恢復可能花費幾小時或幾天。
jsf的缺點:使用jsf日誌文件系統,性能上會有一定損失,系統資源佔用的比率也偏高。是因為當它保持一個日誌時,系統需要寫許多數據。
五、ReiserFS
ReiserFS的第一次公開亮相是在1997年7月23日,Hans Reiser把他的基於平衡樹結構的ReiserFS文件系統在網上公佈。ReiserFS 3.6.x(作為 Linux 2.4 一部分的版本)是由 Hans Reiser 和他的在Namesys 的開發組共同開發設計的。Hans 和他的組員們相信最好的文件系統是那些能夠有助於創建獨立的共享環境或者命名空間的文件系統,應用程序可以在其中更直接、有效和有力地相互作用。為了實現這一目標,文件系統就應該滿足其使用者對性能和功能方面的需要。那樣,使用者就能夠繼續直接地使用文件系統,而不必建造運行在文件系統之上(如數據庫之類)的特殊目的層。ReiserFS 使用了特殊的優化 b* 平衡樹(每個文件系統一個)來組織所有的文件系統數據。這為其自身提供了非常不錯的性能改進,也能夠減輕文件系統設計上的人為約束。例如,現在一個目錄下可以容納 ext00,000 個子目錄。另一個使用 b* 樹的好處就是 ReiserFS 能夠像大多其它的下一代文件系統一樣,根據需要動態地分配索引節,而不必在文件系統創建時建立固定的索引節。這有助於文件系統更靈活地適應其面臨的各種存儲需要,同時提供附加的空間有效率。
Reiserfs被看作是一個更加激進和現代的文件系統。傳統的UNIX文件系統是按盤塊來進行空間分配的,對於目錄和文件等的查找使用了簡單的線性查找。這些設計在當時是合適的,但隨著磁盤容量的增大和應用需求的增加,傳統文件系統在存儲效率,速度和功能上已顯落後。在reiserfs的下一版reiser4中還提供了對事務的支持。在http://www.namesys.com/v4/v4.html 中有reiser4的介紹和一個簡單的reiser4的性能測試。
ReiserFS的缺點:ReiserFS一個最受人批評的缺點是每升級一個版本,都將要將磁盤重新格式化一次。你可以在http://www.namesys.com/ 網站瞭解關於 ReiserFS 的更多信息。
六、Xfs
xfs是一種非常優秀的日誌文件系統,它是SGI公司設計的。xfs被稱為業界最先進的、最具可升級性的文件系統技術。它是一個全64位,快速、穩固的日誌文件系統,多年用於SGI的IRIX操作系統。sgi決定支持Linux社區,將關鍵的基本架構技術授權於Linux。它以開放資源形式發佈了他們自己擁有的xfs的源代碼,並開始進行移植。此工作進展得很快,目前已進入beta版階段。作為一個64位文件系統,xfs可以支持超大數量的文件(9g×1gb,甚至更大的18g×1gb),可在大型 2d 和 3d 數據方面提供顯著的性能。xfs有能力預測其它文件系統薄弱環節,同時xfs提供了在不妨礙性能的情況下增強可靠性和快速的事故恢復。SGI的xfs可為linux和開放資源社區帶來的新特性有:可升級性:xfs被設計成可升級,以面對大多數的存儲容量和i/o存儲需求,可處理大型文件和包含巨大數量文件的大型目錄,滿足二十一世紀快速增長的磁盤需求。xfs有能力動態地為文件分配索引空間,使系統形成高效支持大數量文件的能力。在它的支持下,用戶可使用1exabyte (1g×1gb) 大的文件,遠遠大於現在最大的文件系統。優秀的i/o 性能:典型的現代服務器使用大型的條帶式磁盤陣列,以提供達數gb/秒的總帶寬。xfs可以很好地滿足I/O請求的大小和並發I/O請求的數量。 xfs可作為root文件系統,並被lilo支持.在NFS服務器上使用也沒問題.支持軟件磁盤陣列(RAID)和虛擬集群(LVM)。SGI最新發佈xfs為 1.0.1版.(在:http://http://oss.sgi.com/projects/xfs/ 可以下載它)。
xfs的缺點:由於xfs比較複雜,實施起來有一些難度,所以目前xfs主要應用於Linux企業應用的高端。
其他文件系統簡介:
Minix:Llnux支持的第一個文件系統,對用戶有很多限制而且性能低下。有些沒有時間標記,其文件名最長l 4個字符。minix 文件系統最大的缺點是最大只能使用64M 的硬盤分區,所以在目前已經沒有人使用它了。
Xia:Minix文件系統修正後的版本。在一定程度上解決了文件名和文件系統大小的局限。但沒有新的特色,目前很少有人使用。
Msdos:msdos 是在Dos、Windows和某些OS/2 操作系統上使用的一種文件系統,其名稱採用「8+3」的形式,即8個字符的文件名加上3個字符的擴展名。
umsdos: Linux下的擴展msdos文件系統驅動,支持長文件名、所有者、允許權限、連接和設備文件。允許一個普通的msdo s文件系統用於Linux,而且無須為它建立單獨的分區。
iso9660: 標準CDROM文件系統,通用的Rock Ridge增強系統,允許長文件名。
Vfat:vfat是Windows9x 和 Windows NT/2000下使用的一種Dos文件系統,其在 Dos 文件系統的基礎上增加了對長文件名的支持。
Nfs: Sun公司推出的網絡文件系統,允許多台計算機之間共享同一文件系統,易於從所有這些計算機上存取文件。
Hpfs: High Performance File System(HPFS) 高性能文件系統(HPFS) HPFS是Microsoft的LAN Manager中的文件系統,同時也是IBM的LAN Server和OS/2的文件系統。HPFS能訪問較大的硬盤驅動器,提供更多的組織特性並改善了文件系統的安全特性。
Smb:smb是一種支持 Windows for workgroups、Windows NT 和Lan Manager的基於SMB協議的網絡操作系統。
Sysv: sysv文件系統實際上是System V/Coherent 在Linux平台上的文件系統。
Ncpfs:ncpfs是一種Novell NetWare 使用的NCP協議的網絡操作系統。
Proc:proc是Linux 系統中作為一種偽文件系統出現的,它用來作為連接內核數據結構的界面。
NTFS:微軟Windows NT內核的系列操作系統支持的、一個特別為網絡和磁盤配額、文件加密等管理安全特性設計的磁盤格式。 |
| |