軟鏈結 硬鏈結

2021-08-09 04:52:42 字數 3977 閱讀 9618

硬鏈結與軟鏈結的聯絡與區別

我們知道檔案都有檔名與資料,這在 linux 上被分成兩個部分:

元資料 (metadata)是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。

使用者資料 (user data)即檔案資料塊 (data block),       資料塊是記錄檔案真實內容的地方;

元資料則在 linux 中,元資料中的 inode 號(inode 是檔案元資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。圖 1.展示了程式通過檔名獲取檔案內容的過程。

圖 1 通過檔名開啟檔案

鏈結為 linux 系統解決了檔案的共享使用,還帶來了隱藏檔案路徑、增加許可權安全及節省儲存等好處。

若乙個 inode 號對應多個檔名,則稱這些檔案為硬鏈結

換言之,硬鏈結就是同乙個檔案使用了多個別名。硬鏈結可由命令 link 或 ln 建立。如下是對檔案 oldfile 建立硬鏈結。

link oldfile newfile 

ln oldfile newfile

由於硬鏈結是有著相同 inode 號僅檔名不同的檔案,因此硬鏈結存在以下幾點特性:

若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線

軟鏈結就是乙個普通檔案,只是資料塊內容有點特殊。軟鏈結有著自己的 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.xz 

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

2.  inode 號僅在各檔案系統下是唯一的,linux 掛載多個檔案系統後將出現 inode 號重複的現象                    

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 目標檔名 鏈結名 在對符號檔案進行讀或寫操...