日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux 文件系统及 ext2 文件系统

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 信息:
  1. # cat /proc/cpuinfo

    ?

也可以打開或者關閉 IP 數據包的路由與轉發( routing/forwarding ):
  1. # cat /proc/sys/net/ipv4/ip_forward
    # echo "1" > /proc/sys/net/ipv4/ip_forward
    # echo "0" > /proc/sys/net/ipv4/ip_forward

    ?

NFS:? ?? 網絡文件操作系統(network file system),允許不同的用戶和系統使用 C/S 的方式來共享同一個文件。NFS 允許共享以上的所有文件系統。 ? Linux 還支持 Microsoft NTFS,vfat 等其它文件系統。在 Linux 內核源碼樹中,Documentation/filesystem 目錄下列有所有支持的文件系統。 ?
使用 mount 命令可以查看當前掛載的文件系統:
  1. $ mount

    ?

文件系統的幾個基本概念

Inodes

每個文件都被 inode 數據結構所表示(以前也被寫作i-node)。每個 inode 包含系統中一個物理文件的信息。這個文件可以是目錄,socket,buffer,字符或者字塊設備,符號鏈接或者常規文件。所以一個 inode 可以視為一個實體的信息塊,描述它在磁盤中的位置,大小,時間戳,文件類型,訪問權限和所有者。

Directories

目錄是樹狀的結構。每個目錄可以同時包含文件和子目錄。 目錄被當作特殊的文件來實現。實際上,一個目錄就是一個包含了目錄項(directory entry)的文件。每個目錄項包含一個 inode 號以及一個文件的名字。當一個進程查找一個文件,內核代碼通過路徑在目錄中查找相應的 inode 號。找到 inode 號后,相應的 inode 被加載進內存以作后續使用。

Links

Unix 文件系統實現了鏈接的概念。 inode 一般關聯一個目錄項。但是,使用硬鏈接(hard link)可以讓一個 inode 關聯多個目錄項。其 inode 中有一個域包含著文件關聯的數量。 創建一個硬鏈接:
  1. # ln /root/file1 /root/file2

    ?

創建一個軟鏈接(symbolic link or soft link):
  1. ln -s /path/to/file1.txt /path/to/file2.txt

    ?

原理: 從圖中可以看到,硬鏈接與原始文件共用一個 inode - 345666,345666 號 inode 現在關聯兩個文件。如果創建的是軟鏈接,它本身會再新建一個 inode - 966600,這個 96660 號 inode 數據塊地址指向 966699 號 inode。軟鏈接有點像 windows 的快捷方式??旖莘绞奖旧硎莻€文件,但卻指向另外一個地址。而硬鏈接更像是具有計數功能的別名。 理解了這一張圖就不難理解:
  1. $ 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#提示不存在該文件,皮之不存毛將焉附?

    ?

硬鏈接 VS 軟鏈接
硬鏈接軟鏈接
硬鏈接不能在目錄間創建可以在不同目錄間創建
不能跨越文件系統邊界可以跨文件系統邊界
指向源頭,即使源頭被移動或者移除不會更新
? ?

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 OffsetLengthDescription
byte 0512 bytesboot record (if present)
byte 512512 bytesadditional boot record data (if present)
-- block group 0, blocks 1 to 1439 --
byte 10241024 bytessuperblock
block 21 blockblock group descriptor table
block 31 blockblock bitmap
block 41 blockinode bitmap
block 523 blocksinode table
block 281412 blocksdata blocks
表-20M 的 ext2 文件系統,使用 1KB 的塊
Block OffsetLengthDescription
byte 0512 bytesboot record (if present)
byte 512512 bytesadditional boot record data (if present)
-- block group 0, blocks 1 to 8192 --
byte 10241024 bytessuperblock
block 21 blockblock group descriptor table
block 31 blockblock bitmap
block 41 blockinode bitmap
block 5214 blocksinode table
block 2197974 blocksdata blocks
-- block group 1, blocks 8193 to 16384 --
block 81931 blocksuperblock?backup
block 81941 blockblock group descriptor table?backup
block 81951 blockblock bitmap
block 81961 blockinode bitmap
block 8197214 blocksinode table
block 84087974 blocksdata blocks
-- block group 2, blocks 16385 to 24576 --
block 163851 blockblock bitmap
block 163861 blockinode bitmap
block 16387214 blocksinode table
block 166013879 blocksdata blocks

