大三復(fù)習(xí)大三中print ext2文件系統(tǒng)_第1頁
大三復(fù)習(xí)大三中print ext2文件系統(tǒng)_第2頁
大三復(fù)習(xí)大三中print ext2文件系統(tǒng)_第3頁
大三復(fù)習(xí)大三中print ext2文件系統(tǒng)_第4頁
大三復(fù)習(xí)大三中print ext2文件系統(tǒng)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、ext2 文件系統(tǒng) 請點(diǎn)評2.1. 總體布局 請點(diǎn)評知道,一個磁盤可以劃分成多個分區(qū),每個分區(qū)必須先用格式化工具(例如某種 mkfs 命令)格式化成某種格式的文件系統(tǒng),然后才能文件,格式化的過程會在磁盤上寫一些管理布局的信息。下圖是一個磁盤分區(qū)格式化成 ext2 文件系統(tǒng)后的布局。圖 29.2. ext2 文件系統(tǒng)的總體布局文件系統(tǒng)中的最小是塊(Block),一個塊究竟多大是在格式化時確定的,例如 mke2fs 的-b 選項可以設(shè)定塊大小為 1024、2048 或4096 字節(jié)。而上圖中啟動塊(Boot Block)的大小是確定的,就是 1KB,啟動塊是由 PC 標(biāo)準(zhǔn)規(guī)定的,用來磁盤分區(qū)信息和

2、啟動信息,任何文件系統(tǒng)都不能使用啟動塊。啟動塊之后才是 ext2 文件系統(tǒng)的開始,ext2 文件系統(tǒng)將整個分區(qū)劃成若干個同樣大小的塊組(Block Group),每個塊組都由以下部分組成。超級塊(Super Block)表這幾部分該塊組的描述信息。那么如何知道哪些塊已經(jīng)用用一個整塊;超級塊、塊組描述符表、塊位圖、inode 位圖、inode就需要三個數(shù)據(jù)塊來存,即使第三個塊只存了一個字節(jié)也需要占如某個分區(qū)的塊大小是 1024 字節(jié),某個文件是 2049 字節(jié),那么一個塊組中的塊是這樣利用的:數(shù)據(jù)塊所有文件的數(shù)據(jù),比塊位圖(Block Bitmap)損壞時就可以用其它拷貝來恢復(fù),從而減少損失。組

3、描述符表就會拷貝到其它塊組,這樣當(dāng)?shù)?0 個塊組的開頭意外執(zhí)行 e2fsck 檢查文件系致性時,第 0 個塊組中的超級塊和塊此它們都有多份拷貝。通常內(nèi)核只用到第 0 個塊組中的拷貝,當(dāng)?shù)臄?shù)據(jù),一旦塊組描述符意外損壞就會丟失整個塊組的數(shù)據(jù),因這些信息是非常重要的,一旦超級塊意外損壞就會丟失整個分區(qū)超級塊類似,塊組描述符表在每個塊組的開頭也都有一份拷貝,哪里開始是數(shù)據(jù)塊,空閑的 inode 和數(shù)據(jù)塊還有多少個等等。和塊組的描述信息,例如在這個塊組中從哪里開始是 inode 表,從個塊組描述符。每個塊組描述符(Group Descriptor)一個由很多塊組描述符組成,整個分區(qū)分成多少個塊組就對應(yīng)有

4、多少塊組描述符表(GDT,Group Descriptor Table)上次 mount 的時間等等。超級塊在每個塊組的開頭都有一份拷貝。描述整個分區(qū)的文件系統(tǒng)信息,例如塊大小、文件系統(tǒng)版本號、圖就是整個塊組中哪些塊已用哪些塊空閑的,它本身占空閑可用。和塊位圖類似,本身占一個塊,其中每個 bit 表示一個 inode 是否inode 位圖(inode Bitmap)示該塊已用,這個bit 為 0 表示該塊空閑可用。為什么用 df 命令統(tǒng)計整個磁盤的已用空間非??炷??因為只需要查看每個塊組的塊位圖即可,而不需要搜遍整個分區(qū)。相反,用 du 命令查看一個較大目錄的已用空間就非常慢,因為不可避免地要

5、搜遍整個目錄的所有文件。與此相聯(lián)系的另一個問題是:在格式化一個分區(qū)時究竟會劃出多少個塊組呢?主要的限制在于塊位圖本身必須只占一個塊。用 mke2fs 格式化時默認(rèn)塊大小是 1024 字節(jié),可以用-b 參數(shù)指定塊大小,現(xiàn)在設(shè)塊大小指定為 b 字節(jié),那么一個塊可以有 8b 個bit,這樣大小的一個塊位圖就可以表示 8b 個塊的占用情況,因此一個塊組最多可以有 8b 個塊,如果整個分區(qū)有s 個塊,那么就可以有s/(8b)個塊組。格式化時可以用-g 參數(shù)指定一個塊組有多少個塊,但是通常不需要手動指定,mke2fs 工具會計算出最優(yōu)的數(shù)值。一個塊,其中的每個 bit 代表本塊組中的一個塊,這個 bit

