Linux 中的文件分為 Hard Link 和 Symbolic Link 兩種。Hard Link 文件又被稱為硬鏈接文件、實(shí)體鏈接文件,Symbolic Link 文件則常被稱為符號(hào)鏈接、軟鏈接文件。 ln 命令用來在文件之間建立鏈接。在介紹 ln 命令前,讓我們先來搞清楚究竟什么是硬鏈接,什么又是軟鏈接。 Hard Link(硬鏈接)我們知道,在 Linux 系統(tǒng)中,每個(gè)文件對(duì)應(yīng)一個(gè) inode,文件的內(nèi)容在存儲(chǔ)在 inode 指向的 data block 中。要讀取該文件的內(nèi)容,需要通過文件所在的目錄中記錄的文件名找到文件的 inode 號(hào),然后通過 inode 找到存儲(chǔ)文件內(nèi)容的 data block(參考《Linux 文件與目錄》https://www.cnblogs.com/sparkdev/p/11249659.html)。
$ ll -i /etc/crontab 使用 ln 命令在當(dāng)前目錄下創(chuàng)建一個(gè) /etc/crontab 文件的硬鏈接,然后觀察其文件屬性: $ sudo ln /etc/crontab . 這兩個(gè)文件名關(guān)聯(lián)的 inode 號(hào)完全相同,都是 131213,所以它們指向的是同一個(gè)文件。同時(shí)請(qǐng)注意文件屬性中的第三個(gè)字段,由 1 變成了 2。這個(gè)字段被稱為 '鏈接數(shù)',它說明有多少個(gè)文件名鏈接到同一個(gè)文件的 inode。
我們可以通過下圖來理解硬鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式: 硬鏈接的特點(diǎn)
由于硬鏈接只是在目錄中添加了一條包含文件名和 對(duì)應(yīng) inode 的記錄,所以它幾乎不會(huì)消耗額外的磁盤容量。
硬鏈接的局限性
由于這兩個(gè)限制,實(shí)際使用中硬鏈接并沒有軟鏈接使用的廣泛,下面我們看看究竟什么是軟鏈接。 Symbolic Link(軟鏈接)軟鏈接的實(shí)現(xiàn)方式與硬鏈接有本質(zhì)上的不同。創(chuàng)建軟鏈接時(shí)會(huì)創(chuàng)建一個(gè)新的文件(分配一個(gè) inode 和對(duì)應(yīng)的 data block),新文件的 data block 中存儲(chǔ)了目標(biāo)文件的路徑。 $ sudo ln -s /etc/crontab crontab2 第一列,兩個(gè)文件名對(duì)應(yīng)的 inode 不同,說明這是兩個(gè)文件。 第二列顯示的文件權(quán)限也不一樣,這一點(diǎn)和硬鏈接完全不同。注意文件類型被標(biāo)記為 'l',說明這是一個(gè)軟鏈接文件。
我們可以通過下圖來理解軟鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式: 從上圖我們可以看出,軟鏈接文件 crontab2 是一個(gè)實(shí)實(shí)在在的文件,有自己的 inode 和 data block。但是它的 data block 中保存的是目標(biāo)文件的地址:/etc/crontab。 像 open() 這樣的 API 能夠識(shí)別出軟鏈接,并根據(jù) data block 中的目標(biāo)文件徑把操作重定向到目標(biāo)文件上。 可以鏈接目錄是軟鏈接的一大優(yōu)勢(shì),創(chuàng)建目錄鏈接的方式和普通文件一樣:
此時(shí)進(jìn)入 testbin 目錄和進(jìn)入 /bin 目錄是一樣的。 更厲害的是,還可以跨文件系統(tǒng)創(chuàng)建軟鏈接! 刪除源文件
刪除原文件后,操作鏈接文件時(shí)的提示是:'No such file or directory'。 文件的鏈接數(shù)從上文中的示例我們可以看到,當(dāng)創(chuàng)建硬鏈接文件時(shí),文件的鏈接數(shù)會(huì)增加 1,而創(chuàng)建軟鏈接時(shí)文件的鏈接數(shù)卻不發(fā)生變化。
$ mkdir /home/nick/testdir 新建的空目錄有兩個(gè)硬鏈接,分別是: /home/nick/testdir 而 /home/nick/testdir 目錄下還有一個(gè)指向其父目錄的硬鏈接:/home/nick/testdir/.. 也就是說當(dāng)我們創(chuàng)建一個(gè)目錄時(shí),其父目錄的硬鏈接數(shù)會(huì)增加 1。 ln 命令ln 命令用來在文件之間建立鏈接,其的常用方式為:
參考:
●編號(hào)825,輸入編號(hào)直達(dá)本文 ●輸入m獲取文章目錄 |
|