硬鏈接(Hard Link)和軟鏈接也稱為符號鏈接(Symbolic Link)的目的是為了解決檔案的共享使用問題,要闡明其原理,必須先理解Linux的檔案存盤方式,
索引結點
Linux是一個UNIX類作業系統,所有型別的UNIX檔案都是由作業系統通過索引節點來管理的,
索引節點是一個控制結構,包含作業系統所需的關于某個檔案的關鍵資訊,多個檔案名能與一個索引節點相關聯,但一個活躍的索引節點只能與一個檔案相關聯,且每個檔案只能由一個索引節點來控制,檔案的屬性、訪問權限和其他控制資訊都保存在索引節點中,此處以Linux中ext2的索引結點示例,
Ext2檔案系統的每一個檔案和目錄都對應一個索引結點,每一個資料塊組中的索引結點都保存在索引結點表中,
ext2的索引結點的一些主要欄位:
Mode:包含次索引結點描述的是什么(比如描述檔案、目錄、符號鏈接、塊設備、字符設備以及FIFO結構等)以及用戶擁有的權限
Owner information:檔案或目錄所有者的用戶和組識別符號,這使得檔案系統可以正確地授權某種存取操作
Size:檔案大小
Timestamps:建立時間和最后修改時間
Datablocks:指向存盤此索引結點描述的檔案資料塊的指標,直接指標指向存盤資料的物理資料塊,間接指標、兩級指標和三級指標指向不同級別的指標塊或資料,
具體的索引節點結構會因為UNIX實作的不同而發生變化,再舉一個FreeBSD的索引節點結構:
當訪問一個檔案時,通過檔案名在目錄表中查找到其索引節點號,通過索引節點號查索引節點表得到其索引節點,通過索引節點得到檔案資料所在的位置,
索引結點也會消耗硬碟空間,所以硬碟格式化的時候,作業系統自動將硬碟分成兩個區域,一個是資料區,存放檔案資料(data block);另一個是索引結點區(inode table),存放索引結點所包含的資訊,
每個索引結點的大小,一般是128位元組或256位元組,索引結點的總數,在格式化時就給定,一般是每1KB或每2KB就設定一個索引結點,
Linux中的相關命令:
查看每個硬碟磁區的索引結點總數和已經使用的數量,可使用df命令:df -
查看每個索引結點節點的大小,可以用如下命令:sudo dumpe2fs -h /dev/hda | grep “Inode size”
使用ls –l命令會顯示出在大部分資訊. ls –i option顯示檔案的索引號.
而stat命令則可以列出索引節點中的幾乎所有資訊.
檔案系統第一次被創建時, 會為每一個檔案系統創建若干數量的索引節點,該數目是檔案系統所能容納的最大檔案數,只要不重新初始化檔案系統, 就不能改變這個數目, 否則會損壞該檔案系統上所有的資料,當檔案系統中有很多很多小檔案時檔案系統會可能將索引節點全部用光,
一個檔案系統維護了一個索引節點的陣列,每個檔案或目錄都與索引節點陣列中的唯一一個元素對應,系統給每個索引節點分配了一個號碼,也就是該節點在陣列中的索引號,稱為索引節點號,作業系統用索引結點號碼來識別不同的檔案,
表面上,用戶通過檔案名,打開檔案,實際上,系統內部這個程序分成三步:首先,系統找到這個檔案名對應的索引結點號碼;其次,通過索引結點號碼,獲取索引結點資訊;最后,根據索引結點資訊,找到檔案資料所在的block,讀出資料,
使用ls -i命令,可以看到檔案名對應的inode號碼:ls -i example.txt
由于索引結點與檔案名分離,這種機制導致了一些Unix/Linux系統特有的操作
1. 若出現檔案名包含特殊字符,無法正常洗掉的情況,這時,可以通過直接洗掉索引結點來洗掉檔案,
2. 移動檔案或重命名檔案,只是改變檔案名,不影響索引結點號碼,
3. 打開一個檔案以后,系統就以索引結點號碼來識別這個檔案,不再考慮檔案名,因此,通常來說,系統無法從索引結點號碼得知檔案名,
第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟,更新的時候,新版檔案以同樣的檔案名,生成一個新的索引結點,不會影響到運行中的檔案,等到下一次運行這個軟體的時候,檔案名就自動指向新版檔案,舊版檔案的索引結點則被回收,
硬鏈接和軟連接
基于索引結點共享:硬鏈接(hard link)
檔案索引節點中設有一個鏈接計數欄位inode link count,用來表示連接到本索引結點上的用戶目錄項的數目
用戶A創建一個新檔案時,inode link count;
用戶B要共享該檔案,B的目錄中增加一個目錄項,并填上新的檔案名和指向該共享檔案的索引結點的指標,inode link count;
缺點:檔案主無法洗掉被他人共享的檔案,
?在系統中占用的空間與源檔案相同,但在系統中參考的是相同的物件(不是拷貝)
?在作業系統層決議
?圖示和創建快捷方式的圖示不同
?移除源檔案不會影響硬鏈接
?移除硬鏈接不會影響源檔案
?如果源檔案被洗掉,它的內容依然通過硬鏈接存在
?硬鏈接檔案的任何更改都會影響到源檔案
$ln a b # b是a所指檔案的硬鏈接
硬鏈接實際上是為原檔案建立一個別名,鏈接檔案和原檔案實際上是同一個檔案,可以通過ls -i來查看,兩個檔案的inode號是同一個,說明它們是同一個檔案,它只是在檔案原來的inode link count域再增加1而已,也因此硬鏈接是不可以跨檔案系統的,硬鏈接洗掉的時候,系統呼叫會檢查inode link count的數值,如果它大于等于1,那么inode不會被回收,因此檔案的內容不會被洗掉,目錄不能進行硬連接,目錄硬連接參考計數,如果形成環,洗掉的時候會產生dangling dir,

