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


9

如果我正确地阅读了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 blocks used by files
stat --printf='%b\n' small_file
8

我希望这里的最后一个数字为0。我缺少什么吗?


1
这可能是一个文件系统选项,在创建文件系统期间需要启用该选项,以防止在以后使用旧内核挂载文件系统时出现问题。
wurtel

Answers:


7

要在中启用内联数据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

该文件在那里,它使用一个索引节点,但可用存储空间未更改。


4

如果您的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字节的索引节点为128字节。如果需要更多内联,则可以使用较大的inode。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.