天天看點

硬連結和軟連接配接

今天将重點介紹Linux中硬連結和軟連接配接,其中會涉及到索引節點(inode),以及cp指令,rm指令,mv指令在執行的過程中對inode的影響。
inode(index node)表中包含檔案系統中所有檔案清單。 這裡所說的檔案系統指的是一個分區内部的檔案系統。不同分區之間的inode節點号是可以重複。 一個節點(索引節點)是在一個表項,包含有關檔案的資訊,包括 檔案類型,權限,UID,GID 連接配接數,指向這個檔案名的連接配接的次數 該檔案的大小和不同的時間戳 指向磁盤上檔案的資料塊的指針 有關檔案的其他資料 通俗的來說可以這樣來了解,每個中國(一個Linux分區,Linux系統可看作全球)公民(分區中的檔案)都有一個唯一的身份證号(inode),而每個人可以有多個名字(檔案名),名字是可以重複的。也就是說,不同的省份(類似與同一個分區下不同的目錄内)可以有叫同樣名字的人,但是每個名字(檔案名)所指向的實體(檔案資料)也是不同的。同一個實體的名字會有多個,去掉其中一個對該實體并不會有影響。同樣如果一個人,沒有名字,他也是客觀存在的。在Linux系統中也是同樣的道理。我們會在文末結合rm指令,cp指令,mv指令來闡述這個原理。
其實了結計算機組成原理的人都會明白,計算機存儲是位址和資料分開存儲的。系統在讀取檔案的過程中,首先是通過系統中記錄的檔案位址找到該檔案的資料塊所在的位置,然後讀取出該資料的相關資訊。
隻不過在Linux 檔案系統的節點表中,不僅僅存儲了該檔案的節點資訊,同時還存儲了該檔案的中繼資料,也就是屬性資訊,這些資訊中包含了檔案的大小,Access time ,Modify time,Change time,等,同時還有檔案的建立者,所有者,檔案的類型等等。這些資料都屬于檔案的中繼資料。
假設資料塊的大小為4K,每個指針都指向一個資料塊。假設有10個直接指針,4個間接塊指針,2個雙重簡介塊指針,一個3重間接指針。 假設一個資料小于4K,一個資料塊就足夠了,此時,隻需要一個直接指針指向一個資料塊就足夠了。 假設一個資料塊為10K,一個資料塊不足夠使用,那麼就使用3個直接指針指向的資料塊就足夠。 間接指針會指向 一個資料塊,這個資料塊不是用來存儲資料的,而是用來存儲指針的,每個指針的大小為4K,那麼這個資料塊可以存儲的指針個數為1024個,那麼這個簡潔指針可以存儲的資料塊的個數就是1024塊 同理,雙重間接指針指向的第一個資料塊也是能夠存儲1024個指針,同時每個指針指向的資料塊也是用來存儲位址的,此時一個雙重間接指針可以存儲的資料塊的個數為1024×1024塊
這樣這個檔案系統能夠存儲的單個檔案的最資料的大小為 10×4K+4×1024×4K+2×1024×1024×4K+1×1024×1024×1024×4K 而由于指針的存在所占用的存儲空間會根據檔案系統的不同而有所不同。
檔案引用一個是inode 号 人是通過檔案名來引用一個檔案 一個目錄是目錄下的檔案名和檔案inode号之間的映射 如果一個檔案建立了硬連結,inode号是一樣的,并且他們指向的是同一段檔案資料。
執行cp指令之後,會在系統中配置設定一個空閑的inode 号,在inode表中生成新的條目,在目錄中建立一個目錄項,将名稱與inode号關聯,拷貝資料生成新的檔案。

執行rm 指令之後, 實際上删除的是該檔案的指針,以及目錄項。

