1. 程式人生 > >Linux中的索引節點、硬連線和連線計數

Linux中的索引節點、硬連線和連線計數

索引節點、硬連線和連線計數

索引節點inode 
    Linux
為每個檔案分配一個稱為索引節點的號碼inode,可以將inode簡單理解成一個指標,它永遠指向本檔案的具體儲存位置。系統是通過索引節點(而不是檔名)來定位每一個檔案。
例如:假設我們在硬碟當前目錄下建立了一個名為mytext文字檔案,其內容只有一行:  This is my file. 
    1
、當然這行文字一定是儲存在磁碟資料區某個具體位置裡(物理上要通過磁頭號、柱面號和扇區號來描述,在本例中假設分別是12030)
 
    2
、假設其inode262457,那麼系統通過一段標準程式,就能將這個inode轉換成存放此檔案的具體實體地址

(1磁頭、20柱面、30扇區),最終讀出檔案的內容:“This is my file.  
    3
、所以inode是指向一個檔案資料區的指標號碼,一個inode對應著系統中唯一的一片物理資料區,而位於兩個不同物理資料區的檔案必定分別對應著兩個不同的inode號碼。

檔案拷貝命令

我們鍵入命令:cp /home/zyd/mytext newfile 。在當前工作目錄建立了一個新檔案newfile,其實際操作主要包括如下三步:

1、在當前目錄中增加一個目錄項,其檔名域填入newfile,並分配了一個新的inode,假設是262456

2、將原檔案(1磁頭、20柱面、30扇區)的內容複製了一份到新的空閒物理塊

(假設是1磁頭、20柱面、31扇區)

3、填寫一些其他關鍵資訊,使系統通過這些資訊及inode號碼可以完成實體地址的轉換。

所以檔案複製要分配新的inode和新的資料區,雖然兩個檔案的內容是一樣的。

硬連線hardlink

我們實際使用檔案時一般是通過檔名來引用的。通過上面的討論,我們知道:

1inode號碼肯定和一片完全屬於一個檔案的資料區一一對應。那麼一個檔案系統中兩個或更多個不同的檔名能否對應同一個檔案呢?答案是肯定的。

我們知道inode號碼是記錄在檔名對應的目錄項中的,我們可以使兩個或多個檔案的目錄項具有相同的inode值,實際上就使它們對應著同一個檔案。

有幾個目錄項具有相同的

inode號,我們就說這個檔案有幾個硬連線(hardlink),對於普通檔案,ls -l命令的連線計數count域的數值就是本檔案擁有的硬連線數。硬連線可以通過ln命令建立,例如:

ln /home/zyd/mytext hardlink_mytext

就建立了一個新的檔案hardlink_mytext,這個檔案的inode同樣是262457。建立硬連線實際上只是增加了一個目錄項,但並沒有複製檔案資料區,原檔案的資料區由兩個檔案共享。這一方面能夠節約大量磁碟空間,同時可以保證兩個檔案能同步更新。

’ls -il’可以顯示檔案的inode(在下面最左邊)

262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile  (這是拷貝的檔案檔案)

262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext  (硬連結)

262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext

硬連結檔案有兩個限制

1、不允許給目錄建立硬連結;

2、只有在同一檔案系統中的檔案之間才能建立連結。

對硬連結檔案進行讀寫和刪除操作時候,結果和軟連結相同。但如果我們刪除硬連結檔案的原始檔,硬連結檔案仍然存在,而且保留了願有的內容。這時,系統就“忘記”了它曾經是硬連結檔案。而把他當成一個普通檔案。修改其中一個,與其連線的檔案同時被修改。

連線計數count

前面我們介紹了,檔案的連線計數域表明本系統中共有幾個檔案目錄項的inode和本檔案相同,也就是本檔案共有幾個硬連線。如上面的例子中hardlink_mytextmytext檔案的count2

那麼對於目錄,其count域的含義是什麼呢?目錄的count同樣表示共有多少個目錄項指向此目錄,不過要詳細說明必須進一步解釋VFS檔案系統的結構,為簡單起見,只要這樣理解就行了:(count-2)等於本目錄包含的直接子目錄數(就是隻包括兒子,不包括孫子啦!)

例如:如果一個目錄/abccount域為5,那麼/abc目錄一定包含3個子目錄。

進一步說明

硬連線檔案實際上並不是一種新的檔案型別,兩個檔案互為對方的硬連線。它們應該都是普通檔案(誰能告訴我:其它型別的檔案可以硬連線嗎?)。兩個檔案除了名稱或/和檔案目錄不同外,其它部分完全相同,更改了一個檔案,另一個的檔案長度、內容、更改時間等都將相應發生變化,更改了一個檔案的許可權位mode,另一個也會發生同樣的變化。因為這些資訊都儲存在FCB即檔案控制塊中,FCB有放在索引結點(inode)中)

注意連線計數字段count,互為硬連線的兩個檔案的count值都是2,表明有兩個inode指向同一檔案的inode

當我們刪除其中一個檔案時,系統首先將(count-1)->count,如果結果是零,就將其目錄項和資料區都刪除,否則只將本目錄項刪除,資料區仍然保留,仍然可以通過另外的檔名訪問。(關於linux檔案的刪除內部是怎麼操作的?這裡的寫法似乎有點問題,刪除的時候除了刪除目錄項外有刪除資料區嗎?)根據這個特性,可以通過為重要的檔案建立硬連線的方法來防止其被誤刪除。

一個檔案系統允許的inode節點數是有限的,如果檔案數量太多,即使每個檔案都是0位元組的空檔案,系統最終也會因為節點空間耗盡而不能再建立檔案。所以當發現不能建立檔案時首先要考慮硬碟資料區是否還有空間(可通過du命令),其次還得檢查節點空間。

