Linux中軟、硬鏈接那些事兒

軟鏈接與硬鏈接

上一篇文章已經向大家介紹了Linux系統中文件目錄結構,見http://vinsent.blog.51cto.com/13116656/1959522 。基於次,這篇博客向大家介紹Linux文件系統中的軟連接(也稱:符號鏈接)和硬鏈接;主要包括軟、硬連接的概念,軟連接與硬鏈接的區別以及如何創建軟、硬鏈接。該文章中引用了https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/  中的一些概念;如有侵權,敬請相告!立即刪除。


一、相對路徑與絕對路徑

在介紹軟硬鏈接之前,先向大家介紹相對路徑與絕對路徑;我們在Linux中進行目錄切換,以及系統自帶的大歲數庫文件均是以相對路徑形成的符號鏈接文件來實現的。而我們的操作大多數時候接觸的都是硬鏈接,像切換目錄(cd /etc/sysconfig/network-scripts/)、掛載文件(mount /dev/sdxx /mnt/)等等。

1、絕對路徑

絕對路徑即“路徑絕對”,說明只有唯一的路徑來到達我們的“目的地”。絕對路徑是從根“/”開始的(如 /etc/rc.d/inittab)即只要一個路徑是從根開始的,那麼毫無疑問,它一定是絕對路徑。例如:

[ root@vinsent ~ ]#
[ root@vinsent ~ ]#pwd             # 查看當前目錄
/root
[ root@vinsent ~ ]#cd /etc/rc.d/init.d/  # 以絕對路徑進入/etc/rc.d/init.d/目錄
[ root@vinsent init.d ]#ls
functions  netconsole  network  README
[ root@vinsent init.d ]#pwd         # pwd 查看當前目錄爲/etc/rc.d/init.d/
/etc/rc.d/init.d
[ root@vinsent init.d ]#

2、相對路徑

相對路徑:顧名思義該路徑是相對的,相對於某指定目錄或當前雖在目錄。相對路徑是以.或 ..開始的,.表示用戶當前操作所處的位置,而..表示上級目錄;在路徑中,.表示用戶當前所處的目錄,而 ..上級目錄,要把.和..當做目錄來看。例如:

[ root@vinsent init.d ]#
[ root@vinsent init.d ]#pwd      # 首先進入到了/etc/rc.d/init.d目錄下,pwd查看當前目錄
/etc/rc.d/init.d
[ root@vinsent init.d ]#cd ..     # ..代表上級目錄,cd ..進入到/etc/rc.d目錄下
[ root@vinsent rc.d ]#pwd
/etc/rc.d
[ root@vinsent rc.d ]#cd ..      
[ root@vinsent etc ]#pwd
/etc
[ root@vinsent etc ]#cd ../boot     # 從當前目錄切換到boot目錄下
[ root@vinsent boot ]#
[ root@vinsent boot ]#pwd          # pwd 查看當前目錄爲/boot
/boot
[ root@vinsent boot ]#

二、軟連接與硬鏈接

1、硬鏈接

硬鏈接是通過索引節點進行的鏈接。在Linux中,多個文件指向同一個索引節點是允許的,像這樣的鏈接就是硬鏈接。硬鏈接只能在同一文件系統中的文件之間進行鏈接,不能對目錄進行創建。如果刪除硬鏈接對應的源文件,則硬鏈接文件仍然存在,而且保存了原有的內容,這樣可以起到防止因爲誤操作而錯誤刪除文件的作用。 由於硬鏈接是有着相同 inode 號僅文件名不同的文件,因此,刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件;圖解硬鏈接:

wKiom1mlhhuiyAyqAAAq3pg3kFM332.jpg-wh_50

2、軟鏈接

也稱符號鏈接與硬鏈接不同,文件用戶數據塊中存放的內容是另一文件的路徑名的指向。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接可對文件或目錄創建。 軟鏈接主要應用於以下兩個方面:一是方便管理,例如可以把一個複雜路徑下的文件鏈接到一個簡單路徑下方便用戶訪問;另一方面就是解決文件系統磁盤空間不足的情況。例如某個文件文件系統空間已經用完了,但是現在必須在該文件系統下創建一個新的目錄並存儲大量的文件,那麼可以把另一個剩餘空間較多的文件系統中的目錄鏈接到該文件系統中,這樣就可以很好的解決空間不足問題。刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接就變成了死鏈接。 使用-s選項的ln命令即可創建符號鏈接。下圖是軟連接的工作過程:

wKiom1mlhi_A2cWDAAAsJnBdtY8703.jpg-wh_50

3、軟連接與硬鏈接的異同

