7.28_Linux_ext數據結構inode的原理淺析、軟硬鏈接的區別


inode表結構淺析

下圖以ext文件系統爲參考,以4k塊大小分區,簡單描述一下ext文件系統的數據結構原理,如果有任何錯誤,煩請各位指出

wKioL1ea9qKwMA88AAQ0CV5awjQ474.png

inode 索引節點

硬盤上的每個磁道被等分爲若干個弧段,這些弧段便是磁盤的扇區。硬盤的讀寫以扇區爲基本單位

扇區的大小,是2的N次方倍。分區的大小可以有多樣,1k、2k、4k...以4k塊大小來說明。4k塊大小分爲8個扇區,每個扇區對應512字節。每一塊也稱爲block,文件以block爲單位進行存儲,並且每一個bolck只能屬於一個文件,若文件大小不足4k,也按照4k大小的塊來存儲。inode的數量是格式化的時候指定的,理論上來說,inode的數量和block的數量是越接近越好,但是在實際過程中一一對應是很難的,所以一般格式化的時候會按照服務器的用途來指定一定比例的inode數量。

#df 查看系統每個分區bolck的數量

#df -i 查看系統每個分區inode的數量

wKiom1ebAPKCPrmpAABYTLiUKfk558.png

每個分區都有一個獨立的inode table

元數據也是在inode裏面,元數據也是會佔用磁盤空間的。

指針:數據塊的路徑


直接指針:有12個指針,一個4k, 可以存儲4*12=48K的數據塊。

間接指針:第十三個指針,指向下一個文件塊的指針,也是4k塊大小,4k塊來說,可以劃分1024個指針,裏面的指針纔是指向真正的數據塊。一共可以存儲1024*4k=4M的數據塊,那麼文件在4M左右範圍裏面,可以用間接指針就可以完成。

兩重指針:第十四個指針。也是指向一個4k指針數據塊,4k指針塊再指向1024個指針數據塊,

每個指針可以存放1024個4k數據,所以可以存儲1024*1024*4k=4G的數據塊。

三重指針:跟兩重指針工作原理類似,最後可以存放1024*1024*1024*4k=4t的數據塊。


inode table是緩存在內存裏面的,所以查詢速度還是很快的。一般來說,在系統裏面刪掉文件的操作並不是刪掉數據塊,而是刪掉inode table裏面的元數據,這裏解釋一下元數據,元數據就是數據塊的屬性,例如:名字,身高等這些就可以理解爲元數據。所以,這個就是爲什麼刪掉了文件以後,只要沒有新的文件覆蓋掉原有的數據塊,數據一般都可以恢復的原因。很多文件系統,例如windows下面的fat和ntfs也是同樣的原理。一般來說,在磁盤裏面的數據都是連續寫入,由於有時候會刪除掉部分數據,使得磁道里面有些空位置並不能一下子連續的存儲下一個文件,一般這樣都是分散存儲在不同的磁道里面,當讀取這一部分的數據,磁盤的指針要來回轉多幾個圈,造成性能下降,這就是文件碎片的由來。所以隔一段時間進行碎片整理是必須的。但是現在一些新的硬盤,如SSD固態硬盤,就沒有磁道這些說法,所以就並不需要像傳統的機械硬盤一樣進行碎片整理。


磁盤裏的數據塊有文件和目錄,這兩者的inode的存儲方式也是不同的。

在inode table裏面文件是直接引用一個inode的號碼,而目錄則是在inode table裏面的目錄項下面存儲文件名和文件inode之間的映射。


複製、刪除、移動對inode的影響

cp 複製:新的文件會分配一個空閒的inode號,在inode表中生成新條目

         在目錄中創建一個目錄項,將名稱與inode編號關聯

         拷貝數據生成新的文件,是兩個完全不相同的數據塊。


rm 刪除:鏈接數遞減,從而釋放的inode號可以被重用

         把數據塊放在空閒列表中

         刪除目錄項

         數據實際上不會馬上被刪除,但當另一個文件使用數據塊時將被覆蓋,如果恢復inode的元數據的時候文件就會馬上鍊接恢復。


mv 移動:如果mv命令的目標和源在相同的同一個分區下面,作爲mv命令

         用新的文件名創建對應新的目錄項

         刪除舊目錄條目對應的舊的文件名

         不影響inode表(除時間戳)或磁盤上的數據位置:沒有數據被移動!所以在同一個分區裏面移動文件的速度是非常的快的原因。

         如果目標和源在一個不同的文件系統,mv相當於cp和rm


硬鏈接和軟鏈接的區別


什麼是硬鏈接?

硬鏈接:指向同一個inode的多個文件路徑。(簡單理解的意思就是一個人有兩個名字,例如張三,他的外號叫老張,又叫小三,其實都是同一個人)

特性:

1 目錄不支持硬鏈接

2 硬鏈接不能跨文件系統(不能跨分區)

3 創建硬鏈接會增加inode引用計數;


創建硬鏈接文件命令

ln 源文件 硬鏈接文件...

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln - make links between files

刪掉其中一個硬鏈接文件,其他硬鏈接文件不受影響


什麼是軟鏈接(符號鏈接)

軟鏈接:指向同一個文件路徑的另一個文件路徑;

特性:

1 符號鏈接於文件是兩人各自獨立的文件,各有自己的inode;對原文件創建符號鏈接

 不回增加引用計數;

2 支持對目錄創建符號鏈接,可以跨文件系統;

3 刪除符號鏈接文件不影響原文件;但刪除原文件,符號指定的路徑即使不存在,此時會

 變成無效鏈接。


注意:符號鏈接文件的大小是其指定的文件的路徑字符串的字節數


創建軟鏈接文件命令

#ln -s 原始文件路徑文件1 軟鏈接文件1..2..創建軟鏈接 

-s, --symbolic
              make symbolic links instead of hard links

創建軟鏈接的時候,必須要用絕對路徑!

原始文件相對於軟鏈接文件路徑,而不是相對於當前工作目錄。


兩者區別:

這裏以個人理解做了一個小表格

wKiom1edagqDeu7mAAB4bq3JH9s031.png




練習題


1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄

# ls -ld /var/l*[0-9]*[[:lower:]]

2、顯示/etc目錄下以任意一位數字開頭,且以非數字結尾的文件或目錄

# ls -ld /etc/[0-9]*[^0-9]

3、顯示/etc/目錄下以非字母開頭,後面跟了一個字母及其它任意長度任意字符的文件或目錄

# ls -ld /etc/[^[:alpha:]][[:alpha:]]*

4、顯示/etc目錄下所有以m開頭以非數字結尾的文件或目錄

# ls -ld /m*[^0-9]

5、顯示/etc目錄下,所有以.d結尾的文件或目錄

# ls -ld /etc/*.d

6、顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的文件或目錄

# ls -ld /etc/[mnrp]*.conf

7、使用別名命令,每日將/etc/目錄下所有文件,備份到/testdir/下獨立的新目錄下,並要求新目錄格式爲backupYYYY-mm-dd,備份過程可見

# alias bkday='cp -av /etc/ /testdir/backup`date +%F`'
# bkday

8、先創建/testdir/rootdir目錄,再複製/root所有下文件到該目錄內,並要求保留原有權限

#cp -av /root /testdir/rootdir

9、如何創建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

# mkdir -p /testdir/dir1/{x,y}/{a,b}

10、如何創建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b

# mkdir -pv /testdir/dir2/{x/{a,b},y}

11、如何創建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7

# mkdir -p /testdir/dir{3,4,5/dir{6,7}}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章