互為硬連線的多個檔案必須位於同一個檔案系統上。根裝置及任何一個需要mount才能掛接進來的分割槽、軟盤、NFS、光碟機等都是一個獨立的檔案系統,每個檔案系統有一個相應的裝置號,不同檔案系統中具有相同inode點的檔案間沒有任何聯絡。系統則通過裝置號和inode號的組合唯一確定一個檔案

Linux之所以能支援多種檔案系統,其實是由於Linux提供了一個虛擬檔案系統VFSVFS作為實際檔案系統的上層軟體,掩蓋了實際檔案系統底層的具體結構差異,為系統訪問位於不同檔案系統的檔案提供了一個統一的接口。實際上許多檔案系統並不具備inode結構,其目錄結構也和以上的討論不同,但通過VFS,系統均為其提供了虛擬一致的inode和目錄項結構。所以,’ls -il’命令實際顯示的inode應該是VFS inode,也就是說,inode是存在於記憶體中的資料結構,而不一定是實際的硬碟結構。但為Linux量身定做的ext2檔案系統具備實際的inode和連線型目錄項結構,所以,對於ext2檔案系統,可以認為我們上面討論的關於硬連線的概念是完全正確的。

軟連結:(符號連結?)

軟連結又叫符號連結,這個檔案包含了另一個檔案的路徑名。可以是任意檔案或目錄,可以連結不同檔案系統的檔案。和win下的快捷方式差不多。連結檔案甚至可以連結不存在的檔案,這就產生一般稱之為"斷鏈"的問題(或曰“現象"),連結檔案甚至可以迴圈連結自己。類似於程式語言中的遞迴.(在“湯 子瀛的作業系統”中是這樣說符號連結的:這個符號連結本身也是檔案――而不像上面的“硬連結”實際上是增加一個目錄項,項中存在指向索引結點的指標――所 以符號連結有直接的索引結點,要耗費一定的磁碟空間,該符號連結這個檔案中包含被連結檔案的路徑名。所以只有檔案才擁有指向其索引結點的指標,而共享該文 件的其他使用者,這通過符號連結,“只擁有該檔案的路徑名”)
============================================================================================
Unix中使用i節點(i node)來記錄真實的物理檔案及其位置,檔名只是指向i節點的一個連線。因此每個檔案可以有多個名字,每個名字就稱為檔案的一個連線,而同一個檔案的 所有連線所指向的i節點件完全相同。但在刪除時只有全部刪除這個i節點的全部連線,才能刪除i節點、即刪除這個檔案本身。


$ ln l1 l2

$ ls -l l*

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l1

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l2


    上面的例子使用 ln建立了一個連線,然後在ls的結果中可以看到第二列的數字為2,這表示這個檔案有兩個連線。這樣的連線可以建立在不同的目錄中,但所有連線所在的目錄 必須在同一個檔案系統中,才能使用同樣的i節點。由於連線是直接指向標識物理檔案的i節點,因此這種連線又稱為硬連線。

    另一種更靈活的連線方式是符號連線,它沒有指向物理檔案的 i節點,而是直接指向目錄樹上的另一個入口,那麼當系統訪問這個檔案時,就沿著它指向的目錄樹的位置去查詢具體檔案。這樣就能對任何檔案系統中的檔案和目 錄建立連線,因此稱為軟連線。符號連線可以跨越檔案系統,靈活性很大,能夠突破物理檔案系統的限制維護目錄樹的一致性,對於系統管理和維護很有用。但是這 種連線方式需要對目錄樹進行多次查詢,增加了檔案操作的額外步驟,因此效率較低,因此不應該使用多級連線,及某個符號連線指向的目錄還是一個符號連線,甚 至發生符號連線的迴圈。應該儘量少用符號連線,並避免多級符號連線及符號連線的迴圈。


$ ln -s l1 /root/files

$ ls -l l*

lrwxrwxrwx 1 user wheel 12 Dec 4 12:36 l1 -> /root/files

$

  ===========================================================================

連結有兩種,一種被稱為硬連結(Hard Link),另一種被稱為符號連結(Symbolic Link)。預設情況下,ln命令產生硬連結。 

硬 連線指通過索引節點來進行的連線。在Linux的檔案系統中,儲存在磁碟分割槽中的檔案不管是什麼型別都給它分配一個編號,稱為索引節點號(Inode Index)。在Linux中,多個檔名指向同一索引節點是存在的。一般這種連線就是硬連線。硬連線的作用是允許一個檔案擁有多個有效路徑名,這樣使用者 就可以建立硬連線到重要檔案,以防止“誤刪”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連線。只刪除一個連線並不影響索引節點本身和 其它的連線,只有當最後一個連線被刪除後,檔案的資料塊及目錄的連線才會被釋放。也就是說,檔案才會被真正刪除。 

與硬連線相對應,Lnux系統中還存在另一種連線,稱為符號連線(Symbilc Link),也叫軟連線。軟連結檔案有點類似於Windows的快捷方式。它實際上是特殊檔案的一種。在符號連線中,檔案實際上是一個文字檔案,其中包含的有另一檔案的位置資訊。 

 touch f1(建立一個f1的檔案)
ln f1 f2 創佳一個f2的硬連線
ln -s f1 f3 建立一個f3的軟連線
此 時如果刪除f3,對f1,f2無影響;如果刪除f2,對f1,f3也無影響,如果刪除f1,那麼因為f2也應用f1,所以並不影響f2節點的,touch 建立的檔案仍然存在;但是此時f3因為是軟連線,導致f3失效。如果刪除f1,f2 ,那麼touch 創佳的檔案會被刪除

轉載自:http://blog.csdn.net/metasearch/article/details/2177771