透過inode來理解硬鏈接和軟鏈接
什麼是inode?
每個文件都對應一個唯一的inode,inode用來存儲文件的元資訊,包括:
- 對應的文件
- 文件位元組數
- 文件數據塊的位置
- 文件的inode號碼
- 文件的硬鏈接數
- 文件的讀寫許可權
- 文件的時間戳
在Linux系統下,創建一個文件hello.txt
echo 'hello world' -> 'hello.txt'
接著使用stat命令查看hello.txt
的inode資訊:
stat hello.txt
文件:hello.txt
大小:14 塊:8 IO 塊:4096 普通文件
設備:fd00h/64768d Inode:34025713 硬鏈接:1
許可權:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
環境:unconfined_u:object_r:admin_home_t:s0
最近訪問:2022-08-18 15:44:56.158501724 +0800
最近更改:2022-08-18 15:44:56.158501724 +0800
最近改動:2022-08-18 15:44:56.158501724 +0800
創建時間:2022-08-18 15:44:56.158501724 +0800
inode和文件名
作業系統使用inode號碼來識別文件,而人使用文件名來識別文件
人在打開文件的時候,實際上系統是先通過文件名找到對應的inode號碼,然後根據inode號碼找到文件inode資訊,根據inode資訊找到文件內容所在的數據塊,最後讀取數據。
硬鏈接
文件和inode的關係是一對一,而文件名和inode的關係則是一對多,系統允許多個文件名對應一個inode
inode資訊中的硬鏈接(Links)數,就表示當前有幾個文件名對應著該inode,換句話說,每個文件名就是文件的一個硬鏈接
增加硬鏈接
使用ln命令為hello.txt
生成一個硬鏈接,格式:ln 源文件名 硬鏈接文件名
ln hello.txt hello-hard-link.txt
再用stat hello.txt
查看源文件的硬鏈接數,值變為2
刪除硬鏈接
rm -f hello-hard-link.txt
再次查看硬鏈接數,值為1
當一個文件的硬鏈接大於1時,刪除一個硬鏈接(也就是文件名),不會影響源文件,只有當硬鏈接數等於0,系統才會刪除源文件
修改源文件
修改源文件內容,會影響所有硬鏈接,因為硬鏈接都是指向同一個與源文件的數據塊
軟鏈接
軟鏈接也叫符號鏈接,很好理解,可以理解為window系統里的快捷方式
先創建一個硬鏈接:
ln hello.txt hello_hard_link.txt
然後,創建一個軟鏈接:
ln -s hello.txt hello_s.txt
此時,文件hello.txt
有2個硬鏈接,1個軟鏈接,接下來,刪除剛剛用來創建軟鏈接的文件名:
rm -f hello.txt
這個時候,打開文件hello_s.txt
就會報錯「No such file or directory」。
這就是軟鏈接和硬鏈接的區別,軟鏈接指向的是文件名(硬鏈接),硬鏈接指向的是文件的inode號碼。
本文永久地址GitHub