Linux – the difference between “inode size” and “Bytes per inode”

ext2linuxmkfs

Below information is taken from man page,I would like to know the difference between bytes-per-inode and Inode-size?

-i bytes-per-inode

Specify the bytes/inode ratio. mke2fs creates an inode for every bytes-per-inode bytes of space on the disk. The larger the bytes-per-inode ratio, the fewer inodes will be created. This value generally shouldn't be smaller than the blocksize of the filesystem, since then too many inodes will be made.Be warned that is not possible to expand the number of inodes on a filesystem after it is created, so be careful deciding the correct value for this parameter.

-I inode-size

Specify the size of each inode in bytes.mke2fs creates 256-byte inodes by default. In kernels after 2.6.10 and some earlier vendor kernels it is possible to utilize inodes larger than 128 bytes to store extended attributes for improved performance.The inode-size value must be a power of 2 larger or equal to 128.The larger the inode-size the more space the inode table will consume, and this reduces the usable space in the filesystem and can also negatively impact performance.Extended attributes stored in large inodes are not visible with older kernels, and such filesystems will not be mountable with
2.4 kernels at all.It is not possible to change this value after the filesystem is created.

Best Answer

Well, first, what is an inode? In the Unix world, an inode is a kind of file entry. A filename in a directory is just a label (a link!) to an inode. An inode can be referenced in multiple locations (hardlinks!).

-i bytes-per-inode (aka inode_ratio)

For some unknown reason this parameter is sometime documented as bytes-per-inode and sometime as inode_ratio. According to the documentation, this is the bytes/inode ratio. Most human will have a better understanding when stated as either (excuse my english):

  • 1 inode for every X bytes of storage (where X is bytes-per-inode).
  • lowest average-filesize you can fit.

The formula (taken from the mke2fs source code):

inode_count = (blocks_count * blocksize) / inode_ratio

Or even simplified (assuming "partition size" is roughly equivalent to blocks_count * blocksize, I haven't checked the allocation):

inode_count = (partition_size_in_bytes) / inode_ratio

Note 1: Even if you provide a fixed number of inode at FS creation time (mkfs -N ...), the value is converted into a ratio, so you can fit more inode as you extend the size of the filesystem.

Note 2: If you tune this ratio, make sure to allocate significantly more inode than what you plan to use... you really don't want to reformat your filesystem.

-I inode-size

This is the number of byte the filesystem will allocate/reserve for each inode the filesystem may have. The space is used to store the attributes of the inode (read Intro to Inodes). In Ext3, the default size was 128. In Ext4, the default size is 256 (to store extra_isize and provide space for inline extended-attributes). read Linux: Why change inode size?

Note: X bytes of disjkspace is allocated for each allocated inode, whether is free or used, where X=inode-size.