我們知道檔案都有檔名與資料,這在 linux 上被分成兩個部分:使用者資料 (user data)與元資料 (metadata)。
使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實內容的地方;
元資料則是檔案的附加屬性,如檔名、檔案大小、建立時間、所有者、檔案所在的inode等資訊。
在 linux 中,元資料中的 inode 號(inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。如圖1:
可以用stat命令或ls -i檢視inode號。
[yangxjsun@ubuntu workspace]$ls
c1 c2 test test.txt
[yangxjsun@ubuntu workspace]$stat test.txt
檔案:'test.txt'
大小:6 塊:8 io 塊:4096 普通檔案
許可權:(0664/-rw-rw-r--) uid:( 1000/yangxjsun) gid:( 1000/yangxjsun)
最近訪問:2018-03-24 16:58:43.693982883 +0800
最近更改:2018-03-24 16:58:35.981917820 +0800
最近改動:2018-03-24 16:58:35.981917820 +0800
[yangxjsun@ubuntu workspace]$mv test.txt hello.txt
[yangxjsun@ubuntu workspace]$stat hello.txt
檔案:'hello.txt'
大小:6 塊:8 io 塊:4096 普通檔案
許可權:(0664/-rw-rw-r--) uid:( 1000/yangxjsun) gid:( 1000/yangxjsun)
最近訪問:2018-03-24 16:58:43.693982883 +0800
最近更改:2018-03-24 16:58:35.981917820 +0800
最近改動:2018-03-24 16:59:17.190260081 +0800
[yangxjsun@ubuntu workspace]$
可以看到改變檔名之後inode不變。
硬鏈結:硬鏈結是新的目錄條目,其引用系統中的現有檔案。檔案系統中的每一檔案預設具有乙個硬鏈結。為節省空間,可以不複製檔案,而建立引用同一檔案的新硬鏈結。新硬鏈結如果在與現有硬鏈結相同的目錄中建立,則需要有不同的檔名,否則需要在不同的目錄中。指向同一檔案的所有硬鏈結具有相同的許可權、連線數、使用者/組所有權、時間戳以及檔案內容。指向同一檔案內容的硬鏈結需要在相同的檔案系統中。
簡單說,硬鏈結就是乙個 inode 號對應多個檔案。就是同乙個檔案使用了多個別名(上圖中 hard link 就是 file 的乙個別名,他們有共同的 inode)。
建立硬鏈結:ln命令為現有檔案建立新的硬鏈結。
ln 現有檔案硬鏈結(檔名) 乙個或多個新硬鏈結
[yangxjsun@ubuntu workspace]$ls -l newfile.txt
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月 24 17:40 newfile.txt
[yangxjsun@ubuntu workspace]$ln newfile.txt newfile-hlink.txt
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-hlink.txt
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月 24 17:40 newfile-hlink.txt
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月 24 17:40 newfile.txt
可以看出,新硬鏈結建立後,無法區別哪一現有硬鏈結是原始鏈結。
[yangxjsun@ubuntu workspace]$rm newfile.txt
[yangxjsun@ubuntu workspace]$ls -l newfile-hlink.txt
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月 24 17:40 newfile-hlink.txt
[yangxjsun@ubuntu workspace]$cat newfile-hlink.txt
hello
即使原始鏈結被刪除,使用新的硬鏈結依然可以訪問原內容。
[yangxjsun@ubuntu workspace]$ln -s /home/yangxjsun/workspace/newfile.txt newfile-slink.txt
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-slink.txt
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月 24 19:27 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月 24 16:58 newfile.txt
[yangxjsun@ubuntu workspace]$
當原始檔案被刪除之後,軟鏈結依然會指向該檔案,但目標已消失。這就是」dangling link」
[yangxjsun@ubuntu workspace]$rm newfile.txt
[yangxjsun@ubuntu workspace]$ls -l newfile-slink.txt
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月 24 19:30 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
[yangxjsun@ubuntu workspace]$cat newfile-slink.txt
cat: newfile-slink.txt: 沒有那個檔案或目錄
[yangxjsun@ubuntu workspace]$
軟鏈結可以指向目錄。而後軟連線作為目錄使用。可以通過cd正常更改到軟連線目錄。
[yangxjsun@ubuntu workspace]$ln -s /etc/ configs
[yangxjsun@ubuntu workspace]$ls -d configs
configs
[yangxjsun@ubuntu workspace]$cd configs
[yangxjsun@ubuntu configs]$ls
acpi host.conf ppp
adduser.conf hostname presage.xml
alternatives hosts printcap
anacrontab hosts.allow profile
...
當然軟鏈結的使用者資料也可以是另乙個軟鏈結的路徑,其解析過程是遞迴的。但需注意:軟鏈結建立時原檔案的路徑指向使用絕對路徑較好。使用相對路徑建立的軟鏈結被移動後該軟鏈結檔案將成為乙個死鏈結,因為鏈結資料塊中記錄的亦是相對路徑指向。
參考鏈結
Linux中硬鏈結與軟鏈結的區別與聯絡
鏈結為 linux 系統解決了檔案的共享使用問題,還帶來了隱藏檔案路徑 增加許可權安全及節省儲存等好處。鏈結分兩種,一種被稱為硬鏈結 hard link 另一種被稱為符號鏈結 symbolic link 也即軟鏈結 soft link 本文,我們將詳細講解關於這兩種鏈結的區別與聯絡。要理解 硬鏈結 ...
linux硬鏈結與軟鏈結
1.linux鏈結概念 linux鏈結分兩種,一種被稱為硬鏈結 hard link 另一種被稱為符號鏈結 symbolic link 預設情況下,ln命令產生硬鏈結。硬連線 硬連線指通過索引節點來進行連線。在linux的檔案系統中,儲存在磁碟分割槽中的檔案不管是什麼型別都給它分配乙個編號,稱為索引節...
Linux 硬鏈結與軟鏈結
原貼 2007 08 05 10 19 49 linux硬鏈結與軟鏈結 2006 12 01 15 03 首先要弄清楚,在linux系統中,核心為每乙個新建立的檔案分配乙個inode 索引結點 每個檔案都有乙個惟一的inode號。檔案屬性儲存在索引結點裡,在訪問檔案時,索引結點被複製到內存在,從而實...