不同 ext4 分区的文件系统块大小不同

ART*_*ART 5 linux partition gpt mkfs e2fsprogs

我们有基于 BBB 的定制板,带有 256MB RAM 和 4GB eMMC,

我已经使用下面的代码对其进行了分区,

parted --script -a optimal /dev/mmcblk0 \
  mklabel gpt \
  mkpart primary 128KiB 255KiB \
  mkpart primary 256KiB 383KiB \
  mkpart primary 384KiB 511KiB \
  mkpart primary 1MiB 2MiB \
  mkpart primary 2MiB 3MiB \ 
  mkpart primary 3MiB 4MiB \
  mkpart primary 4MiB 5MiB \ 
  mkpart primary 5MiB 10MiB \
  mkpart primary 10MiB 15MiB \
  mkpart primary 15MiB 20MiB \
  mkpart primary 20MiB 21MiB \
  mkpart primary 21MiB 22MiB \
  mkpart primary 22MiB 23MiB \
  mkpart primary 23MiB 28MiB \
  mkpart primary ext4 28MiB 528MiB \
  mkpart primary ext4 528MiB 1028MiB \
  mkpart primary ext4 1028MiB 1128MiB \
  mkpart primary ext4 1128MiB 1188MiB \
  mkpart primary ext4 1188MiB 2212MiB \
  mkpart primary ext4 2212MiB 2603MiB \
  mkpart primary ext4 2603MiB 2639MiB \
  mkpart primary ext4 2639MiB 100% \
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令格式化文件系统分区

mkfs.ext4 -j -L $LABEL $PARTITION
Run Code Online (Sandbox Code Playgroud)

现在,当我使用 tune2fs 读取文件系统块大小时,我看到小于 1GiB 的分区和大于或等于 1GiB 的分区的值不同。

# tune2fs -l /dev/mmcblk0p15  | grep Block
Block count:              512000
Block size:               1024
Blocks per group:         8192
# 
# 
# tune2fs -l /dev/mmcblk0p16  | grep Block
Block count:              512000
Block size:               1024
Blocks per group:         8192
# 
# 
# tune2fs -l /dev/mmcblk0p19  | grep Block
Block count:              262144
Block size:               4096
Blocks per group:         32768
# tune2fs -l /dev/mmcblk0p22  | grep Block
Block count:              1191936
Block size:               4096
Blocks per group:         32768
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么块大小不同。此外,mke2fs.conf 仅具有所有默认值,并且提到的块大小为 4096。

[defaults]
    base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
    default_mntopts = acl,user_xattr
    enable_periodic_fsck = 0
    blocksize = 4096
    inode_size = 256
    inode_ratio = 16384

[fs_types]
    ext3 = {
        features = has_journal
    }
    ext4 = {
        features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
        auto_64-bit_support = 1
        inode_size = 256
    }
    ext4dev = {
        features = has_journal,extent,huge_file,flex_bg,uninit_bg,dir_nlink,extra_isize
        inode_size = 256
        options = test_fs=1
    }
    small = {
        blocksize = 1024
        inode_size = 128
        inode_ratio = 4096
    }
    floppy = {
        blocksize = 1024
        inode_size = 128
        inode_ratio = 8192
    }
    big = {
        inode_ratio = 32768
    }
    huge = {
        inode_ratio = 65536
    }
    news = {
        inode_ratio = 4096
    }
    largefile = {
        inode_ratio = 1048576
        blocksize = -1
    }
    largefile4 = {
        inode_ratio = 4194304
        blocksize = -1
    }
    hurd = {
         blocksize = 4096
         inode_size = 128
    }
Run Code Online (Sandbox Code Playgroud)

有人可以解释/建议文档/提示为什么不同分区的块大小不同吗?

ART*_*ART 5

正如@derobert 在评论中提到的那样。

mkfs.ext4/mke2fs 是指/etc/mke2fs.conf并格式化分区。

mke2fs如果没有明确提及,则根据分区大小选择块大小。阅读-b block-size-T usage-type在 mke2fs手册页中相同。

因此,当分区大小小于 512MB 时,将其mkfs.ext4格式化为文件中的small以下设置mke2fs.conf

 small = {
        blocksize = 1024
        inode_size = 128
        inode_ratio = 4096
    }
Run Code Online (Sandbox Code Playgroud)

但是,当分区大小超过 512MBmkfs.ext4mke2fs使用defaultsfrom mke2fs.conffile格式化分区时

[defaults]
    base_features = sparse_super,filetype,resize_inode,dir_index,ext_attr
    default_mntopts = acl,user_xattr
    enable_periodic_fsck = 0
    blocksize = 4096
    inode_size = 256
    inode_ratio = 16384
Run Code Online (Sandbox Code Playgroud)

这就是我在不同分区中导致不同块大小的原因。

再一记。要获得格式化后您将获得的 inode 总数,可以按如下方式计算,

Total number of inodes = partition size / inode_ration
e.g. 
for 500MB partition
total number of inodes = (500 * 1024 * 1024) / 4096
                       = 128000
Run Code Online (Sandbox Code Playgroud)

注:我想我在这里失去了一些东西,因为计算我已经如上图所示,通过显示实际值tune2fs就是Inode count: 128016它几乎一致,但并不确切。