If I read the ext4 documentation correctly, starting from Linux 3.8 it should be possible to store data directly in the inode in the case of a very small file.

I was expecting such a file to have a size of 0 blocks, but it is not the case.

# creating a small file
printf "abcde" > small_file

# checking size of file in bytes
stat --printf='%s\n' small_file

# number of 512-byte blocks used by file
stat --printf='%b\n' small_file

I would expect this last number here to be 0. Am I am missing something?

  • 1
    It is probably a filesystem option that needs to be enabled during creation of the filesystem, to prevent problems if you would happen to mount the filesystem with an older kernel at some later time.
    – wurtel
    Apr 21 '15 at 14:53

To enable inline data in ext4, you'll need to use e2fsprogs 1.43 or later. Support for inline data was added in March 2014 to the Git repository but was only released in May 2016.

Once you have that, you can run mke2fs -O inline_data on an appropriate device to create a new filesystem with inline data support; this will erase all your data. It's apparently not yet possible to activate inline data on an existing filesystem (at least, tune2fs doesn't support it).

Now create a small file, and run debugfs on the filesystem. cd to the appropriate directory, and run stat smallfile; you'll get something like

Inode: 32770   Type: regular    Mode:  0644   Flags: 0x10000000
Generation: 2302340561    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 6
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
 atime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
 mtime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
crtime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
Size of extra inode fields: 28
Extended attributes:
  system.data (0)
Size of inline data: 60

As you can see the data was stored inline. This can also be seen using df; before creating the file:

% df -i /mnt/new 
Filesystem                           Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg--large--mirror-inline  65536    12 65524    1% /mnt/new
% df /mnt/new 
Filesystem                           1K-blocks  Used Available Use% Mounted on
/dev/mapper/vg--large--mirror-inline   1032088  1280    978380   1% /mnt/new

After creating the file:

% echo Hello > smallfile
% ls -l
total 1
-rw-r--r-- 1 steve steve 6 Apr 22 07:35 smallfile
% df -i /mnt/new
Filesystem                           Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg--large--mirror-inline  65536    13 65523    1% /mnt/new
% df /mnt/new
Filesystem                           1K-blocks  Used Available Use% Mounted on
/dev/mapper/vg--large--mirror-inline   1032088  1280    978380   1% /mnt/new

The file is there, it uses an inode but the storage space available hasn't changed.

  • Can you add the steps to enable this feature on a fresh VPS? Even a rough guide is fine, sth that each of its steps can be Googled. Thanks!
    – HappyFace
    Jun 1 '21 at 11:52
  • @HappyFace there’s one step, as indicated in the answer: mke2fs -O inline_data. On a VPS that might be difficult because that needs to be done when formatting the volume... Jun 1 '21 at 12:15

If your e2fsprogs version is too old, or the filesystem is already created, you can set the feature flag using debugfs (the flag is supported since 2012, whereas mke2fs and the other tools added support on 2014+ and many distributions still don't ship them in 2016, incl. Ubuntu Xenial).

To do so, open the partition in read-write mode:

debugfs -w /dev/sdxx

And then add the flag:

feature inline_data

(or feature -inline_data to toggle it off, but that's probably a really bad idea if there are inline files already!)

Do note, however, if your system e2fsprogs are old, you're driving yourself into a corner, since the utilities (including debugfs itself) will refuse to touch such a filesystem after setting the flag.

Also note that current GRUB (2.02) doesn't support this, so setting it on the boot partition will render the system unbootable. There is an unmerged patch to add support.

As of the time of this writing, files and directories of up to inode_size-128 can be inlined, so 128 bytes for the default 256 byte inodes. You can use larger inodes if you want more inlining.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.