'詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等'

Linux Windows 波波說運維 2019-07-21
"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

例如下圖描述的是dir1目錄中的文件name1及其硬鏈接dir2/name2,右邊分別是它們的inode和datablock。這裡也看出了硬鏈接文件之間唯一不同的就是其所在目錄中的記錄不同。注意下圖中有一列Link Count就是標記硬鏈接數的屬性。

"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

例如下圖描述的是dir1目錄中的文件name1及其硬鏈接dir2/name2,右邊分別是它們的inode和datablock。這裡也看出了硬鏈接文件之間唯一不同的就是其所在目錄中的記錄不同。注意下圖中有一列Link Count就是標記硬鏈接數的屬性。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

每創建一個文件的硬鏈接,實質上是多一個指向該inode記錄的inode指針,並且硬鏈接數加1。

刪除文件的實質是刪除該文件所在目錄data block中的對應的inode指針,所以也是減少硬鏈接次數,由於block指針是存儲在inode中的,所以不是真的刪除數據,如果仍有其他指針指向該inode,那麼該文件的block指針仍然是可用的。當硬鏈接次數為1時再刪除文件就是真的刪除文件了,此時inode記錄中block指針也將被刪除。

不能跨分區創建硬鏈接,因為不同文件系統的inode號可能會相同,如果允許創建硬鏈接,複製到另一個分區時inode可能會和此分區已使用的inode號衝突。

硬鏈接的創建方法: ln file_target link_name 。


2 、軟鏈接

軟鏈接就是字符鏈接,鏈接文件默認指的就是字符鏈接文件(注意不是字符設備),使用"l"表示其類型。

硬鏈接不能跨文件系統創建,否則inode號可能會衝突。於是實現了軟鏈接以便跨文件系統建立鏈接。既然是跨文件系統,那麼軟鏈接必須得有自己的inode號。

軟鏈接在功能上等價與Windows系統中的快捷方式,它指向原文件,原文件損壞或消失,軟鏈接文件就損壞。可以認為軟鏈接inode記錄中的指針內容是目標路徑的字符串。

創建方式: ln –s source_file softlink_name ,記住是source_file<--link_name的指向關係(反箭頭)。

查看軟鏈接的值: readlink softlink_name

在設置軟鏈接的時候,source_file雖然不要求是絕對路徑,但建議給絕對路徑。


3、inode大小和劃分

inode大小為128字節的倍數,最小為128字節。它有默認值大小,它的默認值由/etc/mke2fs.conf文件中指定。不同的文件系統默認值可能不同。

# cat /etc/mke2fs.conf
"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

例如下圖描述的是dir1目錄中的文件name1及其硬鏈接dir2/name2,右邊分別是它們的inode和datablock。這裡也看出了硬鏈接文件之間唯一不同的就是其所在目錄中的記錄不同。注意下圖中有一列Link Count就是標記硬鏈接數的屬性。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

每創建一個文件的硬鏈接,實質上是多一個指向該inode記錄的inode指針,並且硬鏈接數加1。

刪除文件的實質是刪除該文件所在目錄data block中的對應的inode指針,所以也是減少硬鏈接次數,由於block指針是存儲在inode中的,所以不是真的刪除數據,如果仍有其他指針指向該inode,那麼該文件的block指針仍然是可用的。當硬鏈接次數為1時再刪除文件就是真的刪除文件了,此時inode記錄中block指針也將被刪除。

不能跨分區創建硬鏈接,因為不同文件系統的inode號可能會相同,如果允許創建硬鏈接,複製到另一個分區時inode可能會和此分區已使用的inode號衝突。

硬鏈接的創建方法: ln file_target link_name 。


2 、軟鏈接

軟鏈接就是字符鏈接,鏈接文件默認指的就是字符鏈接文件(注意不是字符設備),使用"l"表示其類型。

硬鏈接不能跨文件系統創建,否則inode號可能會衝突。於是實現了軟鏈接以便跨文件系統建立鏈接。既然是跨文件系統,那麼軟鏈接必須得有自己的inode號。

