主頁 > 知識庫 > Linux下的鏈接文件詳解

Linux下的鏈接文件詳解

熱門標(biāo)簽:百度地圖標(biāo)注開鎖電話 安陽百應(yīng)電銷機(jī)器人加盟 百度中國地圖標(biāo)注中心 潮州地圖標(biāo)注 依蘭縣地圖標(biāo)注app 山東企業(yè)電銷機(jī)器人價格 pageadm實(shí)現(xiàn)地圖標(biāo)注 公司400電話辦理價格 琿春市地圖標(biāo)注app

幾個基本概念

Linux下的鏈接文件可以分為硬鏈接(hard link)與軟鏈接(soft link)。要理解它們,必須先要理解幾個基本概念。

inode

文件除了純數(shù)據(jù)本身之外,還必須包含有對這些純數(shù)據(jù)的管理信息,如文件名、訪問權(quán)限、文件的屬主以及該文件的數(shù)據(jù)所對應(yīng)的磁盤塊等等,這些管理信息稱之為元數(shù)據(jù)(mata data),保存在文件的inode節(jié)點(diǎn)之中。我們可以通過stat命令查看一個文件的inode信息:

$ stat /etc/passwd
  File: "/etc/passwd"
  Size: 936             Blocks: 8          IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 137143      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-08-05 23:01:39.905999995 +0800
Modify: 2016-07-15 16:36:12.802999997 +0800
Change: 2016-07-15 16:36:12.809000014 +0800

$ ls -l /etc/passwd
-rw-r--r-- 1 root root 936 7月  15 16:36 /etc/passwd

這里我們查看了/etc/passwd文件的元數(shù)據(jù)信息。ls -l命令也會列出一些文件的元數(shù)據(jù)信息(由左至右分別為:權(quán)限、硬鏈接數(shù)、屬主、屬組、文件大小、最近更改時間、文件名),但相比之下,stat命令輸出的信息更加完整。我們注意到,stat輸出的信息中,文件有三個時間戳:最近訪問、最近更改和最近改動,對應(yīng)于英文分別為Access、Modify和Change。 Access time比較好理解,當(dāng)每次訪問這個文件的數(shù)據(jù)(注意,不是元數(shù)據(jù)),這個時間就會更新。比如用cat或者more命令讀取文件內(nèi)容時,會更新access time,而用ls或者stat命令,由于只是訪問了文件的inode,所以不會更新access time值。Modify time是文件數(shù)據(jù)最后一次被修改時間,比如用vim編輯文件后保存文件,此時就會更新該文件modify time。Change time是文件元數(shù)據(jù)(即inode)最后一次被修改的時間,比如用chown命令修改文件的屬主,此時就會更新文件的change time。

其實(shí)最初當(dāng)我們創(chuàng)建分區(qū)并用mkfs.ext4等命令創(chuàng)建文系統(tǒng)的時候,就已經(jīng)在文件系統(tǒng)的固定區(qū)域保留了inode節(jié)點(diǎn)區(qū)。我們可以通過df -i命令查看某文件系統(tǒng)inode節(jié)點(diǎn)區(qū)域的大小及使用情況:

# df -ih /dev/mapper/pdc_bcfaffjfaj2

文件系統(tǒng)                    Inode 已用(I) 可用(I) 已用(I)% 掛載點(diǎn)                                                            

/dev/mapper/pdc_bcfaffjfaj2   18M    127K     18M       1% /home   

可以看到,在筆者的Linux Mint17.3系統(tǒng)中,分區(qū)/dev/mapper/pdc_bcfaffjfaj2共保留了18M的inode區(qū)域,這個區(qū)域目前已經(jīng)使用了127K。有沒有可能出現(xiàn)某分區(qū)尚有空間而inode區(qū)域已用完的情況呢?有的。當(dāng)小文件特別多的時候就會出現(xiàn)這種情況!這個時候即使文件系統(tǒng)還有空間可用,但我們?nèi)匀粺o法繼續(xù)在這個文件系統(tǒng)內(nèi)創(chuàng)建新的文件了。那假如在我的應(yīng)用環(huán)境中真的小文件非常多該怎么辦?其實(shí)我們在建立ext4文件系統(tǒng)時候是可以手動指定inode區(qū)域所占的比例大小的,可以man mkfs.ext4查看相關(guān)的參數(shù)和選項(xiàng),這里不再詳述。

剛才用stat查看文件的inode信息時,我們看到輸出的信息中有一行Inode: 137143,這個是/etc/passwd文件的inode號。每個inode都有一個全文件系統(tǒng)唯一的inode號,操作系統(tǒng)內(nèi)核正是通過inode號而非文件名來識別不同的文件。文件名僅僅是為了方便用戶使用而已,內(nèi)核是通過文件名找到inode,然后通過inode訪問實(shí)際文件數(shù)據(jù)的。有沒有可能有多個文件名對應(yīng)于同一個inode呢?有的,這樣就產(chǎn)生了所謂硬鏈接文件。

