訂閱
糾錯(cuò)
加入自媒體

Linux—實(shí)體鏈接與符號(hào)鏈接: ln

在 Linux 下面的鏈接文件有兩種,一種是類(lèi)似 Windows 的捷徑功能的文件,可以讓你快速的鏈接到目標(biāo)文件(或目錄);另一種則是通過(guò)文件系統(tǒng)的 inode 鏈接來(lái)產(chǎn)生新文件名,而不是產(chǎn)生新文件!這種稱為實(shí)體鏈接(hard link)。這兩種玩意兒是完全不一樣的東西呢!現(xiàn)在就分別來(lái)談?wù)劇?/p>

Hard Link (實(shí)體鏈接, 硬式鏈接或?qū)嶋H鏈接);

每個(gè)文件都會(huì)占用一個(gè) inode ,文件內(nèi)容由 inode 的記錄來(lái)指向;

想要讀取該文件,必須要經(jīng)過(guò)目錄記錄的文件名來(lái)指向到正確的 inode 號(hào)碼才能讀取。

也就是說(shuō),其實(shí)文件名只與目錄有關(guān),但是文件內(nèi)容則與 inode 有關(guān)。那么想一想,有沒(méi)有可能有多個(gè)文件名對(duì)應(yīng)到同一個(gè) inode 號(hào)碼呢?有的!那就是 hard link 的由來(lái)。所以簡(jiǎn)單的說(shuō):hard link 只是在某個(gè)目錄下新增一筆文件名鏈接到某 inode 號(hào)碼的關(guān)連記錄而已。舉個(gè)例子來(lái)說(shuō),假設(shè)我系統(tǒng)有個(gè) /root/crontab 他是 /etc/crontab 的實(shí)體鏈接,也就是說(shuō)這兩個(gè)文件名鏈接到同一個(gè) inode ,自然這兩個(gè)文件名的所有相關(guān)信息都會(huì)一模一樣(除了文件名之外)。實(shí)際的情況可以如下所示:

[[email protected] ~]# ll -i/etc/crontab

34474855 -rw-r--r--. 1 root root 451 Jun10  2014 /etc/crontab

[[email protected] ~]# ln/etc/crontab .   <==創(chuàng)建實(shí)體鏈接的指令

[[email protected] ~]# ll -i/etc/crontab crontab

34474855 -rw-r--r--. 2 root root 451 Jun10  2014 crontab

34474855 -rw-r--r--. 2 root root 451 Jun10  2014 /etc/crontab

你可以發(fā)現(xiàn)兩個(gè)文件名都鏈接到 34474855 這個(gè) inode 號(hào)碼,所以您瞧瞧,是否文件的權(quán)限/屬性完全一樣呢?因?yàn)檫@兩個(gè)“文件名”其實(shí)是一模一樣的“文件”啦!而且你也會(huì)發(fā)現(xiàn)第二個(gè)字段由原本的 1 變成 2 了!那個(gè)字段稱為“鏈接”,這個(gè)字段的意義為:“有多少個(gè)文件名鏈接到這個(gè) inode 號(hào)碼”的意思。如果將讀取到正確數(shù)據(jù)的方式畫(huà)成示意圖,就類(lèi)似如下畫(huà)面:

上圖的意思是,你可以通過(guò) 1 或 2 的目錄之 inode 指定的 block 找到兩個(gè)不同的文件名,而不管使用哪個(gè)文件名均可以指到 real 那個(gè) inode 去讀取到最終數(shù)據(jù)!那這樣有什么好處呢?最大的好處就是“安全”!如同上圖中,如果你將任何一個(gè)“文件名”刪除,其實(shí) inode 與 block 都還是存在的!此時(shí)你可以通過(guò)另一個(gè)“文件名”來(lái)讀取到正確的文件數(shù)據(jù)喔!此外,不論你使用哪個(gè)“文件名”來(lái)編輯,最終的結(jié)果都會(huì)寫(xiě)入到相同的 inode 與 block 中,因此均能進(jìn)行數(shù)據(jù)的修改哩!一般來(lái)說(shuō),使用 hard link 設(shè)置鏈接文件時(shí),磁盤(pán)的空間與 inode 的數(shù)目都不會(huì)改變!我們還是由圖 7.2.1 來(lái)看,由圖中可以知道, hard link 只是在某個(gè)目錄下的 block 多寫(xiě)入一個(gè)關(guān)連數(shù)據(jù)而已,既不會(huì)增加 inode 也不會(huì)耗用 block 數(shù)量哩!

