41 18 Linux目錄與inode 深入理解

2021-10-01 22:16:19 字數 4166 閱讀 9953

1、關於linux目錄,檔案,資料塊

對於使用計算機的人而言,經常有一種 錯誤的認知:目錄(或者說,資料夾)裡面存放著檔案。實際上,目錄裡面並不存放檔案,以及檔案資料。

實際上,目錄是乙個特殊的檔案,針對這個特殊的檔案也存在一些特殊的規則,比如利用命令cp /dev/null 並不能夠銷毀這個特殊的檔案,因為目錄的一些特殊的位元位保證了這一安全性,降低了人工操作帶來的風險。在一些老版本的unix系統裡面,使用者可以利用cat命令開啟目錄,檢視裡面的資訊,在一些衍生於debian系統的發行版linux裡面,也可以利用vi工具開啟目錄,檢視一些資訊。

在linux裡面,乙個檔案的資訊被存放於兩個位置:

1. 資料塊(data block)當中

2. inode當中

硬碟的最小儲存單位叫做「扇區」(sector)。每個扇區儲存512位元組(相當於0.5kb)。作業系統讀取磁碟的時候,不會乙個個扇區「挨個讀取」,而是一次讀取多個扇區,即一次讀取乙個「塊」(block),這種由多個扇區組成的」塊」,是檔案訪問的最小單位。」塊」的大小,最常見的是4kb,即連續八個 sector組成乙個 block。data block當中存放了檔案的真實內容,而檔案的元資料資訊,被存放到了inode當中。data block和inode被檔案系統有效地組織到了一起。

當檔案系統被建立之後,inode的數量以及data block的數量也被固定下來。我們不能夠修改inode的數量,也不能夠修改data block的數量。

當我們建立乙個檔案的時候,inode編號將作為該檔案的唯一id,即,乙個檔案在同一時刻僅擁有乙個inode編號。當我們向乙個檔案寫入內容的時候,資料被存放到了data block當中。而該檔案的檔名,被存放到了該檔案所在的目錄檔案當中。

對於目錄這種「特殊的檔案」,可以簡單地理解為是一張表,這張表裡面存放了隸屬於該目錄的檔案的檔名,以及所匹配的inode編號。

因此,在linux裡面,檔案被「拆分」到了3個地方,索引存於inode,檔名存於目錄,資料存於data block。

2、關於硬鏈結以及複製

基於上述內容對於目錄的描述,可以比較容易解釋linux裡面的另外乙個重要的概念: hard link(硬鏈結)。

對於檔案而言,真正的id是inode編號,而並非檔名。回憶一下目錄檔案: 一張含有檔名和inode編號的表。在這張表裡面,我們暫定用乙個如下結構表示乙個檔案: [directory : (filename, inode_number)],這裡以/etc/passwd檔案舉例,假設其inode編號為123456(確實有點兒假……),則可以寫為[/etc/ : (passwd, 123456)],假設我們在終端上面鍵入了如下命令:

[root@centos7-front1 ~]# ln /etc/passwd /root/hard_link_passwd

則會在/root目錄下面出現乙個新的檔名,叫做hard_link_passwd。如果用上述結構表示這個檔案,則為[/root/ : (hard_link_passwd, 123456)],因此,這種目錄或檔名不同,但是inode編號相同的檔案,稱為硬鏈結。由於硬鏈結inode編號相同,而且對於同乙個inode結構體,便會擁有相同的位址對映以及相同的塊裝置鍊錶。因此,對於使用者空間而言,修改/etc/passwd,就相當於修改了/root/hard_link_passwd,反之亦然。

同樣基於上述內容對於目錄的描述,針對i_device相同的mv操作,僅僅是刪除了原目錄裡面對應的[directory : (filename, inode_number)],並且在目標目錄新建了另乙個[directory : (filename, inode_number)],由於並沒有對於data block的任何操作,因此速度很快。

3、初步檢視inode

利用ls -i命令可以檢視到當前目錄下面的所有檔案的inode編號,注意inode編號僅僅是inode結構體裡面的一項,並不代表inode全部,下面擷取/etc/目錄下的前5個檔案:

[root@centos7-front1 etc]# ls -i | head -n 5

768684 abrt

34370879 adjtime

33554592 aliases

35506331 aliases.db