6、為 1 表來文件數(shù)據(jù)或其它描述信息,哪些塊仍然空閑可用呢?塊位知道,一個文件除了數(shù)據(jù)需要之外,一些描述信息也需要,例如文件類型(常規(guī)、目錄、符號等),權(quán)限,文根據(jù)不同的文件類型有以下幾種情況數(shù)據(jù)塊(Data Block)inode,一個塊組中的所有 inode 組成了 inode 表。inode 表占多少個塊在格式化時就要決定并寫入塊組描述符中, mke2fs 格式化工具的默認(rèn)策略是一個塊組有多少個 8KB 就分配多少個 inode。由于數(shù)據(jù)塊占了整個塊組的絕大部分,也可以近似認(rèn)為數(shù)據(jù)塊有多少個 8KB 就分配多少個 inode,換句話說,如果平均每個文件的大小是 8KB,當(dāng)分區(qū)存滿的時候 i

7、node 表會得到比較充分的利用,數(shù)據(jù)塊也不浪費(fèi)。如果這個分區(qū)存的都是很大的文件(比如),則數(shù)據(jù)塊用完的時候 inode 會有一些浪費(fèi),如果這個分區(qū)存的都是很小的文件(比如源代碼),則有可能數(shù)據(jù)塊還沒用完 inode 就已經(jīng)用完了,數(shù)據(jù)塊可能有很大的浪費(fèi)。如果用戶在格式化時能夠?qū)@個分區(qū)以后要的文件大小做一個,也可以用 mke2fs 的-i 參數(shù)手動指定每多少個字節(jié)分配一個 inode。息,這些信息存在 inode 中而不是數(shù)據(jù)塊中。每個文件都有一個件大小,創(chuàng)建/修改/時間等,也就是 ls -l 命令看到的那些信inode 表(inode Table)因為目錄的數(shù)據(jù)塊保存著它下邊所有文件和目錄

8、的名字,如果一個目錄4096,目錄的大小總是數(shù)據(jù)塊的整數(shù)倍。為什么有的目錄大有的目錄小?為什么各目錄的大小都是 4096 的整數(shù)倍?因為這個分區(qū)的塊大小是$ ls -l total 32drwxr-xr-x 114 akaedu akaedu 12288 2008-10-25 11:33 akaedudrwxr-xr-x 114 ftpftp4096 2008-10-25 10:30 ftpdrwx 2 rootroot16384 2008-07-04 05:58 lost+found現(xiàn)在做幾個小實驗來理解這些概念。例如在 home 目錄下 ls -l:對于常規(guī)文件,文件的數(shù)據(jù) 在數(shù)據(jù)塊中。對

9、于目錄,該目錄下的所有文件名和目錄名 在數(shù)據(jù)塊中,注意文件名保存在它所在目錄的數(shù)據(jù)塊中,除文件名之外,ls -l 命令看到的其它信息都保存在該文件的 inode中。注意這個概念:目錄也是一種文件,是一種特殊類型的文件。對于符號 ,如果目標(biāo)路徑名較短則直接保存在 inode中以便更快地查找,如果目標(biāo)路徑名較長則分配一個數(shù)據(jù)塊來保存。設(shè)備文件、FIFO 和 socket 等特殊文件沒有數(shù)據(jù)塊,設(shè)備文件的主設(shè)備號和次設(shè)備號保存在 inode 中。$ toucho$ ln -s ./o halo$ ls -l total 0lrwxrwxrwx 1 akaedu akaedu 7 2008-10-25

10、 15:04 halo- ./o-rw-r-r- 1 akaedu akaedu 0 2008-10-25 15:04o內(nèi)核根據(jù)設(shè)備號找到相應(yīng)的驅(qū)動程序。再比如:地方寫了 1, 5 這兩個數(shù)字,表示主設(shè)備號和次設(shè)備號,該文件時,表內(nèi)核中的一個設(shè)備驅(qū)動程序,也沒有數(shù)據(jù)塊,原本應(yīng)該寫文件大小的據(jù)塊,文件大小是 0。zero 文件的類型是c,表示字符設(shè)備文件,它代到它其實是一塊內(nèi)核緩沖區(qū)的標(biāo)識,不在磁盤上保存數(shù)據(jù),因此沒有數(shù)xconsole 文件的類型是p(表示 pipe),是一個 FIFO 文件,后面會講$ ls -l /dev.prw-r 1 syslog adm0 2008-10-25 11:

