Linux 文件系统及 ext2 文件系统
生活随笔
收集整理的這篇文章主要介紹了
Linux 文件系统及 ext2 文件系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
linux 支持的文件系統類型
Ext2:? ?? 有點像 UNIX 文件系統。有 blocks,inodes,directories 的概念。 Ext3:? ?? Ext2 的加強版,添加了日志的功能。支持 POSIX ACL(Access control Lists,訪問控制列表) 。 Isofs(iso9660):? ?? CDROM 文件系統。 Sysfs: ?基于 ram 的文件系統,起始于 ramfs。用于導出終端用戶可以簡便使用的內核對象(kernel objects)。 Procfs:? ?? proc 文件系統作為一個內核內部數據結構的界面。可以用來獲取關于系統的信息,也可以用 sysctl 命令在系統運行時改變內核的參數。 比如,可以通過下面的命令來查看 cpu 信息:-
# cat /proc/cpuinfo?
-
# cat /proc/sys/net/ipv4/ip_forward # echo "1" > /proc/sys/net/ipv4/ip_forward # echo "0" > /proc/sys/net/ipv4/ip_forward
?
使用 mount 命令可以查看當前掛載的文件系統:
-
$ mount?
文件系統的幾個基本概念
Inodes
每個文件都被 inode 數據結構所表示(以前也被寫作i-node)。每個 inode 包含系統中一個物理文件的信息。這個文件可以是目錄,socket,buffer,字符或者字塊設備,符號鏈接或者常規文件。所以一個 inode 可以視為一個實體的信息塊,描述它在磁盤中的位置,大小,時間戳,文件類型,訪問權限和所有者。Directories
目錄是樹狀的結構。每個目錄可以同時包含文件和子目錄。 目錄被當作特殊的文件來實現。實際上,一個目錄就是一個包含了目錄項(directory entry)的文件。每個目錄項包含一個 inode 號以及一個文件的名字。當一個進程查找一個文件,內核代碼通過路徑在目錄中查找相應的 inode 號。找到 inode 號后,相應的 inode 被加載進內存以作后續使用。Links
Unix 文件系統實現了鏈接的概念。 inode 一般關聯一個目錄項。但是,使用硬鏈接(hard link)可以讓一個 inode 關聯多個目錄項。其 inode 中有一個域包含著文件關聯的數量。 創建一個硬鏈接:-
# ln /root/file1 /root/file2?
-
ln -s /path/to/file1.txt /path/to/file2.txt?
-
$ ln FileAFileB#創建一個硬鏈接 $ ls -il FileAFileB#具有相同的 inode 號 1482256-rw-r--r-- 2 bruno bruno 21May515:55FileA 1482256-rw-r--r-- 2 bruno bruno 21May515:55FileB $ rm FileA $ cat FileB#將看到FileA的內容 $ ln -s FileBFileC#創建軟鏈接 $ ls -il FileBFileC#FileC文件類型是l-鏈接文件,且與 FileB 具有不同的 inode 1482256-rw-r--r-- 1 bruno bruno 21May515:55FileB 1482226 lrwxrwxrwx 1 bruno bruno 5May516:22FileC->FileB $ rm FileB $ cat FileC#提示不存在該文件,皮之不存毛將焉附?
?
| 硬鏈接 | 軟鏈接 |
| 硬鏈接不能在目錄間創建 | 可以在不同目錄間創建 |
| 不能跨越文件系統邊界 | 可以跨文件系統邊界 |
| 指向源頭,即使源頭被移動或者移除 | 不會更新 |
Device files ??
類unix操作系統中,可以能過特別的文件來訪問設備。這些文件并不占用文件系統的空間,只是一個設備驅動的訪問點。The Second Extended File system(EXT2)
ext2 是目前 Linux 社區中最成功的文件系統。 像很多其它文件系統,ext2 中的文件也保存在數據塊中。數據塊的大小是固定的,即使不同的 ext2 文件系統數據塊的大小可能是不同的,但一旦 ext2 被創建(mke2fs),這個文件系統中數據塊的大小就被固定了。 每個文件的大小都被向上取整成整數個塊。如果塊的大小為 1024B,一個文件的大小為 1025B,那這個文件需要兩個塊來存儲。 物理布局: 其中,block 0 總是指向磁盤或者分區的第一個扇區,如果啟動記錄(boot record)存在,那么一定在 block 0 中。 超級塊(super block)總是位于磁盤或者分區開始的第 1024 字節處。如果一個塊大小為 1 KB,那么超級塊位于 block 1。如果一個塊的大小大于 1024B,那么超級塊位于 block 0。 兩個例子: 表-Floppy Disk 布局,塊大小為 1KB| Block Offset | Length | Description |
|---|---|---|
| byte 0 | 512 bytes | boot record (if present) |
| byte 512 | 512 bytes | additional boot record data (if present) |
| -- block group 0, blocks 1 to 1439 -- | ||
| byte 1024 | 1024 bytes | superblock |
| block 2 | 1 block | block group descriptor table |
| block 3 | 1 block | block bitmap |
| block 4 | 1 block | inode bitmap |
| block 5 | 23 blocks | inode table |
| block 28 | 1412 blocks | data blocks |
| Block Offset | Length | Description |
|---|---|---|
| byte 0 | 512 bytes | boot record (if present) |
| byte 512 | 512 bytes | additional boot record data (if present) |
| -- block group 0, blocks 1 to 8192 -- | ||
| byte 1024 | 1024 bytes | superblock |
| block 2 | 1 block | block group descriptor table |
| block 3 | 1 block | block bitmap |
| block 4 | 1 block | inode bitmap |
| block 5 | 214 blocks | inode table |
| block 219 | 7974 blocks | data blocks |
| -- block group 1, blocks 8193 to 16384 -- | ||
| block 8193 | 1 block | superblock?backup |
| block 8194 | 1 block | block group descriptor table?backup |
| block 8195 | 1 block | block bitmap |
| block 8196 | 1 block | inode bitmap |
| block 8197 | 214 blocks | inode table |
| block 8408 | 7974 blocks | data blocks |
| -- block group 2, blocks 16385 to 24576 -- | ||
| block 16385 | 1 block | block bitmap |
| block 16386 | 1 block | inode bitmap |
| block 16387 | 214 blocks | inode table |
| block 16601 | 3879 blocks | data blocks |
ext2—Inode
表—Inode 數據結構| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| 0 | 2 | i_mode |
| 2 | 2 | i_uid |
| 4 | 4 | i_size |
| 8 | 4 | i_atime |
| 12 | 4 | i_ctime |
| 16 | 4 | i_mtime |
| 20 | 4 | i_dtime |
| 24 | 2 | i_gid |
| 26 | 2 | i_links_count |
| 28 | 4 | i_blocks |
| 32 | 4 | i_flags |
| 36 | 4 | i_osd1 |
| 40 | 15 x 4 | i_block |
| 100 | 4 | i_generation |
| 104 | 4 | i_file_acl |
| 108 | 4 | i_dir_acl |
| 112 | 4 | i_faddr |
| 116 | 12 | i_osd2 |
| Constant | Value | Description |
|---|---|---|
| -- file format -- | ||
| EXT2_S_IFSOCK | 0xC000 | socket |
| EXT2_S_IFLNK | 0xA000 | symbolic link |
| EXT2_S_IFREG | 0x8000 | regular file |
| EXT2_S_IFBLK | 0x6000 | block device |
| EXT2_S_IFDIR | 0x4000 | directory |
| EXT2_S_IFCHR | 0x2000 | character device |
| EXT2_S_IFIFO | 0x1000 | fifo |
| -- process execution user/group override -- | ||
| EXT2_S_ISUID | 0x0800 | Set process User ID |
| EXT2_S_ISGID | 0x0400 | Set process Group ID |
| EXT2_S_ISVTX | 0x0200 | sticky bit |
| -- access rights -- | ||
| EXT2_S_IRUSR | 0x0100 | user read |
| EXT2_S_IWUSR | 0x0080 | user write |
| EXT2_S_IXUSR | 0x0040 | user execute |
| EXT2_S_IRGRP | 0x0020 | group read |
| EXT2_S_IWGRP | 0x0010 | group write |
| EXT2_S_IXGRP | 0x0008 | group execute |
| EXT2_S_IROTH | 0x0004 | others read |
| EXT2_S_IWOTH | 0x0002 | others write |
| EXT2_S_IXOTH | 0x0001 | others execute? |
ext2—Block Groups,塊組
多個塊組成一個塊組(Block Group),這樣可以減少碎片化,并且在讀取大量連續的數據時可以減少尋道時間(head seeking)。ext2—Superblock,超級塊
超級塊包含文件系統的所有配置信息,包括文件系統中有多少 inodes 和 blocks,以及它們中有多少是空閑的,在每個塊組(block group)中有多少 inodes 和 blocks。 超級塊的主拷貝被存儲在磁盤開始 1024 字節處。由于它對于文件系統的掛載至關重要,整個文件系統的塊組(block group)將會保存它的備份拷貝。 ext2 的第一個版本(修訂號為 0)在每個塊組的開始處都保存一份超級塊副本。對于大型文件系統來說,這種方法會消耗大量的空間,所有在接下的版本中(修訂號為 1),可以將副本保存在指定的塊組中。塊組號可以選擇 0 ,1 以及以 3,5,7 為底的冪。 ? 在超級塊中的所有域都以小端模式存儲在磁盤中(其它的 ext2 數據結構也是這樣),這樣 ext2 文件系統在機器間就很方便移植,因為不需要知道文件系統是哪類機器創建的。 超級塊持有的信息有: 魔數(magic number): ? ??標志 ext2 文件系統的超級塊,掛載軟件(mounting?software)以此來確認這是 ext2 文件系統的超級塊。比如 0xEF53。 修訂級別(revision level): ? ??通過主要和次要的修訂級別,可以知道當前文件系統是否支持只有在一些特殊修訂版的文件系統中才有的功能特性,以及哪些新的功能特性能安全地應用在當前的文件系統中。 掛載次數及最大掛載次數: ? ??兩個數合起來決定文件系統是否需要全面檢查。每當文件系統被掛載,掛載的次數自增,當它等于最大的掛載次數時,將顯示“達到最大掛載次數,推薦運行 e2fsck” 塊組號: ? ??當前超級塊副本所在的塊組號 塊大小: ? ??文件系統中塊的大小,以字節(byte)為單位。 每組的塊數: ? ??在一個組內塊的數目。跟塊大小一樣,當文件系統被創建時,這個數量就被固定了。 空閑的塊: ? ??文件系統中空閑的塊。 空間的 inodes: ? ??文件系統中空閑的 inode。 第一個 inode: ? ??ext2 根文件系統中的第一個 inode 是根目錄 ‘/’。ext2—Block Group Descriptor,組描述符
為文件系統中的每個塊組創建一個組描述符。每個組描述符都代表文件系統中的一個塊組,組描述符中所有信息都只是所描述的塊組的信息。 每個組描述符(group descriptor)包含以下信息:| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| 0 | 4 | bg_block_bitmap |
| 4 | 4 | bg_inode_bitmap |
| 8 | 4 | bg_inode_table |
| 12 | 2 | bg_free_blocks_count |
| 14 | 2 | bg_free_inodes_count |
| 16 | 2 | bg_used_dirs_count |
| 18 | 2 | bg_pad |
| 20 | 12 | bg_reserved |
ext2—Block Group Descriptor Table,組描述符表
組描述符表(block group descriptor table)是一個組描述符的數組,用來定義所有塊組的參數。包含 inode bitmap,inode table,block bitmap 的位置,以及空閑塊、空閑 inodes 的數量,以及其它有用的信息。它包含所有塊組的信息。 組描述符表跟在超級塊后面。如果塊大小為 1KB,那么它將在第三個塊,或者如果塊大小為 2KB 它將在第二個塊。如果有超級塊的拷貝副本,那么在超級塊的拷貝副本后面同樣有組描述符表的拷貝副本。 如果塊組有很多,組描述表可以申請多個塊來存儲相應的組描述符信息。ext2—Block Bitmap
在小一點的文件系統中,Block Bitmap 位于組塊的第一個塊中(因為小,為了節省空間所以不放超級塊或者組塊描述符表的備份)。通常它的位置可以通過讀取塊組相關聯的組描述符中的 bg_block_bitmap 來獲得。 每個位表示塊組中塊的當前狀態,1 表示“已使用”,0 表示 “空閑/可用”。塊組中第一個塊使用第 0 個字節的第 0 個 bit 來表示,相應地,第二個塊用使用第 0 個字節的第 1 個 bit,第八個塊使用第 0 個字節的第 7 個 bit 表示,第 9 個塊使用第 1 個字節的第 0 個 bit 來表示。ext2—Inode Bitmap
跟 Block Bitmap 類似,不同的是,每個位表示的是 Inode Table 中的 inode 而不是一個塊。 每個塊組都有一個 inode bitmap,并且位置同樣由塊組對應的組描述符中的 bg_inode_bitmap 決定。ext2—Inode Table
Inode table 被用來保持追蹤每個目錄,常規文件,符號鏈接,或者特殊文件;它們的位置,大小,類型及訪問權限都被保存在 inodes 中。文件名及 inode 是分開的,inode 并不保存文件名,文件名被保存在目錄文件中。 每個塊組都有一份 inode table,它的位置由組塊對應描述符中的 bg_inode_table 決定。 inode table 中的前幾項會被保留。在版本 0 中有 11 項為保留項,版本 1 或者后面幾個版本被保留的 inode 項由超級塊結構中的 s_first_ino 指定。 表—已知被保留的 inode 項:| Constant Name | Value | Description |
|---|---|---|
| EXT2_BAD_INO | 1 | bad blocks inode |
| EXT2_ROOT_INO | 2 | root directory inode |
| EXT2_ACL_IDX_INO | 3 | ACL index inode (deprecated?) |
| EXT2_ACL_DATA_INO | 4 | ACL data inode (deprecated?) |
| EXT2_BOOT_LOADER_INO | 5 | boot loader inode |
| EXT2_UNDEL_DIR_INO | 6 | undelete directory inode |
ext2—Directories,目錄
目錄用來有層次地組織文件。每個目錄都能包含其它目錄,常規文件及特殊文件。 目錄被當作數據塊來保存,并用一個 inode 指向它。指向目錄的 inode 中 i_mode 字段被設定為 EXT2_S_IFDIR,由此來表明文件類型為目錄。 在 inode table 中每二個表項的 inode 指向根目錄(root directory)的數據。它是 inode table 的保留項,被指定為 EXT2_ROOT_INO。 在版本 0 中目錄以鏈表的形式存儲。版本 1 及后面的版本引進索引目錄(indexed directories)。 鏈表形式:鏈表形式目錄項結構:
| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| 0 | 4 | inode |
| 4 | 2 | rec_len |
| 6 | 1 | name_len[a] |
| 7 | 1 | file_type[b] |
| 8 | 0-255 | name |
| Constant Name | Value | Description |
|---|---|---|
| EXT2_FT_UNKNOWN | 0 | Unknown File Type |
| EXT2_FT_REG_FILE | 1 | Regular File |
| EXT2_FT_DIR | 2 | Directory File |
| EXT2_FT_CHRDEV | 3 | Character Device |
| EXT2_FT_BLKDEV | 4 | Block Device |
| EXT2_FT_FIFO | 5 | Buffer File |
| EXT2_FT_SOCK | 6 | Socket File |
| EXT2_FT_SYMLINK | 7 | Symbolic Link |
Table . Sample Linked Directory Data Layout, 4KiB blocks
| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| Directory Entry 0 | ||
| 0 | 4 | inode number: 783362 |
| 4 | 2 | record length: 12 |
| 6 | 1 | name length: 1 |
| 7 | 1 | file type:?EXT2_FT_DIR=2 |
| 8 | 1 | name: . |
| 9 | 3 | padding |
| Directory Entry 1 | ||
| 12 | 4 | inode number: 1109761 |
| 16 | 2 | record length: 12 |
| 18 | 1 | name length: 2 |
| 19 | 1 | file type:?EXT2_FT_DIR=2 |
| 20 | 2 | name: .. |
| 22 | 2 | padding |
| Directory Entry 2 | ||
| 24 | 4 | inode number: 783364 |
| 28 | 2 | record length: 24 |
| 30 | 1 | name length: 13 |
| 31 | 1 | file type:?EXT2_FT_REG_FILE |
| 32 | 13 | name: .bash_profile |
| 45 | 3 | padding |
| Directory Entry 3 | ||
| 48 | 4 | inode number: 783363 |
| 52 | 2 | record length: 16 |
| 54 | 1 | name length: 7 |
| 55 | 1 | file type:?EXT2_FT_REG_FILE |
| 56 | 7 | name: .bashrc |
| 63 | 1 | padding |
| Directory Entry 4 | ||
| 64 | 4 | inode number: 783377 |
| 68 | 2 | record length: 12 |
| 70 | 1 | name length: 4 |
| 71 | 1 | file type:?EXT2_FT_REG_FILE |
| 72 | 4 | name: mbox |
| Directory Entry 5 | ||
| 76 | 4 | inode number: 783545 |
| 80 | 2 | record length: 20 |
| 82 | 1 | name length: 11 |
| 83 | 1 | file type:?EXT2_FT_DIR=2 |
| 84 | 11 | name: public_html |
| 95 | 1 | padding |
| Directory Entry 6 | ||
| 96 | 4 | inode number: 669354 |
| 100 | 2 | record length: 12 |
| 102 | 1 | name length: 3 |
| 103 | 1 | file type:?EXT2_FT_DIR=2 |
| 104 | 3 | name: tmp |
| 107 | 1 | padding |
| Directory Entry 7 | ||
| 108 | 4 | inode number: 0 |
| 112 | 2 | record length: 3988 |
| 114 | 1 | name length: 0 |
| 115 | 1 | file type:?EXT2_FT_UNKNOWN |
| 116 | 0 | name: |
| 116 | 3980 | padding? |
| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| -- Linked Directory Entry: . -- | ||
| 0 | 4 | inode: this directory |
| 4 | 2 | rec_len: 12 |
| 6 | 1 | name_len: 1 |
| 7 | 1 | file_type:?EXT2_FT_DIR=2 |
| 8 | 1 | name: . |
| 9 | 3 | padding |
| -- Linked Directory Entry: .. -- | ||
| 12 | 4 | inode: parent directory |
| 16 | 2 | rec_len: (blocksize - this entry's length(12)) |
| 18 | 1 | name_len: 2 |
| 19 | 1 | file_type:?EXT2_FT_DIR=2 |
| 20 | 2 | name: .. |
| 22 | 2 | padding |
| -- Indexed Directory Root Information Structure -- | ||
| 24 | 4 | reserved, zero |
| 28 | 1 | hash_version |
| 29 | 1 | info_length |
| 30 | 1 | indirect_levels |
| 31 | 1 | reserved - unused flags? |
Table 4-6. Indexed Directory Entry Structure (dx_entry)
| Offset (bytes) | Size (bytes) | Description |
|---|---|---|
| 0 | 4 | hash |
| 4 | 4 | block |
目錄的查找算法
1)計算文件名的哈希值 2)讀取 index root 3)使用二分查找查找第一個包含該哈希的子目錄 4)重復第 3 步直到到達樹的最低一層 5)讀取葉子目錄項數據塊,使用常規的查找 6)如果找到了這個文件名,返回該目錄項及 buffer 7)否則,如果下個目錄項的沖突位被設置了,那么在下一塊數據塊中繼續查找目錄的插入算法
插入一個新的目錄項到目錄中比之目錄查找要復雜得多。 1)探測要插入的目錄項的索引,過程跟查找一樣 2)如果目標葉子數據塊已經滿了,把它分成兩份并標記這個數據塊將被插入新的目錄項 3)跟往常一樣插入這個新的目錄項到葉子數據塊參考資料:
http://www.cyberciti.biz/tips/understanding-unixlinux-file-system-part-i.html http://www.cyberciti.biz/tips/understanding-unixlinux-symbolic-soft-and-hard-links.html http://www.bestweb.tips/linux-file-attributes/ http://www.linuxclues.com/articles/17.htm? https://en.wikipedia.org/wiki/Ext2 http://www.tldp.org/HOWTO/Filesystems-HOWTO-6.html http://e2fsprogs.sourceforge.net/ext2intro.html http://www.tldp.org/LDP/tlk/fs/filesystem.html http://www.nongnu.org/ext2-doc/ext2.html?轉載于:https://www.cnblogs.com/codetravel/p/4779430.html
總結
以上是生活随笔為你收集整理的Linux 文件系统及 ext2 文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是常函数?
- 下一篇: UIWebView和UIActivity