軟鏈接在功能上等價與Windows系統中的快捷方式,它指向原文件,原文件損壞或消失,軟鏈接文件就損壞。可以認為軟鏈接inode記錄中的指針內容是目標路徑的字符串。

創建方式: ln –s source_file softlink_name ,記住是source_file<--link_name的指向關係(反箭頭)。

查看軟鏈接的值: readlink softlink_name

在設置軟鏈接的時候,source_file雖然不要求是絕對路徑,但建議給絕對路徑。


3、inode大小和劃分

inode大小為128字節的倍數,最小為128字節。它有默認值大小,它的默認值由/etc/mke2fs.conf文件中指定。不同的文件系統默認值可能不同。

# cat /etc/mke2fs.conf
詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

同樣觀察到這個文件中還記錄了blocksize的默認值和inode分配比率inode_ratio。inode_ratio=16384表示每16384個字節即16KB就分配一個inode號,由於默認blocksize=4KB,所以每4個block就分配一個inode號。當然分配的這些inode號只是預分配,並不真的代表會全部使用,畢竟每個文件才會分配一個inode號。但是分配的inode自身會佔用block,而且其自身大小256字節還不算小,所以inode號的浪費代表著空間的浪費。

既然知道了inode分配比率,就能計算出每個塊組分配多少個inode號,也就能計算出inode table佔用多少個block。

如果文件系統中大量存儲電影等大文件,inode號就浪費很多,inode佔用的空間也浪費很多。但是沒辦法,文件系統又不知道你這個文件系統是用來存什麼樣的數據,多大的數據,多少數據。


4、ext文件系統預留的inode號

Ext預留了一些inode做特殊特性使用,如下:某些可能並非總是準確,具體的inode號對應什麼文件可以使用"find / -inum NUM"查看。

  • Ext4的特殊inode
  • Inode號 用途
  • 0 不存在0號inode
  • 1 虛擬文件系統,如/proc和/sys
  • 2 根目錄
  • 3 ACL索引
  • 4 ACL數據
  • 5 Boot loader
  • 6 未刪除的目錄
  • 7 預留的塊組描述符inode
  • 8 日誌inode
  • 11 第一個非預留的inode,通常是lost+found目錄

所以在ext4文件系統的dumpe2fs信息中,能觀察到fisrt inode號可能為11也可能為12。

並且注意到"/"的inode號為2,這個特性在文件訪問時會用上。

需要注意的是,每個文件系統都會分配自己的inode號,不同文件系統之間是可能會出現使用相同inode號文件的。例如:

# find / -ignore_readdir_race -inum 2 -ls
"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

例如下圖描述的是dir1目錄中的文件name1及其硬鏈接dir2/name2,右邊分別是它們的inode和datablock。這裡也看出了硬鏈接文件之間唯一不同的就是其所在目錄中的記錄不同。注意下圖中有一列Link Count就是標記硬鏈接數的屬性。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

每創建一個文件的硬鏈接,實質上是多一個指向該inode記錄的inode指針,並且硬鏈接數加1。

刪除文件的實質是刪除該文件所在目錄data block中的對應的inode指針,所以也是減少硬鏈接次數,由於block指針是存儲在inode中的,所以不是真的刪除數據,如果仍有其他指針指向該inode,那麼該文件的block指針仍然是可用的。當硬鏈接次數為1時再刪除文件就是真的刪除文件了,此時inode記錄中block指針也將被刪除。

不能跨分區創建硬鏈接,因為不同文件系統的inode號可能會相同,如果允許創建硬鏈接,複製到另一個分區時inode可能會和此分區已使用的inode號衝突。

硬鏈接的創建方法: ln file_target link_name 。


2 、軟鏈接

軟鏈接就是字符鏈接,鏈接文件默認指的就是字符鏈接文件(注意不是字符設備),使用"l"表示其類型。

硬鏈接不能跨文件系統創建,否則inode號可能會衝突。於是實現了軟鏈接以便跨文件系統建立鏈接。既然是跨文件系統,那麼軟鏈接必須得有自己的inode號。