11、39 xconsolecrw-rw-rw- 1 root root1,5 2008-10-24 16:44 zero給這個目錄。再比如:中的文件很多,一個塊裝不下這么多文件名,就可能分配的數(shù)據(jù)塊o 是剛創(chuàng)建的,字節(jié)數(shù)為 0,符號文件文件 halo 指向o,字節(jié)數(shù)卻是 7,為什么呢?其實 7 就是“./o”這 7 個字符,符號文件o2 和o 除了文件名不一樣之外,別的屬性都一模一樣,并且o說,o 和o2 是同一個文件在文件系統(tǒng)中的兩個名字,ls -l 第二$ mkdir a$ mkdir a/b$ ls -ld adrwxr-xr-x 3 akaedu akaedu 4096 2008-10-2

12、5 16:15 a出來的。再研究一下目錄的硬數(shù):所以用 ls -l 看它們的屬性是一模一樣的,因為都是從這個 inode 里讀硬數(shù)也保存在 inode 中。既然是同一個文件,inode 當(dāng)然只有一個,字可以保存在不同目錄的數(shù)據(jù)塊中,或者說可以位于不同的路徑下),欄的數(shù)字是硬數(shù),表示一個文件在文件系統(tǒng)中有幾個名字(這些名的屬性發(fā)生了變化,第二欄的數(shù)字原本是 1,現(xiàn)在變成 2 了。從根本上$ ln ./oo2$ ls -l total 0lrwxrwxrwx 1 akaedu akaedu 7 2008-10-25 15:04 halo- ./o-rw-r-r- 2 akaedu akaedu 0

13、 2008-10-25 15:04o-rw-r-r- 2 akaedu akaedu 0 2008-10-25 15:04o2就保存著這樣一個路徑名。再試試硬:$ dd if=/dev/zero of=fs count=256 bs=4K,但不能創(chuàng)建目錄的硬。2.2. 實例剖析 請點(diǎn)評如果要格式化一個分區(qū)來研究文件系統(tǒng)格式則必須有一個空閑的磁盤分區(qū),為了方便實驗,把一個文件當(dāng)作分區(qū)來格式化,然后分析這個文件中的數(shù)據(jù)來印證上面所講的要點(diǎn)。首先創(chuàng)建一個 1MB 的文件并清零:意,目錄的硬只能這種方式創(chuàng)建,用 ln 命令可以創(chuàng)建目錄的符號b 的硬數(shù)是 2,這兩個名字分別是 a 目錄下的b 和 b 目

14、錄下的.。注這 3 個名字分別是當(dāng)前目錄下的 a,a 目錄下的.和b 目錄下的.。目錄首先創(chuàng)建目錄a,然后在它下面創(chuàng)建子目錄 a/b。目錄 a 的硬數(shù)是 3,$ ls -la a total 20drwxr-xr-x 3 akaedu akaedu 4096 2008-10-25 16:15 .drwxr-xr-x 115 akaedu akaedu 12288 2008-10-25 16:14 .drwxr-xr-x 2 akaedu akaedu 4096 2008-10-25 16:15 b$ ls -la a/b total 8drwxr-xr-x 2 akaedu akaedu 40

15、96 2008-10-25 16:15 .drwxr-xr-x 3 akaedu akaedu 4096 2008-10-25 16:15 .$ mke2fs fsmke2fs 1.40.2 (12-Jul-2007)fs is not a block spel device. Proceed anyway? (y,n) (輸入 y 回車) Filesystem label=OS type: LinuxBlock size=1024 (log=0) Fragment size=1024 (log=0)128 inodes, 1024 blocks51 blocks (4.98%)for the

16、 super user data block=1um filesystem blocks=10485761 block groupcount 和 bs 參數(shù)表示拷貝多少次,每次拷多少字節(jié)。做好之后對文件 fs 進(jìn)行格式化,也就是把這個文件的數(shù)據(jù)塊合起來看成一個 1MB 的磁盤分區(qū),在這個分區(qū)上再劃分出塊組??截惲?1M 個 0 x00 到 fs 文件。if 和 of 參數(shù)表示輸入文件和輸出文件,窮大的,不管從哪里開始讀,讀出來的都是字節(jié) 0 x00。因此這個命令操作傳給設(shè)備號為 1, 5 的驅(qū)動程序。/dev/zero 這個文件可以看作是無看到/dev/zero 是一個特殊的設(shè)備文件,它沒有磁

17、盤數(shù)據(jù)塊,對它進(jìn)行讀文件開頭的 1M(2564K)字節(jié)拷貝成文件名為 fs 的文件。剛才一個文件的一部分拷貝成另一個文件。這個命令的作用是把/dev/zero知道 cp 命令可以把一個文件拷貝成另一個文件,而 dd 命令可以把$ dumpe2fs fsdumpe2fs 1.40.2 (12-Jul-2007) Filesystem volume name: Last mounted on:Filesystem UUID:8e1f3b7a-4d1f-41dc-8928-526e43b2fd74 Filesystemnumber: 0 xEF53Filesystem revi#:1 (dynami

18、c)所以給出提示,要求確認(rèn)是否真的要格式化,輸入 y 回車完成格式化?,F(xiàn)在 fs 的大小仍然是 1MB,但不再是全 0 了,其中已經(jīng)有了塊組和描述信息。用 dumpe2fs 工具可以查看這個分區(qū)的超級塊和塊組描述符表中的信息:fs 是常規(guī)文件而不是塊設(shè)備文件,mke2fs 認(rèn)為用戶有可能是誤操作了,格式化一個真正的分區(qū)應(yīng)該指定塊設(shè)備文件名,例如/dev/sda1,而這個8192 blocks per group, 8192 fragments per group128 inodes per groupWriting inode tables: doneWriting superblocks a

