什么是inode?
理解inode,要從文件儲存說起。文件儲存在硬盤上,硬盤的最小存儲單位叫扇區(Sector)。每個扇區儲存512字節(相當于0.5KB)。操作系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個塊(block)。這種由多個扇區組成的塊是文件存取的最小單位,塊的大小,最常見的是4KB,即連續八個sector組成一個block,文件數據都儲存在塊中,那么很明顯,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創年日期、文件的大小等等。這種儲存元信息的區域叫做inode,中文譯名為”索引節點”。inode (index node) 表中包含文件系統的所有文件列表。
inode包含文件的信息(元數據)
? Inode編號
用來識別文件類型,以及用于stat C函數的模式信息
文件權限
文件的擁有者的UID
文件所屬組的GID
鏈接數(指向這個文件名路徑名稱個數)
文件的大小
文件的間戳(ctime指inode上一次變動的時間,mtime是指文件內容上一次變動的時間,atime指文件上一次打開的時間)
指向磁盤文件的數據塊指針
有關文件的其它數據
注意:要想查看文件的inode信息可以使用stat命令查看
inode表結構
直接塊指針:
前12個直接指針,直接指向存儲數據的區域。如Blocks大小為4*1024KB,前12個直接指針就可以保存48KB的文件
間接塊指針:
設每個指針占用4個字節,則以及指針指向的Blocks可以保存(4*1024)/4KB,可指向1024個Blocks,一級指針可存儲文件數據大小為1024*(4*1024)KB=4MB
雙重間接塊指針:
同樣Blocks大小為4*1024,則二級指針可保存Blocks指針數量為((4*1024)/4)*((4*1024)/4),則二級指針保存文件數據大小為(1024*1024)*(4*1024)=4GB
三重間接塊指針:
以次類推三級指針可以儲存文件數據大小為(1024*4*1024*1024)*(4*1024)=4TB
inode的大小:
每個inode都有一個編號,操作系統用inode號來識別不同文件。Unix/Linux系統不使用文件名,而使用inode號來識別文件,對于系統來說,文件名只是inode號碼便于識別的別稱或綽號。表面上,通過文件名打開文件;實際上,系統內部這個過程分成三步:首先,系統找到這個文件名對應的inode號;其次,通過inode號,獲取inode信息;最后,根據inode信息,找到文件數據所在的block,讀出數據。
注意:inode號并不是無限的,如果一個分區的節點數被使用完了,那么即使磁盤空間還有剩余也不能再存放任何數據。可以使用df -i命令查看節點使用情況
? 注:1節點總數、2使用過節點數、3剩余節點數、4節點使用率
目錄文件:
Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件目錄文件的結果非常簡單,就是一系列目錄項(direct)的列表。每個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號。
ls命令只列出目錄文件中的所有文件名:
ls -i命令列出整個目錄文件,即文件名和inode號(箭頭標的即為inode號):
如果要查看文件的詳細信息,就必須根據inode號,訪問inode節點,讀取信息。ls -i -l 目錄文件 列出整個目錄文件,即文件名和inode號(箭頭標注的列即為inode號)
理解了上面的知識,就能理解目錄的權限,文件的讀權限(r)和寫權限(w),都是針對目錄文件本身。由于目錄文件內只有文件名和inode號,所以只有讀權,只能獲取文件名,無法獲取其他信息,因為其他信息都儲存在inode節點中,而讀取inode節點內的信息需要目錄文件的執行權限(x)。
Linux中cp、rm、mv 、ln對inode的影響:
cp命令
- 分配一個未被使用的inode號,在inode表中添加一個新項目,(注意:如果是cp到謳歌已經存在的文件,則inode號采用被覆蓋之前的目標文件的inode號,如果對運行中的apache共享模塊so文件進行cp操作,就會出現Segmentation fault<段錯誤>)
- 在目錄中新建一個目錄項,并指向步驟1中的inode
- 把數據復制到block中
rm命令
- 減少鏈接數量,如果鏈接數為0,釋放inode(inode號也已被重新使用);
- 如果inode被釋放,則數據塊放到可用空間列表中;
- 刪除目錄中的目錄項
mv命令
1.如果mv命令的目標文件和源文件所在額文件系統相同:
- 使用新文件名建立目錄項;
- 刪除帶有原來文件名的目錄項;
注意:該操作對inode表沒有影響(除時間戳),對數據的位置也沒有影響,不移動任何數據。(即使是mv到一個已經存在的目標文件,新目錄項指源文件inode,會先刪除目標文件的目錄項,所以如果對運行中的apache的共享模塊so文件進行這種操作的話不會有問題,新的so文件inode號變了)
2.如果目標和源文件所在的問價系統不相同,就是cp和rm;
ln命令
符號(軟)鏈接:
符號鏈接的內容是它引用文件的名稱,可以是任意文件或目錄,也可以鏈接不同問價系統的文件,甚至可以鏈接不存在的文件,這就產生一般稱為斷裂的問題,還可以不斷的循環鏈接源文,但是其大小為指向的路徑字符串的長度;不增加或減少目標文件inode 的引用計數。
使用ln -s source_file softlink_file (注意:源文件(source_file)的路徑是相對路徑(也可以是絕對路徑,通常使用的是相對路徑),一定是相對于軟鏈接文件的路徑,而非相對于當前工作目錄的路徑)創建符號鏈接,在對符號鏈接進行讀寫操作的時候,系統會自動把該操作轉換為對源文件的操作,但是刪除連接文件時,系統僅僅刪除符號鏈接文件,而不是刪除源文件本身。
硬鏈接:
不允許給目錄創建硬鏈接,創建硬鏈接會正價額外的記錄項以引用文(不能跨驅動或分區創建硬鏈接),硬鏈接件對應于同一文件系統上的一個物理文件,硬鏈接節點編號是相同的,創建硬鏈接鏈接數遞增,刪除文件時:rm命令遞減計數的鏈接,文件如果存在,至少有一個鏈接數,當鏈接數為0時,該文件被刪除。
使用ln existfile newfile 命令創建硬鏈接
硬鏈接于軟連接的區別:
1、本質不同:硬鏈接是指向同一個文件,軟鏈接指向的不是同一個文件
2、刪除時:硬鏈接不受影響,軟鏈接失效
3、創建鏈接時:創建硬鏈接鏈接數加1,創建軟鏈接連接數不變
4、是否可以跨分區:硬鏈接不可以跨分區,軟鏈接可以跨分區
5、目錄是否可以創建鏈接:硬鏈接不可以對目錄創建,軟鏈接可以對目錄創建
6、硬鏈接的inode號相同,軟鏈接inode號不同
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89002