這篇文章主要介紹“Linux下的鏈接文件是什么”,在日常操作中,相信很多人在Linux下的鏈接文件是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對大家解答”Linux下的鏈接文件是什么”的疑惑有所幫助!接下來(lái),請跟著(zhù)小編一起來(lái)學(xué)習吧!
幾個(gè)基本概念
Linux下的鏈接文件可以分為硬鏈接(hard link)與軟鏈接(soft link)。要理解它們,必須先要理解幾個(gè)基本概念。
inode
文件除了純數據本身之外,還必須包含有對這些純數據的管理信息,如文件名、訪(fǎng)問(wèn)權限、文件的屬主以及該文件的數據所對應的磁盤(pán)塊等等,這些管理信息稱(chēng)之為元數據(mata data),保存在文件的inode節點(diǎn)之中。我們可以通過(guò)stat命令查看一個(gè)文件的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文件的元數據信息。ls -l命令也會(huì )列出一些文件的元數據信息(由左至右分別為:權限、硬鏈接數、屬主、屬組、文件大小、最近更改時(shí)間、文件名),但相比之下,stat命令輸出的信息更加完整。我們注意到,stat輸出的信息中,文件有三個(gè)時(shí)間戳:最近訪(fǎng)問(wèn)、最近更改和最近改動(dòng),對應于英文分別為Access、Modify和Change。 Access time比較好理解,當每次訪(fǎng)問(wèn)這個(gè)文件的數據(注意,不是元數據),這個(gè)時(shí)間就會(huì )更新。比如用cat或者more命令讀取文件內容時(shí),會(huì )更新access time,而用ls或者stat命令,由于只是訪(fǎng)問(wèn)了文件的inode,所以不會(huì )更新access time值。Modify time是文件數據最后一次被修改時(shí)間,比如用vim編輯文件后保存文件,此時(shí)就會(huì )更新該文件modify time。Change time是文件元數據(即inode)最后一次被修改的時(shí)間,比如用chown命令修改文件的屬主,此時(shí)就會(huì )更新文件的change time。
其實(shí)最初當我們創(chuàng )建分區并用mkfs.ext4等命令創(chuàng )建文系統的時(shí)候,就已經(jīng)在文件系統的固定區域保留了inode節點(diǎn)區。我們可以通過(guò)df -i命令查看某文件系統inode節點(diǎn)區域的大小及使用情況:
# df -ih /dev/mapper/pdc_bcfaffjfaj2 文件系統 Inode 已用(I) 可用(I) 已用(I)% 掛載點(diǎn) /dev/mapper/pdc_bcfaffjfaj2 18M 127K 18M 1% /home
可以看到,在筆者的Linux Mint17.3系統中,分區/dev/mapper/pdc_bcfaffjfaj2共保留了18M的inode區域,這個(gè)區域目前已經(jīng)使用了127K。有沒(méi)有可能出現某分區尚有空間而inode區域已用完的情況呢?有的。當小文件特別多的時(shí)候就會(huì )出現這種情況!這個(gè)時(shí)候即使文件系統還有空間可用,但我們仍然無(wú)法繼續在這個(gè)文件系統內創(chuàng )建新的文件了。那假如在我的應用環(huán)境中真的小文件非常多該怎么辦?其實(shí)我們在建立ext4文件系統時(shí)候是可以手動(dòng)指定inode區域所占的比例大小的,可以man mkfs.ext4查看相關(guān)的參數和選項,這里不再詳述。
剛才用stat查看文件的inode信息時(shí),我們看到輸出的信息中有一行Inode: 137143,這個(gè)是/etc/passwd文件的inode號。每個(gè)inode都有一個(gè)全文件系統唯一的inode號,操作系統內核正是通過(guò)inode號而非文件名來(lái)識別不同的文件。文件名僅僅是為了方便用戶(hù)使用而已,內核是通過(guò)文件名找到inode,然后通過(guò)inode訪(fǎng)問(wèn)實(shí)際文件數據的。有沒(méi)有可能有多個(gè)文件名對應于同一個(gè)inode呢?有的,這樣就產(chǎn)生了所謂硬鏈接文件。
dentry
雖然每個(gè)文件對應了唯一的inode號,但inode號是雜亂而毫無(wú)意義的,不方面用戶(hù)記憶和使用,我們希望對每個(gè)文件取一個(gè)有意義的文件名?,F代文件系統提供的一個(gè)基本功能是按名存取,所以我們還需要建立文件名到inode號的對應,這就引出了目錄項(directory entry即dentry)的概念。在Linux文件系統中有一類(lèi)特殊的文件稱(chēng)為“目錄”,目錄就保存了該目錄下所有文件的文件名到inode號的對應關(guān)系,這里的每個(gè)對應關(guān)系就稱(chēng)為一個(gè)dentry。而Linux把所有的文件和目錄構建成了一個(gè)倒立的樹(shù)狀結構,這樣,我們只要確定了根目錄的inode號,就可以對整個(gè)文件系統進(jìn)行按名存取了。
hard link
硬鏈接的實(shí)質(zhì)是現有文件在目錄樹(shù)中的另一個(gè)入口。也就是說(shuō),硬鏈接與原文件是分居于不同或相同目錄下的的dentry而已,它們指向同一個(gè)inode,對應于相同的磁盤(pán)數據塊(data block),具有相同的訪(fǎng)問(wèn)權限、屬性等。簡(jiǎn)而言之,硬鏈接其實(shí)就是給現有的文件起了一個(gè)別名。如果把文件系統比喻成一本書(shū)的話(huà),硬鏈接就是在書(shū)本的目錄中,有兩個(gè)目錄項指向了同一頁(yè)碼的同一章節。
硬鏈接的優(yōu)點(diǎn)是幾乎不占磁盤(pán)空間(因為僅僅是增加了一個(gè)目錄項而已),但是這一優(yōu)點(diǎn)相對于軟鏈接其實(shí)并不明顯(因為軟鏈接占用的磁盤(pán)空間也很少)。另外,硬鏈接有以下一些局限:1、不能跨文件系統創(chuàng )建硬鏈接。原因很簡(jiǎn)單,inode號只有在一個(gè)文件系統內才能保證是唯一的,如果跨越文件系統則inode號就可能重復。2、不能對目錄創(chuàng )建硬鏈接。原因我在稍后解釋。正因為硬鏈接的這些局限,加之軟鏈接更加易于管理,所以軟鏈接更加常用。這一點(diǎn)在本文中舉的例子也可以看出,幾乎都是軟鏈接的例子。
soft link
軟鏈接又稱(chēng)為符號鏈接(symbolic link),簡(jiǎn)寫(xiě)為“symlink”。與硬鏈接僅僅是一個(gè)目錄項不同,軟連接本身也是文件,不過(guò)這個(gè)文件的內容是另一個(gè)文件名的指針。當Linux訪(fǎng)問(wèn)軟鏈接時(shí),它會(huì )循著(zhù)指針找出含有實(shí)際數據的目標文件。我們還以書(shū)本來(lái)打比方,軟鏈接是書(shū)本里的某一章節,不過(guò)這一章節什么內容都沒(méi)有,只有一行字“轉某某章某某頁(yè)”。
軟鏈接可以跨越文件系統指向另一個(gè)分區的文件,甚至可以跨越主機指向遠程主機的一個(gè)文件,也可以指向目錄。在ls -l輸出的文件列表中,第一個(gè)字段有“l(fā)”字樣者表示該文件是符號鏈接。
$ ls -l total 0 lrwxrwxrwx 1 wjm wjm 11 Aug 10 00:51 hh -> /etc/passwd
我們看到,軟鏈接的權限為777,即所有權限都是開(kāi)放的,實(shí)際上你也無(wú)法使用chmod命令修改其權限,但是實(shí)際文件的保護權限仍然起作用。
另外,符號鏈接可以指向不存在的文件(可能是原來(lái)指向的文件被刪除了,或者指向的文件系統尚未掛載,或者最初建立該符號鏈接的時(shí)候就指向了一個(gè)不存在的文件等等),我們稱(chēng)這種狀態(tài)為“斷裂”(broken)。與之相對的是,硬鏈接是不能指向一個(gè)不存在的文件的。
使用鏈接有何好處?
我們在此總結使用鏈接文件的以下幾個(gè)的好處:
保持軟件的兼容性
例如,在RHEL6中我們看下面這條命令的輸出:
$ ls -l /bin/sh lrwxrwxrwx. 1 root root 4 Jul 15 11:41 /bin/sh -> bash
我們看到,/bin/sh文件其實(shí)是一個(gè)指向/bin/bash的符號鏈接。為什么要這樣設計?因為幾乎所有的shell script的第一行都是下面這樣:
#!/bin/sh
“#!”符號表示該行指定該腳本所用的解釋器。#!/bin/sh表示使用Bourne Shell作為解釋器,這是一個(gè)早期的Shell。在現代的Linux發(fā)行版中通常采用Bourne Again Shell即bash,bash是對sh的改進(jìn)和增強,而早期的Bourne Shell在系統的中根本不存在。為了能夠順利的運行腳本而不必修改shell script,我們只需要創(chuàng )建一個(gè)軟鏈接/bin/sh讓其指向/bin/bash。如此一來(lái),就可以讓bash來(lái)解釋原本針對Bourne Shell編寫(xiě)的腳本了。
方便軟件的使用
比如我們安裝了一個(gè)大型軟件Matlab,它可能默認安裝在/usr/opt/Matlab目錄下,它的可執行文件位置在/usr/opt/Matlab/bin目錄下,除非你在這個(gè)路徑加入到PATH環(huán)境變量里,否則每次運行這個(gè)軟件你都需要輸入一長(cháng)串的路徑很不方便。你還可以這樣做:
$ ln -s /usr/opt/Matlab/bin/matlab ~/bin/matlab
通過(guò)在你的~/bin下創(chuàng )建一個(gè)符號鏈接(~/bin系統默認已經(jīng)包含在PATH環(huán)境變量里的),今后在命令行下無(wú)需輸入完整路徑,只需輸入matlab即可。
維持舊的操作習慣
比如在SuSE中,啟動(dòng)腳本的位置是放在/etc/init.d目錄下,而在RedHat的發(fā)行版中,是放在/etc/init.d/rc.d目錄下。為了避免因為從SuSE轉換到RedHat系統而導致管理員找不到位置的情況,我們可以創(chuàng )建一個(gè)符號鏈接/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
方便系統管理
最讓人印象深刻的一個(gè)例子應該是/etc/rc.d/rcX.d目錄下的符號鏈接了(X為0~7數字)。
$ 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/目錄下有許多用于啟動(dòng)、停止系統服務(wù)的腳本,如sshd、crond等。這些腳本可以接受一個(gè)參數,代表要啟動(dòng)(start)或停止(stop)服務(wù)。為了決定在某個(gè)運行級別運行哪些腳本及傳遞給這些腳本哪些參數,RedHat設計了一個(gè)額外的目錄機制,即rc0.d到rc6.d的7個(gè)目錄,每個(gè)目錄對應一個(gè)運行級別。如果在某運行級別下需要啟動(dòng)某服務(wù)或者需要停止某服務(wù),就在對應的rcX.d目錄下建立一個(gè)符號鏈接,指向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 ... ....
這里列出了在運行級3下需要運行的服務(wù)腳本及對應的參數,其中符號鏈接的第一個(gè)字母S和K分別表示傳遞參數start和stop,后面跟著(zhù)的兩位數字表示腳本運行的先后順序。這樣一來(lái),只要在rcX.d目錄下新增或者移除鏈接,就可以控制各個(gè)runlevel需要運行哪些服務(wù)腳本;而如果需要修改某個(gè)服務(wù)腳本,只需要編輯init.d/目錄下的文件(“本尊”),而它可以影響所有rcX.d目錄下的軟鏈接(“分身”)。這是多么簡(jiǎn)潔而巧妙的設計!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站