dentry

雖然每個文件對應(yīng)了唯一的inode號,但inode號是雜亂而毫無意義的,不方面用戶記憶和使用,我們希望對每個文件取一個有意義的文件名。現(xiàn)代文件系統(tǒng)提供的一個基本功能是按名存取,所以我們還需要建立文件名到inode號的對應(yīng),這就引出了目錄項(xiàng)(directory entry即dentry)的概念。在Linux文件系統(tǒng)中有一類特殊的文件稱為“目錄”,目錄就保存了該目錄下所有文件的文件名到inode號的對應(yīng)關(guān)系,這里的每個對應(yīng)關(guān)系就稱為一個dentry。而Linux把所有的文件和目錄構(gòu)建成了一個倒立的樹狀結(jié)構(gòu),這樣,我們只要確定了根目錄的inode號,就可以對整個文件系統(tǒng)進(jìn)行按名存取了。

hard link

硬鏈接的實(shí)質(zhì)是現(xiàn)有文件在目錄樹中的另一個入口。也就是說,硬鏈接與原文件是分居于不同或相同目錄下的的dentry而已,它們指向同一個inode,對應(yīng)于相同的磁盤數(shù)據(jù)塊(data block),具有相同的訪問權(quán)限、屬性等。簡而言之,硬鏈接其實(shí)就是給現(xiàn)有的文件起了一個別名。如果把文件系統(tǒng)比喻成一本書的話,硬鏈接就是在書本的目錄中,有兩個目錄項(xiàng)指向了同一頁碼的同一章節(jié)。

硬鏈接的優(yōu)點(diǎn)是幾乎不占磁盤空間(因?yàn)閮H僅是增加了一個目錄項(xiàng)而已),但是這一優(yōu)點(diǎn)相對于軟鏈接其實(shí)并不明顯(因?yàn)檐涙溄诱加玫拇疟P空間也很少)。另外,硬鏈接有以下一些局限:1、不能跨文件系統(tǒng)創(chuàng)建硬鏈接。原因很簡單,inode號只有在一個文件系統(tǒng)內(nèi)才能保證是唯一的,如果跨越文件系統(tǒng)則inode號就可能重復(fù)。2、不能對目錄創(chuàng)建硬鏈接。原因我在稍后解釋。正因?yàn)橛叉溄拥倪@些局限,加之軟鏈接更加易于管理,所以軟鏈接更加常用。這一點(diǎn)在本文中舉的例子也可以看出,幾乎都是軟鏈接的例子。

soft link

軟鏈接又稱為符號鏈接(symbolic link),簡寫為“symlink”。與硬鏈接僅僅是一個目錄項(xiàng)不同,軟連接本身也是文件,不過這個文件的內(nèi)容是另一個文件名的指針。當(dāng)Linux訪問軟鏈接時,它會循著指針找出含有實(shí)際數(shù)據(jù)的目標(biāo)文件。我們還以書本來打比方,軟鏈接是書本里的某一章節(jié),不過這一章節(jié)什么內(nèi)容都沒有,只有一行字“轉(zhuǎn)某某章某某頁”。

軟鏈接可以跨越文件系統(tǒng)指向另一個分區(qū)的文件,甚至可以跨越主機(jī)指向遠(yuǎn)程主機(jī)的一個文件,也可以指向目錄。在ls -l輸出的文件列表中,第一個字段有“l”字樣者表示該文件是符號鏈接。

$ ls -l
total 0
lrwxrwxrwx 1 wjm wjm 11 Aug 10 00:51 hh -> /etc/passwd

我們看到,軟鏈接的權(quán)限為777,即所有權(quán)限都是開放的,實(shí)際上你也無法使用chmod命令修改其權(quán)限,但是實(shí)際文件的保護(hù)權(quán)限仍然起作用。

另外,符號鏈接可以指向不存在的文件(可能是原來指向的文件被刪除了,或者指向的文件系統(tǒng)尚未掛載,或者最初建立該符號鏈接的時候就指向了一個不存在的文件等等),我們稱這種狀態(tài)為“斷裂”(broken)。與之相對的是,硬鏈接是不能指向一個不存在的文件的。

使用鏈接有何好處?

我們在此總結(jié)使用鏈接文件的以下幾個的好處:

保持軟件的兼容性
例如,在RHEL6中我們看下面這條命令的輸出:

$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 Jul 15 11:41 /bin/sh -> bash

我們看到,/bin/sh文件其實(shí)是一個指向/bin/bash的符號鏈接。為什么要這樣設(shè)計(jì)?因?yàn)閹缀跛械膕hell script的第一行都是下面這樣:

#!/bin/sh