100705463 alternatives

利用stat命令可以檢視乙個檔案更加詳細的inode資訊,包括inode編號,占用的塊數量,塊大小,硬鏈結個數,atime, mtime, ctime, ……下面用stat命令檢視/etc目錄(如上文所說,目錄也是一種特殊的檔案)

[root@centos7-front1 /]# stat /etc

file: 『/etc』

size: 8192 blocks: 24 io block: 4096 directory

device: 803h/2051d inode: 33554561 links: 85

access: (0755/drwxr-xr-x) uid: ( 0/ root) gid: ( 0/ root)

access: 2017-03-28 17:13:00.510221799 -0400

modify: 2017-03-28 12:37:32.150999451 -0400

change: 2017-03-28 12:37:32.150999451 -0400

birth: -

4、inode使用情況以及大小

inode也會消耗硬碟空間,所以硬碟格式化的時候,作業系統自動將硬碟分成兩個區域。乙個是資料區,存放檔案資料;另乙個是inode區(inode table),存放inode所包含的資訊。

每個inode節點的大小,一般是128位元組或256位元組。inode節點的總數,在格式化時就給定,一般是每1kb或每2kb就設定乙個inode。假定在一塊1gb的硬碟中,每個inode節點的大小為128位元組,每1kb就設定乙個inode,那麼inode table的大小就會達到128mb,佔整塊硬碟的12.8%。

檢視每個硬碟分割槽的inode總數和已經使用的數量,可以使用df命令。

[root@centos7-front1 ~]# df -i

filesystem inodes iused ifree iuse% mounted on

/dev/sda3 23860224 59694 23800530 1% /

devtmpfs 122809 367 122442 1% /dev

tmpfs 125170 1 125169 1% /dev/shm

tmpfs 125170 433 124737 1% /run

tmpfs 125170 13 125157 1% /sys/fs/cgroup

/dev/sda1 256000 329 255671 1% /boot

tmpfs 125170 1 125169 1% /run/user/0

檢視某個分割槽的檔案系統所分配的單個inode節點的大小,在ext檔案系統下,可以使用dumpe2fs命令,例如centos6系統上,針對/dev/sda3分割槽:

[root@macentos6 ~]# dumpe2fs -h /dev/sda3 | grep -i 「inode size」

dumpe2fs 1.41.12 (17-may-2010)

inode size: 256

在xfs檔案系統下,可以使用xfs_info命令,例如centos7系統上,針對/dev/sda3分割槽:

[root@centos7-front1 ~]# xfs_info /dev/sda1

meta-data=/dev/sda1 isize=256 agcount=4, agsize=16000 blks

= sectsz=512 attr=2, projid32bit=1

= crc=0 finobt=0

data = bsize=4096 blocks=64000, imaxpct=25

= sunit=0 swidth=0 blks

naming =version 2 bsize=4096 ascii-ci=0 ftype=0

log =internal bsize=4096 blocks=853, version=2

= sectsz=512 sunit=0 blks, lazy-count=1

realtime =none extsz=4096 blocks=0, rtextents=0

linux公社

Linux 目錄與常用linux目錄操作命令

一 linux 的檔案系統 linux 中一切皆檔案,無論何種格式,都是檔案。windows中,系統存放在不同的驅動器碟符上,有c盤 d盤等。而在linux中,檔案系統包含排列在儲存裝置上 磁碟 其他區塊儲存裝置 它是乙個樹形的結構。在系統的這顆樹中,樹根叫做 也就是root,樹根伸展出來的目錄有很...

Linux目錄與路徑

絕對路徑 正確度較好 相對路徑 目錄間切換簡便 特殊目錄 表示當前目錄 表示當前目錄的上一層目錄 表示當前的工作目錄 表示當前使用者身份所在的家目錄 count 表示count使用者的家目錄 根目錄的上層與根目錄是同乙個目錄。目錄指令 1.cd 變換目錄 change directory cd 直接...

Linux文件與目錄

一 相對路徑與絕對路徑 相對路徑 相對於當前工作目錄的路徑 例如 當前工作目錄在 usr share doc下,要轉到 usr share man目錄下,可以使用cd man指令 絕對路徑 一定由根目錄 寫起 例如 usr share doc 二 特殊的目錄 當前目錄.前乙個工作目錄 當前使用者所在...