在linux系統中有一種文件叫做鏈接文件,可以爲解決文件的共享使用。鏈接的方式可以分爲兩種,一種是硬鏈接(Hard Link),另一種是軟鏈接或者也稱爲符號鏈接(Symbolic Link)。
一、基本概念
1、硬鏈接
開始之前,先解釋一個概念,叫做索引節點(Inode)。
在Linux的文件系統中,保存在磁盤分區中的文件,不管是什麼類型,系統都會給它分配一個編號,這個編號被稱爲索引節點編號(Inode Index),它是該文件或者目錄在linux文件系統中的唯一標識。有了這個編號值,就可以查到該文件的詳細內容。
同時,Linux系統還規定,可以允許多個文件名同時指向同一個索引節點(Inode),這就是硬鏈接。這樣設計有一個好處就是,只要文件的索引節點還存在一個以上的鏈接,刪除其中一個鏈接並不影響索引節點本身和其他的鏈接(也就是說該文件的實體並未刪除),而只有當最後一個鏈接被刪除後,且此時有新數據要存儲到磁盤上,那麼被刪除的文件的數據塊及目錄的鏈接纔會被釋放,存儲空間纔會被新數據所覆蓋。因此,該機制可以有效的防止誤刪操作。
硬鏈接只能在同一類型的文件系統中進行鏈接,不能跨文件系統。同時它只能對文件進行鏈接,不能鏈接目錄。
2、軟鏈接
軟鏈接(也叫符號鏈接),類似於windows系統中的快捷方式,與硬鏈接不同,軟鏈接就是一個普通文件,只是數據塊內容有點特殊,文件用戶數據塊中存放的內容是另一文件的路徑名的指向,通過這個方式可以快速定位到軟連接所指向的源文件實體。
軟鏈接常用來解決空間不足的問題,比如某個文件文件系統空間已經用完了,但是現在必須在該文件系統下創建一個新的目錄並存儲大量的文件,那麼可以把另一個剩餘空間較多的文件系統中的目錄鏈接到該文件系統中。
軟鏈接可以跨文件系統而鏈接,也可以同時對文件或目錄進行鏈接。
3、二者區別
- 軟鏈接以存放另一個文件的路徑的形式存在,硬鏈接以文件副本的形式存在;
- 軟鏈接可以跨不同的文件系統而鏈接,硬鏈接不可以;
- 軟鏈接可以對目錄進行鏈接,而硬鏈接不可以;
- 軟鏈接可以對一個不存在的文件名進行鏈接,硬鏈接必須要有源文件。
- 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接就變成了死鏈接。刪除硬鏈接的話,只要索引節點的個數不爲零,則不會對原始文件造成任何影響;
注意:不論是硬鏈接或軟鏈接都不會將原本的目標文件完全複製一份,而只會佔用非常少量的存儲空間。
二、創建方式(ln命令)
軟鏈接和硬鏈接都是通過ln命令來創建,只是參數不同。命令格式如下:
ln 參數 源文件或目錄 目標文件或目錄
注意:源目錄和目標目錄都必須是絕對路徑!
參數:
- -i 交互模式,文件存在則提示用戶是否覆蓋;
- -s 軟鏈接(符號鏈接);
- -d 允許超級用戶製作目錄的硬鏈接;
- -b 刪除,覆蓋以前建立的鏈接;
- -f 強制執行;
- -n 把符號鏈接視爲一般目錄;
- -v 顯示詳細的處理過程;
所以,總結起來就是:
- 創建軟鏈接 (符號鏈接)使用:
ln -s source target
- 創建硬鏈接 (實體鏈接)使用:
ln source target
比如:
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ll # 首先創建一個測試目錄和測試文件
total 16
drwxrwxr-x 3 leon leon 4096 Aug 29 14:21 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
drwxrwxr-x 2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r-- 1 leon leon 40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln testdir hard_link # 不能對目錄創建硬鏈接
ln: testdir: hard link not allowed for directory
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir # 可以對目錄創建軟鏈接
leon@Ubuntu:~/temp$ ll
total 16
drwxrwxr-x 3 leon leon 4096 Aug 29 14:26 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx 1 leon leon 7 Aug 29 14:26 soft_link_for_dir -> testdir/
drwxrwxr-x 2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r-- 1 leon leon 40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln testfile hard_link_for_file # 可以對文件創建硬鏈接
leon@Ubuntu:~/temp$ ll
total 20
drwxrwxr-x 3 leon leon 4096 Aug 29 14:27 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
-rw-rw-r-- 2 leon leon 40 Aug 29 14:21 hard_link_for_file
drwxrwxr-x 2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r-- 2 leon leon 40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ ln -s testfile soft_link_for_file # 可以對文件創建軟鏈接
leon@Ubuntu:~/temp$ ll
total 20
drwxrwxr-x 3 leon leon 4096 Aug 29 14:28 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx 1 leon leon 8 Aug 29 14:28 soft_link_for_file -> testfile
drwxrwxr-x 2 leon leon 4096 Aug 29 14:21 testdir/
-rw-rw-r-- 2 leon leon 40 Aug 29 14:21 testfile
--------------------------------------------------------------------------------------------------------
三、注意事項
1、對目錄創建軟鏈接之前,不用提前建立好目標目錄,直接ln命令就會自動建立。如果你提前建立了目標目錄,則使用ln命令之後,建立的目標目錄會出現嵌套,這一點要千萬注意!
leon@Ubuntu:~/temp$ ll testdir/ # 首先查看下源目錄下的文件情況
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 14:29 ./
drwxrwxr-x 3 leon leon 4096 Aug 29 14:28 ../
-rw-rw-r-- 1 leon leon 0 Aug 29 14:29 test
# 下面的語句是直接創建軟鏈接,可以看出軟鏈接的結果是正確的
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir # 創建軟鏈接1
leon@Ubuntu:~/temp$ ll soft_link_for_dir # 查看軟鏈接1的詳情
lrwxrwxrwx 1 leon leon 7 Aug 29 14:26 soft_link_for_dir -> testdir/
# 下面的語句是先創建好目標目錄,然後再創建軟鏈接。可以看出軟鏈接的結果是不正確的
leon@Ubuntu:~/temp$ mkdir soft_link_for_dir2 # 先創建一個目錄
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir2 # 然後再創建軟鏈接2
leon@Ubuntu:~/temp$ ll soft_link_for_dir2 # 查看軟鏈接2的詳情
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 14:34 ./
drwxrwxr-x 4 leon leon 4096 Aug 29 14:34 ../
lrwxrwxrwx 1 leon leon 7 Aug 29 14:34 testdir -> testdir
2、對目錄創建軟鏈接時,不要攜帶’/‘符號,否則創建出來的軟鏈接所指向的源目錄也會攜帶一個’/'符號。雖然表面上看上去可以正常訪問,但是不能保證在某些特殊情況下會出現問題。這一點也要千萬注意!
leon@Ubuntu:~/temp$ ln -s testdir/ soft_link_for_dir1 # 不建議這麼操作
leon@Ubuntu:~/temp$ ln -s testdir soft_link_for_dir2 # 這纔是正確的
leon@Ubuntu:~/temp$ ll
total 16
drwxrwxr-x 3 leon leon 4096 Aug 29 15:41 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx 1 leon leon 8 Aug 29 15:40 soft_link_for_dir1 -> testdir//
lrwxrwxrwx 1 leon leon 7 Aug 29 15:41 soft_link_for_dir2 -> testdir/
drwxrwxr-x 2 leon leon 4096 Aug 29 14:29 testdir/
-rw-rw-r-- 1 leon leon 40 Aug 29 14:21 testfile
3、刪除軟鏈接時,不能攜帶’/'符號,否則你刪除的就是軟鏈接目標目錄下的資源(即源文件),而不是軟鏈接本身。
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ rm -rf soft_link_for_dir1 # 這是正確的刪除軟鏈接的方式
leon@Ubuntu:~/temp$ ll # 當前目錄下的鏈接文件已經被刪了
total 16
drwxrwxr-x 3 leon leon 4096 Aug 29 15:53 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
drwxrwxr-x 2 leon leon 4096 Aug 29 14:29 testdir/
-rw-rw-r-- 1 leon leon 40 Aug 29 14:21 testfile
leon@Ubuntu:~/temp$ ls -al testdir/ # 並且,源目錄下的原始文件還在
total 12
drwxrwxr-x 2 leon leon 4096 Aug 29 15:55 .
drwxrwxr-x 3 leon leon 4096 Aug 29 15:54 ..
-rw-rw-r-- 1 leon leon 18 Aug 29 15:53 new_file
--------------------------------------------------------------------------------------------------------
leon@Ubuntu:~/temp$ rm -rf soft_link_for_dir/ # 這是錯誤的刪除軟鏈接的方式
leon@Ubuntu:~/temp$ ll # 當前目錄下的鏈接文件沒有被刪掉
total 16
drwxrwxr-x 3 leon leon 4096 Aug 29 15:54 ./
drwxr-xr-x 23 leon leon 4096 Aug 29 14:20 ../
lrwxrwxrwx 1 leon leon 7 Aug 29 15:54 soft_link_for_dir -> testdir/
drwxrwxr-x 2 leon leon 4096 Aug 29 15:54 testdir/
-rw-rw-r-- 1 leon leon 40 Aug 29 14:21 testfile
leon@Ubuntu:~/temp$ ls -al testdir/ # 而源目錄下的原始文件卻被刪掉了
total 8
drwxrwxr-x 2 leon leon 4096 Aug 29 15:54 .
drwxrwxr-x 3 leon leon 4096 Aug 29 15:54 ..
--------------------------------------------------------------------------------------------------------