19、nd filesystem accounting information: doneThis filesystem will be automatically checked every 27 mounts or180 days, whichever comes. Use tune2fs -c or -i to override.Filesystem features:resize_inode dir_index filetype sparse_superFilesystem flags:signed directory hash Default mount options:(none)Fil

20、esystem se:cleanErrors behavior:Continue Filesystem OS type:Linux Inode count:128Block count:1024block count:51Free blocks:986Free inodes:117block:1Block size:1024Fragment size:1024GDT blocks:3Blocks per group:8192Fragments per group:8192Inodes per group:128Inode blocks per group: 16Filesystem creat

21、ed:Sun Dec 16 14:56:59 2007 Last mount time:n/aLast write time:Sun Dec 16 14:56:59 2007Mount count:0um mount count:30Last checked:Sun Dec 16 14:56:59 2007開始,因此Group 0 占據(jù)第 1 個到第 1023 個塊,共 1023 個塊。塊位共有 1024 個塊,第 0 個塊是啟動塊,啟動塊之后才算 ext2 文件系統(tǒng)的根據(jù)上面講過的知識簡單計算一下,塊大小是 1024 字節(jié),1MB 的分區(qū)Checkerval:15552000 (6 mont

22、hs)Next check after:Fri Jun 13 14:56:59 2008 blocks uid:0 (user root)blocks gid:0 (group root) inode:11Inode size:128Defauirectory hash: tea Directory Hash Seed:6d0e58bd-b9db-41ae-92b3-4563a02a5981Group 0: (Blocks 1-1023)Primary superblock at 1, Group descriptors at 2-2 GDT blocks at 3-5Block bitmap

23、 at 6 (+5), Inode bitmap at 7 (+6)Inode table at 8-23 (+7)986 free blocks, 117 free inodes, 2 directoriesFree blocks: 38-1023Free inodes: 12-128128 inodes per group, 8 inodes per block, so: 16 blocks for inode table放在這里“失物招領(lǐng)”了?,F(xiàn)在可以在/mnt 目錄下添加刪除文件,這些操作會自動保存到文件 fs中。然后把這個分區(qū) umount 下來,以確保所有的改動都保存到文件中了。有

24、錯誤的塊掛在這個目錄下,因為這些塊不知道是誰的,找不到主,就lost+found 目錄由 e2fsck 工具使用,如果在檢查磁盤時發(fā)現(xiàn)錯誤,就把表示當(dāng)前目錄,.表示上一級目錄,而根目錄的.和.都表示根目錄本身。根目錄下自動生成三個子目錄:.,.和 lost+found。其它子目錄下的.會把它的數(shù)據(jù)塊中的數(shù)據(jù)當(dāng)作分區(qū)格式來解釋。文件系統(tǒng)格式化之后在-o loop 選項告訴 mount 這是一個常規(guī)文件而不是一個塊設(shè)備文件。mount$ sudo mount -o loop fs /mnt$ cd /mnt/$ ls -la total 17drwxr-xr-x 3 akaedu akaedu 1

25、024 2008-10-25 12:20 .drwxr-xr-x 21 rootroot4096 2008-08-18 08:54 .drwx 2 rootroot12288 2008-10-25 12:20 lost+found分區(qū)對應(yīng) 128 個 inode,這些數(shù)據(jù)都和 dumpe2fs 的輸出吻合。用常規(guī)文件制作而成的文件系統(tǒng)也可以像磁盤分區(qū)一樣 mount 到某個目錄,例如:此只要一個塊組就夠了。默認(rèn)是每 8KB 分配一個inode,因此 1MB 的圖占一個塊,共有 10248=8192 個 bit,足夠表示這 1023 個塊了,因輸出的信息。從 000000 開始的 1KB 是啟動