ext2—Inode

表—Inode 數據結構
Offset (bytes)Size (bytes)Description
02i_mode
22i_uid
44i_size
84i_atime
124i_ctime
164i_mtime
204i_dtime
242i_gid
262i_links_count
284i_blocks
324i_flags
364i_osd1
4015 x 4i_block
1004i_generation
1044i_file_acl
1084i_dir_acl
1124i_faddr
11612 i_osd2
i_mode: ? ? 16 bit,用來表明所描述文件的類型以及訪問權限,可能的值有:
ConstantValueDescription
-- file format --
EXT2_S_IFSOCK0xC000socket
EXT2_S_IFLNK0xA000symbolic link
EXT2_S_IFREG0x8000regular file
EXT2_S_IFBLK0x6000block device
EXT2_S_IFDIR0x4000directory
EXT2_S_IFCHR0x2000character device
EXT2_S_IFIFO0x1000fifo
-- process execution user/group override --
EXT2_S_ISUID0x0800Set process User ID
EXT2_S_ISGID0x0400Set process Group ID
EXT2_S_ISVTX0x0200sticky bit
-- access rights --
EXT2_S_IRUSR0x0100user read
EXT2_S_IWUSR0x0080user write
EXT2_S_IXUSR0x0040user execute
EXT2_S_IRGRP0x0020group read
EXT2_S_IWGRP0x0010group write
EXT2_S_IXGRP0x0008group execute
EXT2_S_IROTH0x0004others read
EXT2_S_IWOTH0x0002others write
EXT2_S_IXOTH0x0001others execute?
? i_uid: ? ? 16 bit,文件所屬用戶的用戶 id ? ??

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
04bg_block_bitmap
44bg_inode_bitmap
84bg_inode_table
122bg_free_blocks_count
142bg_free_inodes_count
162bg_used_dirs_count
182bg_pad
2012bg_reserved
bg_block_bitmap: ? ? 所表示的塊組中 block bitmap 的塊號(block id),32 bit bg_inode_bitmap: ? ? 所表示的塊組中 inode bitmap 的塊號,32 bit bg_inode_table: 所表示的塊組中 inode table 的塊號,32 bit bg_free_blocks_count: ? ? 所表示的塊組中空閑的塊數,16 bit bg_free_inodes_count: ? ? 所表示的塊組中空閑的 inodes 數量,16 bit bg_used_dirs_count: ? ? 所表示的塊組中 inodes 給目錄用的數量,16 bit bg_pad: ? ? 16 bit,用來使得整個數據結構對齊 32 bit 的邊界 bg_reserved: ? ? 12 個保留字節,為以后的版本留出的空間

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 NameValueDescription
EXT2_BAD_INO1bad blocks inode
EXT2_ROOT_INO2root directory inode
EXT2_ACL_IDX_INO3ACL index inode (deprecated?)
EXT2_ACL_DATA_INO4ACL data inode (deprecated?)
EXT2_BOOT_LOADER_INO5boot loader inode
EXT2_UNDEL_DIR_INO6undelete 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
04inode
42rec_len
61name_len[a]
71file_type[b]
80-255name
舉個栗子: inode: ? ??目錄項的 inode。 record length: ? ??目錄項的長度(以字節為單位)。 name length: ? ??目錄項名字的長度(以字節為單位)。 file type: ? ??文件類型 典型的文件類型及取值:
Constant NameValueDescription
EXT2_FT_UNKNOWN0Unknown File Type
EXT2_FT_REG_FILE1Regular File
EXT2_FT_DIR2Directory File
EXT2_FT_CHRDEV3Character Device
EXT2_FT_BLKDEV4Block Device
EXT2_FT_FIFO5Buffer File
EXT2_FT_SOCK6Socket File
EXT2_FT_SYMLINK7Symbolic Link
name:目錄項的名字。 注: 1)版本 0 的 Ext2 使用 2 個字節的 name_len。由于大部分的實現文件名嚴格限制最大為 255 個字符,所以這兩個字節被截斷,低字節部分還是用來存儲文件名,高字節用來存儲文件類型 file_type。這個時候可以不通過 inode 來查詢文件類型了。這個時候看起來會是這個樣子: 2)目錄項必須 4 字節對齊邊界(沒有任何目錄項會橫跨兩個數據塊)。如果一個目錄項不能塞進一個數據塊中,那么它就只能放到下一個數據塊中了。 舉個栗子:

