ext4 子目錄數量驗證

济南小老虎發表於2024-03-14

ext4 子目錄數量驗證


背景

最近同事問到一個問題。 
信創linux系統是否預設是ext4的檔案系統。

我這邊一般是使用iso自行安裝, 
檔案系統一般是選擇xfs後者是ext4
最近安裝系統使用ext4比較多一些。

然後突然又問到是不是 ext4 有一個最大子目錄 64000的限制。

我當時有點懵, 感覺比較奇怪。
自己之前只是知道ext4 有一個 inode的概念
磁碟空間不滿 如果inode耗盡也無法建立新檔案。 

但是對單一目錄的子目錄發現子瞭解的不夠深入。

關於檔案系統

檔案系統是作業系統的三大子系統之一。
其他兩個是程序管理和記憶體管理。

檔案系統管理的是儲存裝置。 
程序管理管理的是CPU的時間片。
記憶體管理管理的是虛擬記憶體資源。

檔案系統可以理解為是linux系統 anything is file的載體。
核心其實是VFS的管理。 

他也經歷了很多輪次的發展,最新的檔案系統有
ext3 ext4 xfs brtfs 以及 windows上面常見的ntfs系統。 

關於檔案系統的檢視

df -iTH
可以檢視inode的使用資訊
df -Th 
可以檢視磁碟的空間資訊。

linux裡面每一個檔案都需要一個inode進行管理。
每個inode也會佔用磁碟空間。 剩下的才是檔案自己的內容。 

檢視檔案系統

ext檔案系統使用: dumpe2fs

具體命令為:
dumpe2fs -h /dev/vda2
結果為: 

dumpe2fs 1.45.6 (20-Mar-2020)
Filesystem volume name:   <none>
Last mounted on:          /sysroot
Filesystem UUID:          44877aa0-9554-4e73-8ce7-eba5eaec018f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery 
                        extent 64bit flex_bg sparse_super large_file huge_file 
                        dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              32768000
Block count:              131072000
Reserved block count:     1310720
Free blocks:              126564501
Free inodes:              32418980
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      1024
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Mon Feb 19 17:11:05 2024
Last mount time:          Mon Mar 11 22:44:14 2024
Last write time:          Mon Mar 11 22:44:14 2024
Mount count:              6
Maximum mount count:      -1
Last checked:             Mon Feb 19 17:11:05 2024
Check interval:           0 (<none>)
Lifetime writes:          17 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
First orphan inode:       16911295
Default directory hash:   half_md4
Directory Hash Seed:      3b686e3c-0f54-403b-9c8a-3a35808fbe20
Journal backup:           inode blocks
Checksum type:            crc32c
Checksum:                 0x8d62ebfe
Journal features:         journal_incompat_revoke journal_64bit journal_checksum_v3
Journal size:             1024M
Journal length:           262144
Journal sequence:         0x0000954a
Journal start:            216515
Journal checksum type:    crc32c
Journal checksum:         0xc25e3fca

xfs檔案系統使用 xfs_info

xfs_info /dev/mapper/centos-root

meta-data=/dev/mapper/centos-root isize=512    agcount=32, agsize=87636224 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2804359168, imaxpct=5
         =                       sunit=64     swidth=384 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


關於inode的理解

Block count / Inode count
得出的結果就是 每個inode使用的大小
比如我剛才的就是 
131072000/32768000=4

也就是 4個block 一個 inode。 每個block的大小為:
Block size: 4096

每個inode的大小為:
Inode size: 256
大概 1.5625%的空間用於儲存inode

關於改變大小

透過 -i 指定每個inode對應的大小, 注意需要時位元組數, 
為block的本書的大小。
mkfs.ext4 -i 8192 /dev/vda2

也可以透過 -N 指定inode的數量, 
mkfs.ext4 /dev/sdb -N 102400

關於ext4子目錄檔案數

Filesystem features 的 dir_nlink 非常關鍵。 
沒有這個引數, 最大值是 65000
加上這個引數, 最大值基本上可以理解問事 inode的可用值

測試:
time for i in {1..1000000} ; do mkdir -p  $i ; done
real    80m3.601s
user    5m44.859s
sys     73m47.206s

然後:
time ll |wc -l
1000002

驗證一下刪除時間:
rm -rf  /Testdir/
real    0m24.673s
user    0m3.997s
sys     0m17.431s

dir_nlink的驗證

現在磁碟預設就已經帶了 dir_nlink的設定. 

所以不會有 64k 子目錄的限制了. 

相關文章