26、塊,由于這不是一個真正的磁盤分區(qū),啟動塊的內(nèi)容全部為零。從 000400 到 0007ff 的 1KB 是超級塊,對照著 dumpe2fs 的輸出信息,詳細(xì)分析如下:圖 29.3. 超級塊其中以*開頭的行表示這一段數(shù)據(jù)全是零因此省略了。下面詳細(xì)分析 od$ od -tx1 -Ax fs000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00*000400 80 00 00 00 00 04 00 00 33 00 00 00 da 03 00 00000410 75 00 00 00 01 00 00 00 00 00 00 00 00 00

27、 00 00.不過也不影響理解?,F(xiàn)在用二進(jìn)制查看工具查看這個文件系統(tǒng)的所有字節(jié),并且同 dumpe2fs 工具的輸出信息相比較,就可以很好地理解文件系統(tǒng)的布局了。中添加刪除過文件,跟著做下面的步驟時結(jié)果可能和我寫的不太一樣,注意,下面的實驗步驟是對新創(chuàng)建的文件系統(tǒng)做的,如果你在文件系統(tǒng)$ sudo umount /mnt.Group 0: (Blocks 1-1023)Primary superblock at 1, Group descriptors at 2-2超級塊中從 0004d0 到末尾的 204 個字節(jié)是填充字節(jié),保留未用,上圖未畫出。注意,ext2 文件系統(tǒng)中各字段都是按小端的,

28、如果把字節(jié)在文件中的位置看作地址,那么靠近文件開頭的是低地址,存低字節(jié)。各字段的位置、長度和含義詳見ULK。從 000800 開始是塊組描述符表,這個文件系統(tǒng)較小,只有一個塊組描述符,對照著 dumpe2fs 的輸出信息分析如下:圖 29.4. 塊組描述符整個文件系統(tǒng)是 1MB,每個塊是 1KB,應(yīng)該有 1024 個塊,除去啟動塊還有 1023 個塊,分別為 1-1023,它們?nèi)紝儆?Group 0。其中, Block 1 是超級塊,接下來的塊組描述符,塊位圖是 Block 6,因此中間的Block 2-5 是塊組描述符表,其中 Block 3-5 保留未用。塊組描 述符還,inode 位圖

29、是 Block 7,inode 表是從 Block 8 開始的,那么inode 表到哪個塊結(jié)束呢?由于超級塊中每個塊組有 128 個 inode,每個 inode 的大小是 128 字節(jié),因此共占 16 個塊,inode 表的范圍是Block 8-23。從 Block 24 開始就是數(shù)據(jù)塊了。塊組描述符中,空閑的數(shù)據(jù)塊有986 個,由于文件系統(tǒng)是新創(chuàng)建的,空閑塊是連續(xù)的 Block 38-1023,GDT blocks at 3-5Block bitmap at 6 (+5), Inode bitmap at 7 (+6)Inode table at 8-23 (+7)986 free blo

30、cks, 117 free inodes, 2 directoriesFree blocks: 38-1023Free inodes: 12-128.001c00 ff 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00001c10ff*中的 1 就變得不連續(xù)了。塊組描述符,空閑的 inode 有 117 個,由于文件系統(tǒng)是新創(chuàng)建的,空閑的 inode 也是連續(xù)的,inode從 1 到 128,空閑的 inode從 12 到 128。從 inode 位圖可以看出,前 11 位都是 1,表示前 11 個inode 已用:到的順序來看。以后隨著文件系統(tǒng)的使用和

