在Linux中,文件由兩部分組成:用戶數(shù)據(jù)(user data)和元數(shù)據(jù)(meta data)雪侥。用戶數(shù)據(jù)碗殷,即文件數(shù)據(jù)塊(data block),是記錄文件真實(shí)內(nèi)容的地方速缨;元數(shù)據(jù)則記錄文件的附加屬性锌妻,如文件的大小、創(chuàng)建時(shí)間旬牲、所有者等仿粹。
在 Linux 中搁吓,文件元數(shù)據(jù)中的 iNode 屬性是文件的唯一標(biāo)識(shí),而并非文件名吭历。在你改變文件名稱之后堕仔,它的 iNode 是保持不變的。也就是說(shuō) Linux 為了方便用戶識(shí)別文件晌区,向用戶提供了更為便捷的文件名得以區(qū)分不同的文件摩骨; Linux 系統(tǒng)則是通過(guò) iNode 來(lái)尋找正確的文件數(shù)據(jù)塊。
在 Linux 中朗若,查看目錄下文件的詳細(xì)信息可用以下命令恼五,其中包含了 iNode 的顯示:
? ~ ls -li
在這個(gè)列表中,第一個(gè)字段就是 iNode 號(hào)哭懈。其中playground文件夾的 iNode 號(hào)為403647灾馒。當(dāng)我們更改 playground 文件名后:
? ~ mv playground myplayground
查看列表會(huì)發(fā)現(xiàn),對(duì)應(yīng)的 iNode 并沒(méi)有發(fā)生變化银伟。
查看具體文件的詳細(xì)信息可用下面的命令:
? ~ stat myplayground
為解決文件的共享使用你虹,Linux 系統(tǒng)引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號(hào)鏈接,即 soft link 或 symbolic link)彤避。
鏈接為 Linux 系統(tǒng)解決了文件的共享使用傅物,還帶來(lái)了隱藏文件路徑、增加權(quán)限安全及節(jié)省存儲(chǔ)等好處琉预。
若一個(gè) iNode 號(hào)對(duì)應(yīng)多個(gè)文件名董饰,則稱這些文件為硬鏈接。換言之圆米,硬鏈接就是同一個(gè)文件使用了多個(gè)別名卒暂。
硬鏈接可由命令 link 或 ln 創(chuàng)建。如下是對(duì)文件 fun 創(chuàng)建硬鏈接娄帖。
- 創(chuàng)建硬鏈接 fun-hard也祠;
- 查看目錄,發(fā)現(xiàn) fun 和 fun-hard 的 iNode 值相同近速,這就說(shuō)明它們是相同的文件诈嘿。另外, fun 和 fun-hard 的第三個(gè)字段都是 2 削葱,這是文件 fun 存在的硬鏈接數(shù)目奖亚。要知道,文件名是由鏈接創(chuàng)建的析砸,所以一個(gè)文件通常至少有一個(gè)鏈接昔字。
硬鏈接的兩大不足:
- 硬鏈接不能引用自身文件系統(tǒng)之外的文件首繁。也就是說(shuō)作郭,鏈接不能引用與該鏈接不在同一磁盤分區(qū)的文件陨囊。
- 硬鏈接無(wú)法引用目錄。
另外所坯,硬鏈接還有其他幾點(diǎn)特性:
- 文件有相同的 inode 及 data block谆扎;
- 只能對(duì)已存在的文件進(jìn)行創(chuàng)建;
- 刪除一個(gè)硬鏈接文件并不影響其他有相同 inode 號(hào)的文件芹助。
軟鏈接(符號(hào)鏈接)就是為了克服硬鏈接的局限性而創(chuàng)建的堂湖。
軟鏈接與硬鏈接不同,若文件用戶數(shù)據(jù)塊中存放的內(nèi)容是另一文件的路徑名的指向状土,則該文件就是軟連接无蜂。
軟鏈接就是一個(gè)普通文件,只是數(shù)據(jù)塊內(nèi)容有點(diǎn)特殊蒙谓。軟鏈接有著自己的 iNode 號(hào)以及用戶數(shù)據(jù)塊斥季。因此軟鏈接的創(chuàng)建與使用沒(méi)有類似硬鏈接的諸多限制:
- 軟鏈接有自己的文件屬性及權(quán)限等;
- 可對(duì)不存在的文件或目錄創(chuàng)建軟鏈接累驮;
- 軟鏈接可交叉文件系統(tǒng)酣倾;
- 軟鏈接可對(duì)文件或目錄創(chuàng)建;
- 創(chuàng)建軟鏈接時(shí)谤专,鏈接計(jì)數(shù) i_nlink 不會(huì)增加躁锡;
- 刪除軟鏈接并不影響被指向的文件,但若被指向的原文件被刪除置侍,則相關(guān)軟連接被稱為死鏈接(即 dangling link映之,若被指向路徑文件被重新創(chuàng)建,死鏈接可恢復(fù)為正常的軟鏈接)蜡坊。