Tips hard link 的制作中,其實(shí)還是可能會(huì)改變系統(tǒng)的 block 的,那就是當(dāng)你新增這筆數(shù)據(jù)卻剛好將目錄的 block 填滿時(shí),就可能會(huì)新加一個(gè) block 來(lái)記錄文件名關(guān)連性,而導(dǎo)致磁盤(pán)空間的變化!不過(guò),一般 hard link 所用掉的關(guān)連數(shù)據(jù)量很小,所以通常不會(huì)改變 inode 與磁盤(pán)空間的大小喔!

其實(shí)我們也能夠知道,事實(shí)上 hard link 應(yīng)該僅能在單一文件系統(tǒng)中進(jìn)行的,應(yīng)該是不能夠跨文件系統(tǒng)才對(duì)!因?yàn)榫褪窃谕粋(gè) filesystem 上嘛!所以 hard link 是有限制的:

不能跨 Filesystem;

不能 link 目錄。

不能跨 Filesystem 還好理解,那不能 hard link 到目錄又是怎么回事呢?這是因?yàn)槿绻褂?hard link 鏈接到目錄時(shí),鏈接的數(shù)據(jù)需要連同被鏈接目錄下面的所有數(shù)據(jù)都創(chuàng)建鏈接,舉例來(lái)說(shuō),如果你要將 /etc 使用實(shí)體鏈接創(chuàng)建一個(gè) /etc_hd 的目錄時(shí),那么在 /etc_hd 下面的所有文件名同時(shí)都與 /etc 下面的文件名要?jiǎng)?chuàng)建 hard link 的,而不是僅鏈接到 /etc_hd 與 /etc 而已。并且,未來(lái)如果需要在 /etc_hd 下面創(chuàng)建新文件時(shí),連帶的, /etc 下面的數(shù)據(jù)又得要?jiǎng)?chuàng)建一次 hard link ,因此造成環(huán)境相當(dāng)大的復(fù)雜度。所以啰,目前 hard link 對(duì)于目錄暫時(shí)還是不支持的啊!

Symbolic Link (符號(hào)鏈接,亦即是捷徑)

相對(duì)于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在創(chuàng)建一個(gè)獨(dú)立的文件,而這個(gè)文件會(huì)讓數(shù)據(jù)的讀取指向他 link 的那個(gè)文件的文件名!由于只是利用文件來(lái)做為指向的動(dòng)作,所以,當(dāng)來(lái)源文件被刪除之后,symbolic link 的文件會(huì)“開(kāi)不了”,會(huì)一直說(shuō)“無(wú)法打開(kāi)某文件!”。實(shí)際上就是找不到原始“文件名”而已啦!

舉例來(lái)說(shuō),我們先創(chuàng)建一個(gè)符號(hào)鏈接文件鏈接到 /etc/crontab 去看看:

[[email protected] ~]# ln -s/etc/crontab crontab2

[[email protected] ~]# ll -i/etc/crontab /root/crontab2

34474855 -rw-r--r--. 2 root root 451 Jun10  2014 /etc/crontab

53745909 lrwxrwxrwx. 1 root root  12 Jun 23 22:31 /root/crontab2 ->/etc/crontab

由上表的結(jié)果我們可以知道兩個(gè)文件指向不同的 inode 號(hào)碼,當(dāng)然就是兩個(gè)獨(dú)立的文件存在!而且鏈接文件的重要內(nèi)容就是他會(huì)寫(xiě)上目標(biāo)文件的“文件名”,你可以發(fā)現(xiàn)為什么上表中鏈接文件的大小為 12 Bytes 呢?因?yàn)榧^(-->)右邊的文件名“/etc/crontab”總共有 12 個(gè)英文,每個(gè)英文占用 1 個(gè) Bytes ,所以文件大小就是 12Bytes了!關(guān)于上述的說(shuō)明,我們以如下圖示來(lái)解釋:

由 1 號(hào) inode 讀取到鏈接文件的內(nèi)容僅有文件名,根據(jù)文件名鏈接到正確的目錄去取得目標(biāo)文件的 inode ,最終就能夠讀取到正確的數(shù)據(jù)了。你可以發(fā)現(xiàn)的是,如果目標(biāo)文件(/etc/crontab)被刪除了,那么整個(gè)環(huán)節(jié)就會(huì)無(wú)法繼續(xù)進(jìn)行下去,所以就會(huì)發(fā)生無(wú)法通過(guò)鏈接文件讀取的問(wèn)題了!

這里還是得特別留意,這個(gè) Symbolic Link 與 Windows 的捷徑可以給他劃上等號(hào),由 Symbolic link 所創(chuàng)建的文件為一個(gè)獨(dú)立的新的文件,所以會(huì)占用掉 inode 與 block。

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)