­

透過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_relation

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號碼。

ln

本文永久地址GitHub