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 子目錄的限制了.