基于檔案路徑共享:符號鏈接(symbolic link)&軟連接(junction link or soft link)
為了能使B共享A的一個檔案,系統為B建立一個型別為link的新檔案,將該檔案放在B的目錄下,在新檔案中只包含了目標檔案的路徑名,當B讀該link型別的檔案時,將被OS截獲,并根據新檔案中的路徑名去讀目標檔案,這種實作檔案共享的方式成為符號鏈接,
在這種方式下,檔案主洗掉被他人共享的檔案后,其他用戶再去訪問該共享檔案,會因找不到檔案而失敗,再將該符號鏈洗掉不會造成任何影響
缺點:其他用戶訪問共享我共享檔案時,必須根據路徑中的分量名逐級檢索目錄,加大了訪問檔案的開銷;盡管Link型別檔案很簡單,但任需為它配置一個索引結點,并分配一個盤塊來存放目標檔案的路徑名,這樣也增加了系統的開銷,
?創建鏈接后的圖示和快捷方式很像
?在系統中不占用空間
?在檔案系統中不是一個單獨的檔案
?在作業系統層決議
?如果源檔案被洗掉了,鏈接就沒用了
?移除源檔案不會影響符號鏈接
?移除鏈接檔案也不會影響源檔案
$ ln –s a b #為a創建一個符號鏈接b
rm b:a不受影響
rm a:a不存在,b能被控制但無法訪問
軟鏈接實質是新建立一個inode,產生一個新的檔案,但這個檔案的作用就是專門指向某個檔案的,洗掉這個軟鏈接檔案,原來的物體原檔案還是存在的,保持不變,但要是洗掉原來的檔案,則相應的軟鏈接不可用(cat那個軟鏈接檔案,則提示“沒有該檔案或目錄”),符號鏈接可以跨檔案系統,可以跨磁盤磁區,符號鏈接的檔案型別位是l,
比較
硬鏈接
1.只允許檔案鏈接,不允許目錄鏈接;
2.只能在同一個檔案系統范圍內進行,不允許跨檔案系統,
3.洗掉檔案時,如果還有其他鏈接鏈至該檔案,則該檔案不能被洗掉,
軟鏈接
1.訪問速度相對較慢,但適用范圍和靈活性更大,
2.允許目錄鏈接,允許在不同的檔案系統間進行鏈接,這兩個檔案系統可以在同一個計算機上,也可以在不同的計算機上,
3.被鏈接檔案的洗掉和符號鏈接的洗掉是完全獨立的
資料出處
1. 作業系統第八版
2. 作業系統原理、設計及應用,高等教育出版社
3. 電子科技大學計算機學院蒲曉蓉老師作業系統課件
4. 電子科技大學計算機學院薛瑞尼老師作業系統課件
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/141118.html
標籤:Linux