軟鏈接在功能上等價與Windows系統中的快捷方式,它指向原文件,原文件損壞或消失,軟鏈接文件就損壞。可以認為軟鏈接inode記錄中的指針內容是目標路徑的字符串。

創建方式: ln –s source_file softlink_name ,記住是source_file<--link_name的指向關係(反箭頭)。

查看軟鏈接的值: readlink softlink_name

在設置軟鏈接的時候,source_file雖然不要求是絕對路徑,但建議給絕對路徑。


3、inode大小和劃分

inode大小為128字節的倍數,最小為128字節。它有默認值大小,它的默認值由/etc/mke2fs.conf文件中指定。不同的文件系統默認值可能不同。

# cat /etc/mke2fs.conf
詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

同樣觀察到這個文件中還記錄了blocksize的默認值和inode分配比率inode_ratio。inode_ratio=16384表示每16384個字節即16KB就分配一個inode號,由於默認blocksize=4KB,所以每4個block就分配一個inode號。當然分配的這些inode號只是預分配,並不真的代表會全部使用,畢竟每個文件才會分配一個inode號。但是分配的inode自身會佔用block,而且其自身大小256字節還不算小,所以inode號的浪費代表著空間的浪費。

既然知道了inode分配比率,就能計算出每個塊組分配多少個inode號,也就能計算出inode table佔用多少個block。

如果文件系統中大量存儲電影等大文件,inode號就浪費很多,inode佔用的空間也浪費很多。但是沒辦法,文件系統又不知道你這個文件系統是用來存什麼樣的數據,多大的數據,多少數據。


4、ext文件系統預留的inode號

Ext預留了一些inode做特殊特性使用,如下:某些可能並非總是準確,具體的inode號對應什麼文件可以使用"find / -inum NUM"查看。

  • Ext4的特殊inode
  • Inode號 用途
  • 0 不存在0號inode
  • 1 虛擬文件系統,如/proc和/sys
  • 2 根目錄
  • 3 ACL索引
  • 4 ACL數據
  • 5 Boot loader
  • 6 未刪除的目錄
  • 7 預留的塊組描述符inode
  • 8 日誌inode
  • 11 第一個非預留的inode,通常是lost+found目錄

所以在ext4文件系統的dumpe2fs信息中,能觀察到fisrt inode號可能為11也可能為12。

並且注意到"/"的inode號為2,這個特性在文件訪問時會用上。

需要注意的是,每個文件系統都會分配自己的inode號,不同文件系統之間是可能會出現使用相同inode號文件的。例如:

# find / -ignore_readdir_race -inum 2 -ls
詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

從結果中可見,除了根的Inode號為2,還有幾個文件的inode號也是 2,它們都屬於獨立的文件系統,有些是虛擬文件系統,如/proc和/sys。


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

"

概述

Linux中,一切皆文件,而每個文件都有一個inode,在將inode關聯到文件後系統將通過inode號來識別文件,而不是文件名。並且訪問文件時將先找到inode,通過inode中記錄的block位置找到該文件。


1 、硬鏈接

雖然每個文件都有一個inode,但是存在一種可能:多個文件的inode相同,也就即inode號、元數據、block位置都相同,這是一種什麼樣的情況呢?能夠想象這些inode相同的文件使用的都是同一條inode記錄,所以代表的都是同一個文件,這些文件所在目錄的data block中的inode指針目的地都是一樣的,只不過各指針對應的文件名互不相同而已。這種inode相同的文件在Linux中被稱為"硬鏈接"。

硬鏈接文件的inode都相同,每個文件都有一個"硬鏈接數"的屬性,使用ls -l的第二列就是被硬鏈接數,它表示的就是該文件有幾個硬鏈接。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

例如下圖描述的是dir1目錄中的文件name1及其硬鏈接dir2/name2,右邊分別是它們的inode和datablock。這裡也看出了硬鏈接文件之間唯一不同的就是其所在目錄中的記錄不同。注意下圖中有一列Link Count就是標記硬鏈接數的屬性。

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