31、添加刪除文件,塊位圖管是 0 還是 1 都沒有意義??梢?,塊位圖每個字節(jié)中的位應(yīng)該按從低位最后一個字節(jié)的低 7 位),接下來的位已經(jīng)超出了文件系統(tǒng)的空間,不在塊位圖中,Block 38-1023 對應(yīng)的位都是 0(一直到 001870 那一行001800ff 1f 00 00 00 00 00 00 00 00 00 00 00001810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00*001870 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80001880ff*用掉了前面的Block 24-37

32、。從塊位圖中可以看出,前 37 位(前 4 個字節(jié)加最后一個字節(jié)的低 5 位)都是 1,就表示Block 1-37 已用:Inode: 2 Type: directoryMode: 0755 Flags: 0 x0 Generation: 0User: 1000 Group: 1000Size: 1024File ACL: 0Directory ACL: 0Links: 3 Blockcount: 2的 inode 信息:在 debugfs 的提示符下輸入 s/命令,這時在新的一屏中顯示根目錄$ debugfs fsdebugfs 1.40.2 (12-Jul-2007) debugfs: h

33、elp連續(xù)了。001c00 這一行的 128 位就表示了所有 inode,因此下面的行不管是 0還是 1 都沒有意義。已用的 11 個 inode 中,前 10 個 inode 是被 ext2文件系統(tǒng)保留的,其中第 2 個 inode 是根目錄,第 11 個 inode 是 lost+found 目錄,塊組描述符也該組有兩個目錄,就是根目錄和 lost+found。探索文件系統(tǒng)還有一個很有用的工具debugfs,它提供一個命令行界面,可以對文件系統(tǒng)做 ,例如查看信息、恢復(fù)數(shù)據(jù)、修正文件系統(tǒng)中的錯誤。下面用 debugfs 打開 fs 文件,然后在提示符下輸入 help 看看它都能做哪些事情:以

34、后隨著文件系統(tǒng)的使用和添加刪除文件,inode 位圖中的 1 就變得不把以上信息和 od 命令的輸出對照起來分析:圖 29.5. 根目錄的 inode上圖中的 st_mode 以八進(jìn)制表示,包含了文件類型和文件權(quán)限,最的 4 表示文件類型為目錄(各種文件類型的編碼詳見 s (2)),低位的 755 表示權(quán)限。Size 是 1024,說明根目錄現(xiàn)在只有一個數(shù)據(jù)塊。Links為3 表示根目錄有三個硬 ,分別是根目錄下的.和.,以及l(fā)ost+founddebugfs: quit按q 退出這一屏,然后用 quit 命令退出 debugfs:Fragment: Address: 0Number: 0Si

35、ze: 0ctime: 0 x4764cc3b - Sun Dec 16 14:56:59 2007atime: 0 x4764cc3b - Sun Dec 16 14:56:59 2007mtime: 0 x4764cc3b - Sun Dec 16 14:56:59 2007 BLOCKS:(0):24TOTAL: 1編碼文件類型子目錄下的.。注意,雖然通常用/表示根目錄,但是并沒有名為/的硬,事實上,/是路徑分隔符,不能在文件名中出現(xiàn)。這里的 Blockcount 是以 512 字節(jié)為一個塊來數(shù)的,并非格式化文件系統(tǒng)時所指定的塊大小,磁盤的最小讀寫稱為扇區(qū)(Sector),通常是 512

36、 字節(jié),所以 Blockcount 是磁盤的物理塊數(shù)量,而區(qū)的邏輯塊數(shù)量。根目錄數(shù)據(jù)塊的位置由上圖中的 Blocks0,也就是第 24 個塊,它在文件系統(tǒng)中的位置是 240 x400=0 x6000,從 od 命令的輸出中找到 006000 地址,它的格式是這樣:圖 29.6. 根目錄的數(shù)據(jù)塊目錄的數(shù)據(jù)塊由許多不定長的組成,每條描述該目錄下的一個文件,在上圖中用框表示。第一條描述 inode 號為 2 的文件,也就是根目錄本身,該的總長度為 12 字節(jié),其中文件名的長度為 1 字節(jié),文件類型為 2(見下表,注意此處的文件類型編碼和 st_mode 不一致),文件名是.。表 29.1. 目錄中的

37、文件類型編碼第二條也是描述 inode 號為 2 的文件(根目錄),該總長度為一直延續(xù)到該數(shù)據(jù)塊的末尾,描述 inode 號為 11 的文件第三條面全是 0 字節(jié)。如果要在根目錄下創(chuàng)建新的文件,可以把第三條截短,在原來的 0 字節(jié)處創(chuàng)建新的。如果該目錄下的文件名太多,一會填充到 inode 的個數(shù)據(jù)塊不夠用,則會分配新的數(shù)據(jù)塊,塊中讀出來的。列出了 inode 號、長度和文件名,這些信息都是從根目錄的數(shù)據(jù)塊2 (12) .2 (12) .11 (1000) lost+foundBlocks1字段。debugfs 也提供了 cd、ls 等命令,不需要 mount 就可以查看這個文件系統(tǒng)中的目錄,

38、例如用 ls 查看根目錄:(lost+found 目錄),該的總長度為 1000 字節(jié)(和前面兩條加起來是 1024 字節(jié)),文件類型為 2,文件名字符串是 lost+found,后12 字節(jié),其中文件名的長度為2 字節(jié),文件類型為2,文件名字符串是.。編碼文件類型0Unknown1Regular file2Directory3Character device4Block device5Named pipe6Socket7Symbolic link習(xí)題 請點(diǎn)評1、請讀者仿照對根目錄的分析,自己分析 lost+found 目錄的inode 和數(shù)據(jù)塊的格式。2、mount 這個文件系統(tǒng),在里面添加

39、刪除文件,然后 umount 下來,再次分析它的格式,和原來的結(jié)果比較一下看哪些字節(jié)發(fā)生了變化。2.3. 數(shù)據(jù)塊尋址 請點(diǎn)評如果一個文件有多個數(shù)據(jù)塊,這些數(shù)據(jù)塊很可能不是連續(xù)存放的,應(yīng)該如何尋址到每個塊呢?根據(jù)上面的分析,根目錄的數(shù)據(jù)塊是通過其inode 中的索引項 Blocks0找到的,事實上,這樣的索引項一共有 15個,從 Blocks0到 Blocks14,每個索引項占 4 字節(jié)。前 12 個索引項,例如上面的例子中 Blocks0字段保存著 24,就表示第都表示塊24 個塊是該文件的數(shù)據(jù)塊,如果塊大小是 1KB,這樣可以表示從 0 字節(jié)到 12KB 的文件。如果剩下的三個索引項 Blo

40、cks12到 Blocks14也是這么用的,就只能表示最大 15KB 的文件了,這是遠(yuǎn)遠(yuǎn)不夠的,事實上,剩下的三個索引項都是間接索引。索引項 Blocks12所指向的塊并非數(shù)據(jù)塊,而是稱為間接尋址塊(Indirect Block),其中存放的都是類似 Blocks0這種索引項,再由索引項指向數(shù)據(jù)塊。設(shè)塊大小是 b,那么一個間接尋址塊中可以存放 b/4個索引項,指向 b/4 個數(shù)據(jù)塊。所以如果把 Blocks0到 Blocks12都用上,最多可以表示 b/4+12 個數(shù)據(jù)塊,對于塊大小是 1K 的情況,最大可表示 268K 的文件。如下圖所示,注意文件的數(shù)據(jù)塊是從 0 開始的,Blocks0指向

41、第 0 個數(shù)據(jù)塊,Blocks11指向第 11 個數(shù)據(jù)塊,Blocks12所指向的間接尋址塊的第一個索引項指向第 12 個數(shù)據(jù)塊,依此類推。圖 29.7. 數(shù)據(jù)塊的尋址從上圖可以看出,索引項 Blocks13指向兩級的間接尋址塊,最多可表示(b/4)2+b/4+12 個數(shù)據(jù)塊,對于 1K 的塊大小最大可表示 64.26MB 的文件。索引項 Blocks14指向三級的間接尋址塊,最多可表示 (b/4)3+(b/4)2+b/4+12 個數(shù)據(jù)塊,對于 1K 的塊大小最大可表示 16.06GB的文件??梢姡@種尋址方式對于不超過 12 個數(shù)據(jù)塊的小文件是非??斓模募械娜我鈹?shù)據(jù)只需要兩次讀盤操作,一