從軟連接與硬鏈接的概念我們便能感受到這兩者的不同;下面對其異同加以總結。由於硬鏈接是有着相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:

  • 文件有相同的 inode 及 data block;

  • 只能對已存在的文件進行創建;

  • 不能交叉文件系統進行硬鏈接的創建;

  • 不能對目錄進行創建,只可對文件創建;

  • 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件;

軟鏈接與硬鏈接不同,若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接有着自己的 inode 號以及用戶數據塊因此軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:

  • 軟鏈接有自己的文件屬性及權限等;

  • 可對不存在的文件或目錄創建軟鏈接;

  • 軟鏈接可交叉文件系統;

  • 軟鏈接可對文件或目錄創建;

  • 創建軟鏈接時,鏈接計數 i_nlink 不會增加;

  • 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱爲死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復爲正常的軟鏈接)。

4、創建軟鏈接和硬鏈接

介紹完了軟連接與硬鏈接的概念以及其異同;接下帶着大家一步一步創建軟、硬鏈接,從實驗中領會軟、硬鏈接的不同。硬鏈接的使用“ln”來實現;軟連接使用“ln -s”來實現。

#------------實驗環境準備-----------#

[ root@vinsent ~ ]#
[ root@vinsent ~ ]#rm -rf /app/*     # 爲了不影響實驗,我們清空/app/目錄
[ root@vinsent ~ ]#cd /app             # 切換到/app目錄
[ root@vinsent app ]#ls
[ root@vinsent app ]#pwd
/app
[ root@vinsent app ]#mkdir -p /app/{a/{x/{m,n/k},y},b,c/{q,w/{e/yy,r}},d}  # 創建若干目錄
[ root@vinsent app ]#tree /app         # tree查看/app的目錄樹結構
/app
├── a
│   ├── x
│   │   ├── m
│   │   └── n
│   │       └── k
│   └── y
├── b
├── c
│   ├── q
│   └── w
│       ├── e
│       │   └── yy
│       └── r
└── d

14 directories, 0 files
[ root@vinsent app ]#
[ root@vinsent app ]#cd /app/a/x/n/k       # 進入到/app/a/x/n/k 創建兩個文件
[ root@vinsent k ]#touch 1.txt
[ root@vinsent k ]#touch 2.txt
[ root@vinsent k ]#cd /app/c/w/e/yy         # 進入到/app/c/w/e/yy 創建兩個文件
[ root@vinsent yy ]#touch 11.txt
[ root@vinsent yy ]#touch 22.txt

#------------創建硬鏈接--------------#
[ root@vinsent ~ ]#ln /app/c/w/e/yy/11.txt /app/a/x/n/k/1bak.txt  # 創建硬鏈接
[ root@vinsent yy ]#ll
total 0
-rw-r--r--. 2 root root 0 Aug 28 21:43 11.txt   # 節點數增加到2
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ root@vinsent yy ]#cd /app/a/x/n/k/
[ root@vinsent k ]#ll
total 0
-rw-r--r--. 2 root root 0 Aug 28 21:43 1bak.txt  # 節點數增加到2 說明硬鏈接創建成功
-rw-r--r--. 1 root root 0 Aug 28 21:42 1.txt
-rw-r--r--. 1 root root 0 Aug 28 21:42 2.txt
[ root@vinsent k ]#echo 123634124 > 1bak.txt     # 改變文件 1bak.txt 內容
[ root@vinsent k ]#cat 1bak.txt
123634124
[ root@vinsent k ]#rm -rf 1bak.txt           # 刪除該鏈接文件
[ root@vinsent k ]#cd /app/c/w/e/yy           # 切換到/app/c/w/e/yy目錄下
[ root@vinsent yy ]#ll                  # 查看節點數減少
total 4
-rw-r--r--. 1 root root 7 Aug 28 21:54 11.txt
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ root@vinsent yy ]#cat 11.txt             # 查看源文件的內容並未發生改變
123124 
[ root@vinsent app ]#ln abc /etc/abc_bak        # 跨分區創建硬鏈接,提示錯誤
ln: failed to create hard link ‘/etc/abc_bak’ => ‘abc’: Invalid cross-device link

#------------創建軟連接--------------#

