linux分区疑难问题
mkfs.ext4指定inode数量不生效
问题描述
通过mkfs.ext4指定inode数量时,实际生成的inode数量与指定的不符
操作
- 格式化分区
mkfs.ext4 /dev/sdb1 -b 1024 -N 1
- 挂载分区
mount /dev/sdb1 data1
- 查看inode数量,发现虽然指定了1个,但是实际存在56个inode
[root@k8s-master mount]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
devtmpfs 124180 370 123810 1% /dev
tmpfs 126204 2 126202 1% /dev/shm
tmpfs 126204 393 125811 1% /run
tmpfs 126204 17 126187 1% /sys/fs/cgroup
/dev/mapper/centos-root 1496992 1445511 51481 97% /
/dev/sda1 512000 337 511663 1% /boot
/dev/sdb1 56 11 45 20% /root/mount/data1
分析
- 查看分区情况
[root@k8s-master mount]# tune2fs -l /dev/sdb1 |grep Inode Inode count: 56 Inodes per group: 8 Inode blocks per group: 1 Inode size: 128
- 发现存在inode 45个
- 每个inode大小为128k
- 查看分区详细情况
[root@k8s-master mount]# dumpe2fs /dev/sdb1 dumpe2fs 1.42.9 (28-Dec-2013) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: 1022cd8d-4106-46a2-a85d-b365c0f8bdfc Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 56 Block count: 50176 Reserved block count: 2508 Free blocks: 45012 Free inodes: 45 First block: 1 Block size: 1024 Fragment size: 1024 Group descriptor size: 64 Reserved GDT blocks: 256 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 8 Inode blocks per group: 1 Flex block group size: 16 Filesystem created: Fri Oct 30 03:52:18 2020 Last mount time: n/a Last write time: Fri Oct 30 03:52:18 2020 Mount count: 0 Maximum mount count: -1 Last checked: Fri Oct 30 03:52:18 2020 Check interval: 0 (<none>) Lifetime writes: 4446 kB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: e9717272-a68b-4d21-84ed-5fe6c5135e52 Journal backup: inode blocks Journal features: (none) 日志大小: 4096k Journal length: 4096 Journal sequence: 0x00000001 Journal start: 0 Group 0: (Blocks 1-8192) Checksum 0xdf02, unused inodes 0 主 superblock at 1, Group descriptors at 2-2 保留的GDT块位于 3-258 Block bitmap at 259 (+258), Inode bitmap at 275 (+274) Inode表位于 291-291 (+290) 7899 free blocks, 0 free inodes, 1 directories 可用块数: 287-290, 298-8192 可用inode数: Group 1: (Blocks 8193-16384) Checksum 0x7f00, unused inodes 5 备份 superblock at 8193, Group descriptors at 8194-8194 保留的GDT块位于 8195-8450 Block bitmap at 260 (bg #0 + 259), Inode bitmap at 276 (bg #0 + 275) Inode表位于 292-292 (bg #0 + 291) 7934 free blocks, 5 free inodes, 1 directories, 5个未使用的inodes 可用块数: 8451-16384 可用inode数: 12-16 Group 2: (Blocks 16385-24576) [INODE_UNINIT] Checksum 0x8d93, unused inodes 8 Block bitmap at 261 (bg #0 + 260), Inode bitmap at 277 (bg #0 + 276) Inode表位于 293-293 (bg #0 + 292) 4096 free blocks, 8 free inodes, 0 directories, 8个未使用的inodes 可用块数: 20481-24576 可用inode数: 17-24 Group 3: (Blocks 24577-32768) [INODE_UNINIT] Checksum 0xdf00, unused inodes 8 备份 superblock at 24577, Group descriptors at 24578-24578 保留的GDT块位于 24579-24834 Block bitmap at 262 (bg #0 + 261), Inode bitmap at 278 (bg #0 + 277) Inode表位于 294-294 (bg #0 + 293) 7934 free blocks, 8 free inodes, 0 directories, 8个未使用的inodes 可用块数: 24835-32768 可用inode数: 25-32 Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT] Checksum 0x17c6, unused inodes 8 Block bitmap at 263 (bg #0 + 262), Inode bitmap at 279 (bg #0 + 278) Inode表位于 295-295 (bg #0 + 294) 8192 free blocks, 8 free inodes, 0 directories, 8个未使用的inodes 可用块数: 32769-40960 可用inode数: 33-40 Group 5: (Blocks 40961-49152) [INODE_UNINIT] Checksum 0xa207, unused inodes 8 备份 superblock at 40961, Group descriptors at 40962-40962 保留的GDT块位于 40963-41218 Block bitmap at 264 (bg #0 + 263), Inode bitmap at 280 (bg #0 + 279) Inode表位于 296-296 (bg #0 + 295) 7934 free blocks, 8 free inodes, 0 directories, 8个未使用的inodes 可用块数: 41219-49152 可用inode数: 41-48 Group 6: (Blocks 49153-50175) [INODE_UNINIT] Checksum 0x9a99, unused inodes 8 Block bitmap at 265 (bg #0 + 264), Inode bitmap at 281 (bg #0 + 280) Inode表位于 297-297 (bg #0 + 296) 1023 free blocks, 8 free inodes, 0 directories, 8个未使用的inodes 可用块数: 49153-50175 可用inode数: 49-56
- 该分区存在7个块分组,由于每个块分组中都要存在inode
- 故每个组至少一个block保存inode
- 而block设置大小为1024,inode大小为128,故每个block可保存1024/128=8个inode
- 七个分组,故总共8*7=56个inode
验证
- 格式化分区
[root@k8s-master mount]# mkfs.ext4 /dev/sdb1 -b 2048 -N 1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=2048 (log=1) 分块大小=2048 (log=1) Stride=0 blocks, Stripe width=0 blocks 32 inodes, 25088 blocks 1254 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=25690112 2 block groups 16384 blocks per group, 16384 fragments per group 16 inodes per group Superblock backups stored on blocks: 16384 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (1024 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
- 通过上述输出发现存在group 2个,每个block大小为2048
- 故inode数量应为2048/128*2=32符合上述inodes数量
mkfs.ext4分区时指定block块大小与小文件大小不一致
问题描述
格式化分区时,指定block大小为1024时,发现目录及小文件占用空间为2个block即2048
操作
- 格式化
mkfs.ext4 /dev/sdb1 -b 1024 -N 1
- block大小为1024
[root@k8s-master data1]# tune2fs -l /dev/sdb1 |grep Block
Block count: 50176
Block size: 1024
Blocks per group: 8192
- 挂载
mount /dev/sdb1 data1
- 发现空文件和文件夹的大小为2048为block大小的2倍
[root@k8s-master data1]# mkdir d1
[root@k8s-master data1]# du -sh *
2.0K a.txt
2.0K d1
- 如果block大小为2048,则空文件及文件夹大小为4k,如果block大小为4096,则空文件及文件夹大小为8k,即永远是block大小的两倍
分析
- 在另一服务器b中查看文件夹及目录大小为4k,并且该节点的block大小为4096
[root@centos75_100-57 temp]# du -sh a.txt
4.0K a.txt
[root@centos75_100-57 temp]# tune2fs -l /dev/sdb1 |grep Block
Block count: 52428544
Block size: 4096
Blocks per group: 32768
- 经查询资料发现问题在于inode size;当inode size为128时,目录及小文件会占用两个block,而当inode size为256时,目录及小文件会占用一个block
- 原因为系统启用SELinux时,128个bytes的inode不足以存储SELinux XATTR,所以需要一个单独的data block来存储这些SELinux XATTR
验证
- 格式化分区并设置inode大小为256
mkfs.ext4 /dev/sdb1 -I 256
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
12544 inodes, 50176 blocks
2508 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=33685504
7 block groups
8192 blocks per group, 8192 fragments per group
1792 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
- 挂载
mount /dev/sdb1 /data1
- 新建空目录,并查看大小,为一个block 大小
[root@k8s-master data1]# du -sh temp/
1.0K temp/
- 关闭sellinux功能
vi /etc/selinux/config
SELINUX=disabled
- 重启虚机
- 重新格式化inode大小为128,并挂载磁盘
umount /dev/sdb1
mkfs.ext4 /dev/sdb1
- 发现文件及目录大小已为block大小
[root@k8s-master data1]# ls -Z .
-rw-r--r-- root root ? a.txt
drwxr-xr-x root root ? d1
drwx------ root root ? lost+found
[root@k8s-master data1]# du -sh *
1.0K a.txt
1.0K d1
12K lost+found