“#!”符號表示該行指定該腳本所用的解釋器。#!/bin/sh表示使用Bourne Shell作為解釋器,這是一個早期的Shell。在現(xiàn)代的Linux發(fā)行版中通常采用Bourne Again Shell即bash,bash是對sh的改進(jìn)和增強(qiáng),而早期的Bourne Shell在系統(tǒng)的中根本不存在。為了能夠順利的運(yùn)行腳本而不必修改shell script,我們只需要創(chuàng)建一個軟鏈接/bin/sh讓其指向/bin/bash。如此一來,就可以讓bash來解釋原本針對Bourne Shell編寫的腳本了。

方便軟件的使用
比如我們安裝了一個大型軟件Matlab,它可能默認(rèn)安裝在/usr/opt/Matlab目錄下,它的可執(zhí)行文件位置在/usr/opt/Matlab/bin目錄下,除非你在這個路徑加入到PATH環(huán)境變量里,否則每次運(yùn)行這個軟件你都需要輸入一長串的路徑很不方便。你還可以這樣做:

$ ln -s /usr/opt/Matlab/bin/matlab ~/bin/matlab

通過在你的~/bin下創(chuàng)建一個符號鏈接(~/bin系統(tǒng)默認(rèn)已經(jīng)包含在PATH環(huán)境變量里的),今后在命令行下無需輸入完整路徑,只需輸入matlab即可。

維持舊的操作習(xí)慣
比如在SuSE中,啟動腳本的位置是放在/etc/init.d目錄下,而在RedHat的發(fā)行版中,是放在/etc/init.d/rc.d目錄下。為了避免因?yàn)閺腟uSE轉(zhuǎn)換到RedHat系統(tǒng)而導(dǎo)致管理員找不到位置的情況,我們可以創(chuàng)建一個符號鏈接/etc/init.d使其指向/etc/init.d/rc.d即可。事實(shí)上,RedHat發(fā)行版也正是這樣做的:

$ ls -ld /etc/init.d/
lrwxrwxrwx. 1 root root 11 Jul 15 11:41 init.d -> rc.d/init.d

方便系統(tǒng)管理
最讓人印象深刻的一個例子應(yīng)該是/etc/rc.d/rcX.d目錄下的符號鏈接了(X為0~7數(shù)字)。

$ ls -l /etc/rc.d/
total 60
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 init.d
-rwxr-xr-x. 1 root root  2617 Nov 23  2013 rc
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc0.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc1.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc2.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc3.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc4.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc5.d
drwxr-xr-x. 2 root root  4096 Jul 15 16:36 rc6.d
-rwxr-xr-x. 1 root root   220 Nov 23  2013 rc.local
-rwxr-xr-x. 1 root root 19688 Nov 23  2013 rc.sysinit

在init.d/目錄下有許多用于啟動、停止系統(tǒng)服務(wù)的腳本,如sshd、crond等。這些腳本可以接受一個參數(shù),代表要啟動(start)或停止(stop)服務(wù)。為了決定在某個運(yùn)行級別運(yùn)行哪些腳本及傳遞給這些腳本哪些參數(shù),RedHat設(shè)計(jì)了一個額外的目錄機(jī)制,即rc0.d到rc6.d的7個目錄,每個目錄對應(yīng)一個運(yùn)行級別。如果在某運(yùn)行級別下需要啟動某服務(wù)或者需要停止某服務(wù),就在對應(yīng)的rcX.d目錄下建立一個符號鏈接,指向init.d/目錄下的腳本。如:

$ ls -l /etc/rc.d/rc3.d
total 0
lrwxrwxrwx. 1 root root 19 Jul 15 11:42 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 20 Jul 15 11:42 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 21 Jul 15 11:42 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 15 Jul 15 11:42 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 22 Jul 15 11:44 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 19 Jul 15 11:42 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Jul 15 11:42 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 Jul 15 11:42 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 Jul 15 11:44 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 Jul 15 11:42 S12rsyslog -> ../init.d/rsyslog
... ....

這里列出了在運(yùn)行級3下需要運(yùn)行的服務(wù)腳本及對應(yīng)的參數(shù),其中符號鏈接的第一個字母S和K分別表示傳遞參數(shù)start和stop,后面跟著的兩位數(shù)字表示腳本運(yùn)行的先后順序。這樣一來,只要在rcX.d目錄下新增或者移除鏈接,就可以控制各個runlevel需要運(yùn)行哪些服務(wù)腳本;而如果需要修改某個服務(wù)腳本,只需要編輯init.d/目錄下的文件(“本尊”),而它可以影響所有rcX.d目錄下的軟鏈接(“分身”)。這是多么簡潔而巧妙的設(shè)計(jì)!

上一頁12 下一頁 閱讀全文

標(biāo)簽:晉中 林芝 連云港 常德 呼和浩特 香港 公主嶺 三明

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux下的鏈接文件詳解》,本文關(guān)鍵詞  Linux,下,的,鏈接,文件,詳解,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux下的鏈接文件詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux下的鏈接文件詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章