Table . Sample Linked Directory Data Layout, 4KiB blocks

Offset (bytes)Size (bytes)Description
Directory Entry 0
04inode number: 783362
42record length: 12
61name length: 1
71file type:?EXT2_FT_DIR=2
81name: .
93padding
Directory Entry 1
124inode number: 1109761
162record length: 12
181name length: 2
191file type:?EXT2_FT_DIR=2
202name: ..
222padding
Directory Entry 2
244inode number: 783364
282record length: 24
301name length: 13
311file type:?EXT2_FT_REG_FILE
3213name: .bash_profile
453padding
Directory Entry 3
484inode number: 783363
522record length: 16
541name length: 7
551file type:?EXT2_FT_REG_FILE
567name: .bashrc
631padding
Directory Entry 4
644inode number: 783377
682record length: 12
701name length: 4
711file type:?EXT2_FT_REG_FILE
724name: mbox
Directory Entry 5
764inode number: 783545
802record length: 20
821name length: 11
831file type:?EXT2_FT_DIR=2
8411name: public_html
951padding
Directory Entry 6
964inode number: 669354
1002record length: 12
1021name length: 3
1031file type:?EXT2_FT_DIR=2
1043name: tmp
1071padding
Directory Entry 7
1084inode number: 0
1122record length: 3988
1141name length: 0
1151file type:?EXT2_FT_UNKNOWN
1160name:
1163980padding?
索引形式: 一旦文件數量開始增長,鏈接形式的目錄就會變得很慢。為了提高性能,基于 hash 的索引用來快速查找文件。 ? 索引目錄根(indexed directory root) 為了與鏈表形式的目錄兼容,在 block 0 的開始處放置了一些假的目錄項。 . 及 .. 文件夾目錄項就是這些的一部分。
Offset (bytes)Size (bytes)Description
-- Linked Directory Entry: . --
04inode: this directory
42rec_len: 12
61name_len: 1
71file_type:?EXT2_FT_DIR=2
81name: .
93padding
-- Linked Directory Entry: .. --
124inode: parent directory
162rec_len: (blocksize - this entry's length(12))
181name_len: 2
191file_type:?EXT2_FT_DIR=2
202name: ..
222padding
-- Indexed Directory Root Information Structure --
244reserved, zero
281hash_version
291info_length
301indirect_levels
311reserved - unused flags?
? hash_version: ? ??1 字節,表示 hash 的版本 info_length: ? ??1 字節,表示索引目錄信息結構體(dx_root)的大小,即是上表中的 Indexed Directory Root Information。 indirect_levels: ? ??1 字節,表示間接索引的層數。在 Linux 2.6.28 中這個值為 1。 ? 索引目錄項(index directory entry) 索引目錄項關聯一個文件名的哈希值,根據這個哈希值可以快速地查找到相應的 inode 節點。這些索引目錄項跟在上面說的索引目錄根后面。 ? 它長得像這樣:

Table 4-6. Indexed Directory Entry Structure (dx_entry)

Offset (bytes)Size (bytes)Description
04hash
44block
? hash: ? ? 4 字節,文件名的哈希值 block: 4 字節,包含相應文件名的目錄項的 inode 數據塊的索引

目錄的查找算法

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?



來自為知筆記(Wiz)



轉載于:https://www.cnblogs.com/codetravel/p/4779430.html

總結

以上是生活随笔為你收集整理的Linux 文件系统及 ext2 文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。