連結數遞減,進而釋放的inode号可以被重用 把資料塊放在空閑清單中 删除目錄項 資料實際上不會馬上被删除,但當另一個檔案使用資料塊 時将被覆寫。
如果此時我們再執行一遍 <code>rm -rf file1ln</code> 檔案系統中将不會再有指針指向 之前file1 和file1ln 所對應的資料塊。但是該資料塊不會立馬被删除掉,如果将來有其他資料需要使用該資料塊時,它将被删除掉。
如果mv指令的目标和源在相同的檔案系統,作為mv 指令 用新的檔案名建立對應新的目錄項 删除舊目錄條目對應的舊的檔案名 不影響inode表(除時間戳)或磁盤上的資料位置:沒有 資料被移動! 如果目标和源在一個不同的檔案系統, mv相當于cp和rm
硬連結 針對一段文本塊建立了兩個名字。 可以通俗的了解為 給一個房間開了兩扇一摸一樣的門,兩扇門是平等的,關閉任何一扇門都不會對從另一扇門進入房間産生影響。 連結建立之後與源檔案路徑是平等的關系。 硬連結不能針對檔案目錄進行建立,因為硬連結指向的是檔案資料本身。
我們在實驗目錄中建立一個檔案f1,同時為其建立一個硬連結。
從結果中可以看出,兩個檔案除了檔案名不一樣以外,其他的全部都一樣,就連a,m,c,時間都一樣的複制過來。這時如果來檢視兩個文本檔案的話,會發現他們是一樣的。同理,我們修改了f1檔案,f1ln檔案也會發生相應的變化。
可以看出兩個檔案的時間都發生變化。當然,如果修改了f1檔案的内容結果還是一樣。
下面我們畫一個示意圖來了解一下
現在我們來執行下面的指令
根據圖示我們可以看出雖然删除了f1(實際上删除的是檔案資料塊上的名字叫做f1的位址),但是我們仍然能夠使用f1ln 檔案來通路到該檔案資料塊。 這就是硬連結的特點。 從另一個角度上說,如果我們把f1 和 f1ln都删除掉之後,表面上我們是删除掉了該檔案,但實際上我們隻是删除掉了該檔案資料塊的兩個硬連結,該檔案資料塊實際上還存儲在硬碟上,直到有新的資料檔案占用該存儲空間後,原來的資料才會被擦除掉。 也正是因為這個原因,我們删除掉的資料,在有限的時間範圍内還是有可能被恢複回來的。
Linux 系統中的軟連接配接可以了解為win 系統中的快捷方式。 一個符号連結指向另一個檔案 ls - l的 顯示連結的名稱和引用的檔案 一個符号連結的内容是它引用檔案的名稱 可以對目錄進行 可以跨分區 指向的是另一個檔案的路徑;其大小為指向的路徑字元串的長度;不增加或減少目标檔案inode的引用計數;
硬連結
軟連接配接
我們在f1所在的目錄下建立一個路徑檔案并進入到該目錄下 然後我們建立一個軟連接配接指向f1 這裡所說的 相對路徑指的是 相對于軟連接配接的路徑,而不是目前工作目錄的路徑。
從上面的結果中可以看出,軟連接配接的檔案類型為 l 也就是連結檔案。軟連接配接的大寫與其指向的路徑字元串長度有關,與源檔案無關。
如果删除了源檔案,該軟連接配接失效.
硬連結的本質是同一個檔案多個檔案名,軟連接配接相當于快捷方式或者說指針 硬連結建立之後,連結數會加1,軟連結不會 硬連結不能針對目錄建立,軟連接配接可以 硬連結不能跨分區,跨硬體,軟連結可以 硬連結源檔案删除了,硬連結不會失效,還是會指向檔案資料,軟連接配接源檔案删除了,軟連接配接失效。 硬連結的中繼資料和源檔案一緻,他們本質上是一個檔案。軟連接配接不是,軟連接配接是連結檔案,大小會發生變化。

     本文轉自Eumenides_s 51CTO部落格,原文連結:http://blog.51cto.com/xiaoshuaigege/1965089,如需轉載請自行聯系原作者

繼續閱讀