inode表結構淺析
下圖以ext文件系統為參考,以4k塊大小分區,簡單描述一下ext文件系統的數據結構原理,如果有任何錯誤,煩請各位指出
inode 索引節點
硬盤上的每個磁道被等分為若干個弧段,這些弧段便是磁盤的扇區。硬盤的讀寫以扇區為基本單位。
扇區的大小,是2的N次方倍。分區的大小可以有多樣,1k、2k、4k…以4k塊大小來說明。4k塊大小分為8個扇區,每個扇區對應512字節。每一塊也稱為block,文件以block為單位進行存儲,并且每一個bolck只能屬于一個文件,若文件大小不足4k,也按照4k大小的塊來存儲。inode的數量是格式化的時候指定的,理論上來說,inode的數量和block的數量是越接近越好,但是在實際過程中一一對應是很難的,所以一般格式化的時候會按照服務器的用途來指定一定比例的inode數量。
#df 查看系統每個分區bolck的數量
#df -i 查看系統每個分區inode的數量
每個分區都有一個獨立的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 源文件 硬鏈接文件…
1
2
|
ln [OPTION]... [-T] TARGET LINK_NAME (1st form) ln - make links between files |
刪掉其中一個硬鏈接文件,其他硬鏈接文件不受影響
什么是軟鏈接(符號鏈接)
軟鏈接:指向同一個文件路徑的另一個文件路徑;
特性:
1 符號鏈接于文件是兩人各自獨立的文件,各有自己的inode;對原文件創建符號鏈接
不回增加引用計數;
2 支持對目錄創建符號鏈接,可以跨文件系統;
3 刪除符號鏈接文件不影響原文件;但刪除原文件,符號指定的路徑即使不存在,此時會
變成無效鏈接。
注意:符號鏈接文件的大小是其指定的文件的路徑字符串的字節數
創建軟鏈接文件命令
1
2
3
4
|
#ln -s 原始文件路徑文件1 軟鏈接文件1..2..創建軟鏈接 -s, --symbolic make symbolic links instead of hard links |
創建軟鏈接的時候,必須要用絕對路徑!
原始文件相對于軟鏈接文件路徑,而不是相對于當前工作目錄。
兩者區別:
這里以個人理解做了一個小表格
練習題
1、顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄
1
|
# ls -ld /var/l*[0-9]*[[:lower:]] |
2、顯示/etc目錄下以任意一位數字開頭,且以非數字結尾的文件或目錄
1
|
# ls -ld /etc/[0-9]*[^0-9] |
3、顯示/etc/目錄下以非字母開頭,后面跟了一個字母及其它任意長度任意字符的文件或目錄
1
|
# ls -ld /etc/[^[:alpha:]][[:alpha:]]* |
4、顯示/etc目錄下所有以m開頭以非數字結尾的文件或目錄
1
|
# ls -ld /m*[^0-9] |
5、顯示/etc目錄下,所有以.d結尾的文件或目錄
1
|
# ls -ld /etc/*.d |
6、顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的文件或目錄
1
|
# ls -ld /etc/[mnrp]*.conf |
7、使用別名命令,每日將/etc/目錄下所有文件,備份到/testdir/下獨立的新目錄下,并要求新目錄格式為backupYYYY-mm-dd,備份過程可見
1
2
|
# alias bkday='cp -av /etc/ /testdir/backup`date +%F`' # bkday |
8、先創建/testdir/rootdir目錄,再復制/root所有下文件到該目錄內,并要求保留原有權限
1
|
#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
1
|
# mkdir -p /testdir/dir1/{x,y}/{a,b} |
10、如何創建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
1
|
# mkdir -pv /testdir/dir2/{x/{a,b},y} |
11、如何創建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
1
|
# mkdir -p /testdir/dir{3,4,5/dir{6,7}} |
原創文章,作者:~微風~,如若轉載,請注明出處:http://www.www58058.com/28244