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 子目录的限制了.
标签:ext4,blocks,验证,Journal,子目录,文件系统,Filesystem,inode
From: https://www.cnblogs.com/jinanxiaolaohu/p/18072767