每創建一個文件的硬鏈接,實質上是多一個指向該inode記錄的inode指針,並且硬鏈接數加1。

刪除文件的實質是刪除該文件所在目錄data block中的對應的inode指針,所以也是減少硬鏈接次數,由於block指針是存儲在inode中的,所以不是真的刪除數據,如果仍有其他指針指向該inode,那麼該文件的block指針仍然是可用的。當硬鏈接次數為1時再刪除文件就是真的刪除文件了,此時inode記錄中block指針也將被刪除。

不能跨分區創建硬鏈接,因為不同文件系統的inode號可能會相同,如果允許創建硬鏈接,複製到另一個分區時inode可能會和此分區已使用的inode號衝突。

硬鏈接的創建方法: ln file_target link_name 。


2 、軟鏈接

軟鏈接就是字符鏈接,鏈接文件默認指的就是字符鏈接文件(注意不是字符設備),使用"l"表示其類型。

硬鏈接不能跨文件系統創建,否則inode號可能會衝突。於是實現了軟鏈接以便跨文件系統建立鏈接。既然是跨文件系統,那麼軟鏈接必須得有自己的inode號。

軟鏈接在功能上等價與Windows系統中的快捷方式,它指向原文件,原文件損壞或消失,軟鏈接文件就損壞。可以認為軟鏈接inode記錄中的指針內容是目標路徑的字符串。

創建方式: ln –s source_file softlink_name ,記住是source_file<--link_name的指向關係(反箭頭)。

查看軟鏈接的值: readlink softlink_name

在設置軟鏈接的時候,source_file雖然不要求是絕對路徑,但建議給絕對路徑。


3、inode大小和劃分

inode大小為128字節的倍數,最小為128字節。它有默認值大小,它的默認值由/etc/mke2fs.conf文件中指定。不同的文件系統默認值可能不同。

# cat /etc/mke2fs.conf
詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

同樣觀察到這個文件中還記錄了blocksize的默認值和inode分配比率inode_ratio。inode_ratio=16384表示每16384個字節即16KB就分配一個inode號,由於默認blocksize=4KB,所以每4個block就分配一個inode號。當然分配的這些inode號只是預分配,並不真的代表會全部使用,畢竟每個文件才會分配一個inode號。但是分配的inode自身會佔用block,而且其自身大小256字節還不算小,所以inode號的浪費代表著空間的浪費。

既然知道了inode分配比率,就能計算出每個塊組分配多少個inode號,也就能計算出inode table佔用多少個block。

如果文件系統中大量存儲電影等大文件,inode號就浪費很多,inode佔用的空間也浪費很多。但是沒辦法,文件系統又不知道你這個文件系統是用來存什麼樣的數據,多大的數據,多少數據。


4、ext文件系統預留的inode號

Ext預留了一些inode做特殊特性使用,如下:某些可能並非總是準確,具體的inode號對應什麼文件可以使用"find / -inum NUM"查看。

  • Ext4的特殊inode
  • Inode號 用途
  • 0 不存在0號inode
  • 1 虛擬文件系統,如/proc和/sys
  • 2 根目錄
  • 3 ACL索引
  • 4 ACL數據
  • 5 Boot loader
  • 6 未刪除的目錄
  • 7 預留的塊組描述符inode
  • 8 日誌inode
  • 11 第一個非預留的inode,通常是lost+found目錄

所以在ext4文件系統的dumpe2fs信息中,能觀察到fisrt inode號可能為11也可能為12。

並且注意到"/"的inode號為2,這個特性在文件訪問時會用上。

需要注意的是,每個文件系統都會分配自己的inode號,不同文件系統之間是可能會出現使用相同inode號文件的。例如:

# find / -ignore_readdir_race -inum 2 -ls
詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

從結果中可見,除了根的Inode號為2,還有幾個文件的inode號也是 2,它們都屬於獨立的文件系統,有些是虛擬文件系統,如/proc和/sys。


後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注一下~

詳解Linux系統inode原理--硬鏈接、軟鏈接、innodb大小和劃分等

"

相關推薦

推薦中...