[ root@vinsent init.d ]#cd /etc/rc.d/rc3.d/       # 切換到/etc/rc.d/rc3.d/ 
[ root@vinsent rc3.d ]#ll                # 軟連接表現爲一個目錄指向另外一個目錄
total 0
lrwxrwxrwx. 1 root root 20 Aug 14 11:09 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Aug 14 11:09 S10network -> ../init.d/network
[ root@vinsent yy ]#ln -s  ../../../../c/w/e/yy/11.txt  ../../../../a/x/n/k/11bak.txt   # 創建軟連接
[ root@vinsent yy ]#ll
total 4
-rw-r--r--. 1 root root 38 Aug 28 22:17 11.txt
-rw-r--r--. 1 root root  0 Aug 28 21:43 22.txt
[ root@vinsent yy ]#cd /app/a/x/n/k/
[ root@vinsent k ]#ll                # 查看軟連接
total 0
lrwxrwxrwx. 1 root root 27 Aug 28 22:18 11bak.txt -> ../../../../c/w/e/yy/11.txt
-rw-r--r--. 1 root root  0 Aug 28 21:42 1.txt
-rw-r--r--. 1 root root  0 Aug 28 21:42 2.txt
[ root@vinsent k ]# 
[ root@vinsent k ]#cat 11bak.txt         # 查看文件內容
1sdfsaldfhaskdh
jashdkfj
kasdfk
23124
[ root@vinsent k ]#echo 82734 > 11bak.txt   # 修改文件內容
[ root@vinsent k ]#cat 11bak.txt 
82734
[ root@vinsent k ]#cd /app/c/w/e/yy/       # 切換回源目錄
[ root@vinsent yy ]#ll              
total 4
-rw-r--r--. 1 root root 6 Aug 28 22:21 11.txt
-rw-r--r--. 1 root root 0 Aug 28 21:43 22.txt
[ root@vinsent yy ]#cat 11.txt          # 查看原文件內容,發現也被修改了;說明軟連接是同一個文件
82734
[ root@vinsent yy ]#rm -rf 11.txt         # 刪除原文件
[ root@vinsent yy ]#cd -             # 切換回上次所在的目錄
/app/a/x/n/k
[ root@vinsent k ]#ll               # 查看鏈接文件,發現變紅了;
total 0
lrwxrwxrwx. 1 root root 27 Aug 28 22:18 11bak.txt -> ../../../../c/w/e/yy/11.txt
[ root@vinsent k ]#cat 11bak.txt          # 查看文件 內容,提示出錯
cat: 11bak.txt: No such file or directory
[ root@vinsent app ]#ln -s ../app/abc ../root/abc_bak  # 在不同分區創建軟連接,成功了
[ root@vinsent app ]#cd /root
[ root@vinsent ~ ]#ll               # 不同分區創建軟連接成功;說明可以跨分區
lrwxrwxrwx. 1 root root      10 Aug 28 22:28 abc_bak -> ../app/abc

補充說明:

  1. 當然軟鏈接的用戶數據也可以是一個絕對路徑路徑。如果不在同根下,軟鏈接創建時原文件的路徑指向使用絕對路徑較好。這是使用相對路徑創建的軟鏈接被移動後該軟鏈接文件將成爲一個死鏈接,因爲鏈接數據塊中記錄的亦是相對路徑指向。如果鏈接文件與原文件在同個根下,那麼用相對路徑實現較好,他能完美實現整體遷移,不破壞結構,此時使用絕對路徑將找不到原文件。故此;創建軟連接時,建議視情況而定。

  2. 在軟連接相對路徑中,目標文件時相對當前目錄而言的或者原文件所在的目錄而言的;而原文件的路徑是相對目標鏈接文件的路徑而言的。可能你會覺得很難理解,下面以圖解的方式幫大家一臂之力

wKiom1mmHYnwEOpsAABGicslDaU663.png

三、本篇小結

本篇博客主要講述了,什麼是相對路徑、絕對路徑以及軟連接、硬鏈接的相關概念與實現;相對路徑是指:相對某目錄或者當前位置而言的,比如..表示進入到上級目錄,這是相對當前目錄而言的;絕對路徑,顧名思義是絕對的路徑,你在任何目錄下都能通過該路徑進入到指定的目錄下,例如:不管你在哪個目錄下,只要在命令行輸入cd /etc/rc.d/init.d便可進入到init.d目錄下。硬鏈接的兩文件都指向了某個數據塊,本質是同一個文件,只是起了不同的名,沒多一個硬鏈接,原文件和鏈接文件的鏈接數就會增加1,刪除其中一個文件並不影響其他文件;硬鏈接有諸多限制,像不能跨分區,不能跨設備。軟連接相對硬鏈接而言,則顯得更加靈活,沒有硬鏈接的限制條件,能跨分區、設備;但由於軟連接的特性,也存在一些問題,像鏈接文件時一個指向原文件的指向,並不指向其數據塊,所以刪除原文件,那麼鏈接文件將不能使用,編輯其中一個文件,訪問另外一個文件將看到改變後的數據。到此爲止,Linux文件系統中的一些基本概念就介紹完了,謝謝大家的閱讀。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章