如何使用新的 ext4 内联数据功能? (直接在inode中存储数据)

如何使用新的 ext4 内联数据功能? (直接在inode中存储数据)

如果我正确阅读了 ext4 文档,从 Linux 3.8 开始,在文件非常小的情况下,应该可以将数据直接存储在 inode 中。

我原本期望这样的文件的大小为 0 块,但事实并非如此。

# creating a small file
printf "abcde" > small_file

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

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

我预计这里的最后一个数字是 0。我错过了什么吗?

答案1

要在 ext4 中启用内联数据,你需要使用e2fsprogs1.43 或更高版本。 2014 年 3 月添加了对内联数据的支持Git 存储库但直到 2016 年 5 月才发布。

一旦完成,您就可以mke2fs -O inline_data在适当的设备上运行以创建具有内联数据支持的新文件系统;这将删除您的所有数据。显然还不可能在现有文件系统上激活内联数据(至少tune2fs不支持它)。

现在创建一个小文件,并debugfs在文件系统上运行。cd到适当的目录,然后运行stat smallfile;你会得到类似的东西

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

正如您所看到的,数据是内联存储的。这也可以通过使用df;来看出。创建文件之前:

% 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

创建文件后:

% 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

文件就在那里,它使用索引节点,但可用的存储空间没有改变。

答案2

如果您的e2fsprogs版本太旧,或者文件系统已经创建,您可以使用设置功能标志debugfs(该标志自 2012 年起受支持,而mke2fs其他工具在 2014 年以上添加了支持,许多发行版在 2016 年仍然不提供它们,包括 Ubuntu Xenial)。

为此,请以读写模式打开分区:

debugfs -w /dev/sdxx

然后添加标志:

feature inline_data

(或者feature -inline_data将其关闭,但如果已经存在内联文件,这可能是一个非常糟糕的主意!)

但请注意,如果您的系统e2fsprogs很旧,您就会把自己逼入困境,因为实用程序(包括debugfs其本身)在设置标志后将拒绝接触这样的文件系统。

另请注意,当前GRUB(2.02)不支持此功能,因此将其设置在启动分区上将使系统无法启动。有一个未合并的修补添加支持。

截至撰写本文时,最多inode_size-128可以内联文件和目录,因此默认 256 字节 inode 为 128 字节。如果您想要更多内联,可以使用更大的索引节点。

相关内容