1. 程式人生 > >Linux中inode詳解,硬鏈接和軟鏈接介紹

Linux中inode詳解,硬鏈接和軟鏈接介紹

依賴關系 多少 mod cp命令 因此 如同 執行權限 file 指向

inode 詳解

  在Linux中,我們經常會做一些關於數據的操作(備份、傳輸、壓縮等)或是要在後臺持續的運行一些程序。由於,工作的數據量很大或者工作要持續很長的時間,我們就必須保證這個終端的啟動,一旦終端關閉了,它所運行的進程也會關閉,我們所做的工作就可能前功盡棄。但是,即使我們不主動的關閉終端,終端有的時候也會應為一些原因(網絡、鎖屏等)而中斷,導致我們的工作進度清零。

1.inode 定義

inode是用來存儲文件元信息的區域。中文譯名叫做“索引節點”。

  簡單來說,inode 指示了一個文件的基本信息,如inode編號、修改時間、文件的位置等,就如同一本書的目錄,會直接告訴你想看的章節是在第幾頁。不同的是,書是以頁為單位的,而 linux 文件存取是以“塊”為單位的。

操作系統在讀取硬盤的時候,會一次性讀取一個“塊”(一個“塊”的大小往往是4kb,包含了連續8個扇區,每個扇區存儲512個字節)。而inode就告訴了文件位於哪個“塊”,於是系統就會從這個“塊”開始讀取內容,我們就可以看到這個文件的內容。
每個文件都有對應的inode,存儲著關於這個文件的基本信息。linux 系統不使用文件名,而使用 inode 號來識別文件。對於使用者,我們是通過文件名打開的文件;但是對於系統內部,是分為三步的:

  1. 系統找到這個文件名對應的 inode 號
  2. 通過 inode 號,獲取 inode 信息
  3. 根據 inode 信息,找到文件數據所在的 block,讀取內容

2.inode 內容

inode 包含了文件的以下基本信息:

  • 文件的字節數
  • inode 編號
  • 文件擁有者的 Uid
  • 文件所屬group的 Gid
  • 文件的讀、寫、執行權限
  • 文件的時間戳,共有三個:
    change:inode 上一次變動的時間
    modify:文件內容上一次變動的時間
    access:文件上一次打開的時間
  • 鏈接數,即有多少文件名指向這個 inode
  • 文件數據 block 的位置

查看inode內容可以使用命令:stat -i 和 ls -i

3.目錄原理

  要理解文件的操作對 inode 的影響,先要理解目錄的原理。目錄對外表現是一個容器,存放著子文件和子目錄,實際上在系統內部,目錄本身也是一個文件,目錄文件的內容即是該目錄下的文件名與 inode 號的映射表

(即一個個的目錄項)。因此,linux 訪問一個文件時,要先查詢到上一級目錄,根據目錄內容查找到文件對應的 inode 號,然後讀取對應的 block。

4.文件操作原理

cp命令

  1. 分配一個空閑的inode號,inode表中新增一條索引記錄
  2. 在目錄中新建一個目錄項,並指向步驟一中的inode號關聯
  3. 將數據復制到block中

rm命令

  1. 減少要刪除文件鏈接數,如果鏈接數變為0,則釋放inode號
  2. 數據block放到空閑列表中
  3. 刪除目錄項
    (數據文件不會馬上刪除,當新的文件覆蓋數據塊,則數據刪除,若沒有覆蓋,則還可以恢復)

mv命令

如果源文件和目標文件在一個文件系統

  1. 目標文件目錄中新建目錄項
  2. 源文件目錄中的目錄項
  3. 目標文件名指向inode記錄
    (inode記錄沒有影響(除時間戳),數據位置沒有變化)

    如果目標文件和源文件屬於不同文件系統,則相當於 cp + rm。

ln命令

硬鏈接

  一般情況下,文件名和 inode 號是一一對應,但是也有可能多個文件名指向同一個 inode 號,即硬鏈接。硬鏈接可以實現用不同的文件名訪問同一個文件。

軟鏈接

  軟鏈接也可以通過不同的文件名訪問同一塊數據,但是與硬鏈接不同的是,兩個文件名的 inode 是不一樣的。那如何訪問同一塊區域呢?比如文件 A 是文件 B 的軟連接,那麽文件 A 的內容存放的是文件 B 的路徑名(可以通過這個找到文件 B 的目錄項)。因此訪問 A 時,會讀取文件 B 的路徑,進而讀取文件 B 的內容。這樣,對外表現來看,文件 A 和文件 B 的內容就相同了。類似於 windows 系統下的快捷方式。

創建軟鏈接語法:
ln -s [source file] [new file]

  在生產環境中,創建軟鏈接一般選擇相對路徑,這樣在數據整體遷移中,軟鏈接保持相對關系不受根目錄影響。特殊需要強調的是:源文件路徑是相對於新鏈接文件的相對路徑,不是相對當前工作目錄的相對路徑

例如:

硬鏈接與軟鏈接的區別

  1. 本質不同,硬鏈接指向同一個文件,軟鏈接指向文件不同
  2. 跨分區,硬鏈接不支持跨分區,軟鏈接可以跨分區
  3. inode編號,硬鏈接inode編號相同,軟鏈接inode編號不同
  4. 目錄,硬鏈接不支持目錄,軟鏈接可以對目錄創建
  5. 創建硬鏈接時,鏈接數加1,創建軟鏈接時,鏈接數不變
  6. 硬鏈接屬於平等關系,軟鏈接屬於依賴關系,刪除原文件效果不同

本文參考文章
作者:HappyRocking
來源:CSDN
原文:https://blog.csdn.net/HappyRocking/article/details/80671997
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

Linux中inode詳解,硬鏈接和軟鏈接介紹