42、次讀 inode(也就是讀索引項)一次讀數(shù)據(jù)塊。而大文件中的數(shù)據(jù)則需要最多五次讀盤操,錄數(shù)據(jù)塊的位置從根目錄的數(shù)據(jù)塊中找出文件名為 opt 的,從中讀出它的inode 號讀出 opt 目錄的inode,從中找出它的數(shù)據(jù)塊的位置從 opt 目錄的數(shù)據(jù)塊中找出文件名為 file 的,從中讀出它的 inode 號讀出 file 文件的inode1. 讀出 inode 表中第 2 項,也就是根目錄的 inode,從中找出根目作:inode、一級間接尋址塊、二級間接尋址塊、三級間接尋址塊、數(shù)據(jù)塊。實際上,磁盤中的 inode 和數(shù)據(jù)塊往往已經(jīng)被內(nèi)核緩存了,讀大文件的效率也不會太低。2.4. 文件和目錄操

43、作的系統(tǒng)函數(shù) 請點(diǎn)評本節(jié)簡要介紹一下文件和目錄操作常用的系統(tǒng)函數(shù),常用的文件操作命令如 ls、cp、mv 等也是基于這些函數(shù)實現(xiàn)的。本節(jié)的側(cè)重點(diǎn)在于講解這些函數(shù)的工作原理,而不是如何使用它們,理解了實現(xiàn)原理之后再看這些函數(shù)的用法就很簡單了,請讀者自己查閱 Man Page 了解其用法。s (2)函數(shù) 文件的 inode,然后把 inode 中的各種文件屬性填入一個 struct s 結(jié)構(gòu)體傳出給調(diào)用者。s (1)命令是基于 s 函數(shù)實現(xiàn)的。s 需要根據(jù)傳入的文件路徑找到 inode,假設(shè)一個路徑是/opt/file則查找的順序是:但是和s函數(shù)有一點(diǎn)不同,當(dāng)文件是一個符號時,s(2)函數(shù)文件本身

