Как использовать новую функцию Ext4 Inline Data? (хранение данных непосредственно в 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. Я что-то упустил?

Manu
источник
1
Вероятно, это опция файловой системы, которую нужно включить во время создания файловой системы, чтобы предотвратить проблемы, если вам случится смонтировать файловую систему со старым ядром в более позднее время.
wurtel

Ответы:

7

Чтобы включить встроенные данные ext4, вам понадобится e2fsprogs1.43 или более поздняя версия. Поддержка встроенных данных была добавлена ​​в марте 2014 года в gitхранилище, но была выпущена только в мае 2016 года.

Как только вы это сделаете, вы можете запустить 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себя) откажутся прикасаться к такой файловой системе после установки флага.

Также обратите внимание, что current GRUB(2.02) не поддерживает это, поэтому установка его в загрузочном разделе сделает систему не загружаемой. Есть неочищенный патч для добавления поддержки.

На момент написания этой статьи файлы и каталоги inode_size-128могли быть встроены до 128 байтов для 256-байтовых inode по умолчанию. Вы можете использовать большие inode, если хотите больше встроенных.

Вентилятор
источник