硬鏈結與軟鏈結的聯絡與區別
我們知道檔案都有檔名與資料,這在 linux 上被分成兩個部分:
元資料 (metadata)是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。
使用者資料 (user data)即檔案資料塊 (data block), 資料塊是記錄檔案真實內容的地方;
元資料則在 linux 中,元資料中的 inode 號(inode 是檔案元資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。圖 1.展示了程式通過檔名獲取檔案內容的過程。
圖 1 通過檔名開啟檔案
鏈結為 linux 系統解決了檔案的共享使用,還帶來了隱藏檔案路徑、增加許可權安全及節省儲存等好處。
若乙個 inode 號對應多個檔名,則稱這些檔案為硬鏈結。
換言之,硬鏈結就是同乙個檔案使用了多個別名。硬鏈結可由命令 link 或 ln 建立。如下是對檔案 oldfile 建立硬鏈結。
link oldfile newfile由於硬鏈結是有著相同 inode 號僅檔名不同的檔案,因此硬鏈結存在以下幾點特性:ln oldfile newfile
若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。
軟鏈結就是乙個普通檔案,只是資料塊內容有點特殊。軟鏈結有著自己的 inode 號以及使用者資料塊。因此軟鏈結的建立與使用沒有類似硬鏈結的諸多限制:
ln -s oldfile newfile
linux系統是通過link的數量來控制檔案刪除的,只有當乙個檔案不存在任何link的時候,這個檔案才會被刪除。
一般來說每個檔案兩個link計數器來控制
i_count和i_nlink。
當乙個檔案被乙個程式占用的時候i_count就加1。
當檔案的硬鏈結多乙個的時候i_nlink也加1。
刪除乙個檔案,就是讓這個檔案,沒有程序占用,同時i_link數量為0。
擴充套件:
1.在 linux 系統中檢視 inode 號可使用命令stat 或 ls -i
使用命令 mv 移動並重命名檔案 glibc-2.16.0.tar.xz,其結果不影響檔案的使用者資料及 inode 號,檔案移動前後 inode 號均為:2485677。
移動或重新命名檔案
#stat/home/harris/source/glibc-2.16.0.tar.xz2. inode 號僅在各檔案系統下是唯一的,linux 掛載多個檔案系統後將出現 inode 號重複的現象file: `/home/harris/source/glibc-2.16.0.tar.xz'
size: 9990512 blocks: 19520 io block: 4096 regular file
device: 807h/2055dinode: 2485677links: 1
access: (0600/-rw-------) uid: ( 1000/ harris) gid: ( 1000/ harris)
...
...
# mv /home/harris/source/glibc-2.16.0.tar.xz /home/harris/desktop/glibc.tar.xz
#ls -i-f /home/harris/desktop/glibc.tar.xz2485677/home/harris/desktop/glibc.tar.xz
df 檢視當前系統中掛載的檔案系統型別、各檔案系統 inode 使用情況及檔案系統掛載點。
查詢有相同 inode 號的檔案
3.linux 系統存在 inode 號被用完但磁碟空間還有剩餘的情況。
4.使用命令 find 查詢軟鏈結與硬鏈結
// 查詢在路徑 /home 下的檔案 data.txt 的軟鏈結#find /home -lnamedata.txt
/home/harris/debug/test2/a
// 檢視路徑 /home 有相同 inode 的所有硬鏈結
#find /home -samefile/home/harris/debug/test3/old.file
/home/harris/debug/test3/hard.link
/home/harris/debug/test3/old.file
#find /home -inum660650
/home/harris/debug/test3/hard.link
/home/harris/debug/test3/old.file
// 列出路徑 /home/harris/debug/ 下的所有軟鏈結檔案
#find /home/harris/debug/ -type l-ls
656662 0 lrwxrwxrwx 1 harris harris 1 sep 1 14:37 /home/harris/debug/test2/b -> a
656627 0 lrwxrwxrwx 1 harris harris 8 sep 1 14:37 /home/harris/debug/test2/a ->
data.txt
789467 0 lrwxrwxrwx 1 root root 8 sep 1 18:00 /home/harris/debug/test/soft.link ->
old.file
789496 0 lrwxrwxrwx 1 root root 7 sep 1 18:01
/home/harris/debug/test/soft.link.dir -> old.dir
軟鏈結 硬鏈結
硬鏈結就是同一塊資料但有兩個不同的名字,讀寫的時候本質上都是修改的同一塊資料。硬鏈結在刪除的時候只是刪除了乙個名字。只有一塊資料的所有名字都刪除了的時候,資料才會被刪除。刪除的時候相當於把牆的這一面糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到 符號鏈結就是 我聲稱我有乙個蘋果,但是當你找我要...
軟鏈結 硬鏈結
其中包含的有另一檔案的位置資訊。inode,繼而指向兩塊不同的資料塊。但是 a 的資料塊中存放的只是b的路徑名 可以根據這個找到 b 的目錄項 a 和 b 之間是 主從 關係,如果 b被刪除了,a 仍然存在 因為兩個是不同的檔案 但指向的是乙個無效的鏈結。硬連線指通過索引節點來進行連線。在 linu...
軟鏈結和硬鏈結
又叫符號鏈結,這個檔案包含了另乙個檔案的路徑名。可以是任意檔案或目錄,可以鏈結不同檔案系統的檔案。鏈結檔案甚至可以鏈結不存在的檔案,這就產生一般稱之為 斷鏈 的問題 或曰 現象 鏈結檔案甚至可以迴圈鏈結自己。類似於程式語言中的遞迴。軟連線的格式是 ln s 目標檔名 鏈結名 在對符號檔案進行讀或寫操...