44、的 inode。ac s(2)函數(shù)檢查執(zhí)行當(dāng)前進(jìn)程的用戶是否 限 某個文件,傳入文件路徑和要執(zhí)行的 操作(讀/寫/執(zhí)行),ac s 函數(shù)取出文件 inode中的 st_mode 字段,比較一下 權(quán)限,然后返回 0 表示允許 ,返回-1 表示錯誤或不允許 。od(2)和 fod(2)函數(shù)改變文件的權(quán)限,也就是修改 inode 中的 st_mode 字段。這兩個函數(shù)的區(qū)別類似于 s/fs。od(1)命令是基于od 函數(shù)實現(xiàn)的。n(2)/fn(2)/ln(2)改變文件的所有者和組,也就是修改 inode中的 User 和 Group 字段,只有超級用戶才能正確調(diào)用這幾個函數(shù),這幾個函數(shù)之間的區(qū)別類似

45、于 s/fs/ls。n(1)命令是基于n函數(shù)實現(xiàn)的。utime(2)函數(shù)改變文件的時間和修改時間,也就是修改 inode 中的atime 和 mtime 字段。touch(1)命令是基于 utime 函數(shù)實現(xiàn)的。truncate(2)和 ftruncate(2)函數(shù)把文件截斷到某個長度,如果新的長度比原來的長度短,則后面的數(shù)據(jù)被截掉了,如果新的長度比原來的長度傳出的是它所指向的目標(biāo)文件的 inode,而 ls函數(shù)傳出的就是符號述符,傳出 inode 信息,ls(2)函數(shù)也是傳入路徑傳出 inode 信息,還有另外兩個類似s的函數(shù):fs(2)函數(shù)傳入一個已打開的文件描長,則后面多出來的部分用 0

46、 填充,這需要修改 inode 中的 Blocks 索引項以及塊位圖中相應(yīng)的bit。這兩個函數(shù)的區(qū)別類似于 s/fs。link(2)函數(shù)創(chuàng)建硬,其原理是在目錄的數(shù)據(jù)塊中添加一條新,其中的 inode 號字段和原文件相同。symlink(2)函數(shù)創(chuàng)建一個符號,這需要創(chuàng)建一個新的 inode,其中 st_mode 字段的文件類型是符號,原文件的路徑保存在 inode 中或者分配一個數(shù)據(jù)塊來保存。ln(1)命令是基于 link 和 symlink 函數(shù)實現(xiàn)的。unlink(2)函數(shù)刪除一個。如果是符號則這個符號的inode 和數(shù)據(jù)塊,清除 inode 位圖和塊位圖中相應(yīng)的位。如果是硬則從目錄的數(shù)據(jù)塊

47、中清除一條文件名 ,如果當(dāng)前文件的硬 數(shù)已經(jīng)是 1 了還要刪除它,就同時 它的 inode 和數(shù)據(jù)塊,清除 inode 位圖和塊位圖中相應(yīng)的位,這樣就真的刪除文件了。unlink(1)命令和 rm(1)命令是基于 unlink 函數(shù)實現(xiàn)的。rename(2)函數(shù)改變文件名,需要修改目錄數(shù)據(jù)塊中的文件名,如果原文件名和新文件名不在一個目錄下則需要從原目錄數(shù)據(jù)塊中清除一條然后添加到新目錄的數(shù)據(jù)塊中。mv(1)命令是基于 rename 函數(shù)實現(xiàn)的,因此在同一分區(qū)的不同目錄中移動文件并不需要和刪除文件的 inode 和數(shù)據(jù)塊,只需要一個改名操作,即使要移動整個目錄,這個目錄下有很多子目錄和文件也要隨著

48、一起移動,移動操作也只是對頂級目錄的改名操作,很快就能完成。但是,如果在不同的分區(qū)之間移動文struct dirent ino_td_ino;/* inode number */件就必須 和刪除 inode 和數(shù)據(jù)塊,如果要移動整個目錄,所有子目錄和文件都要 刪除,這就很慢了。readlink(2)函數(shù) 一個符號 所指向的目標(biāo)路徑,其原理是從符號的 inode 或數(shù)據(jù)塊中讀出保存的數(shù)據(jù),這就是目標(biāo)路徑。mkdir(2)函數(shù)創(chuàng)建新的目錄,要做的操作是在它的父目錄數(shù)據(jù)塊中添加一條 ,然后分配新的 inode 和數(shù)據(jù)塊,inode 的 st_mode 字段的文件類型是目錄,在數(shù)據(jù)塊中填兩個 ,分別是.和.,由于.表示父目錄,因此父目錄的硬 數(shù)要加 1。mkdir(1)命令是基于 mkdir 函數(shù)實現(xiàn)的。rmdir(2)函數(shù)刪除一個目錄,這個目錄必須是空的(只包含.和.)才能刪除,要做的操作是 它的 inode 和數(shù)據(jù)塊,清除 inode 位圖和塊位圖中相應(yīng)的位,清

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論