LINUX.ORG.RU

Ext4 shared_blocks как создают такие образа?

 , shared blocks


2

4

Наткнулся в андройде на образы ext4 с дедупликацией на блочном уровне.

В фичах стоит shared_blocks.

Такой образ монтируется только при явном указании ro

mount -o ro systaem_a.img test

В режиме rw ругается на неподдерживаемые фичи.

EXT4-fs (loop0): couldn't mount RDWR because of unsupported optional features (4000)

Если добавить ему места и раздедуплицировать, то фича shared_blocks исчезает

resize2fs -f system_a.img 6G
e2fsck -y -E unshare_blocks system_a.img

было:
Filesystem features:      ext_attr dir_index filetype extent sparse_super large_file huge_file uninit_bg dir_nlink extra_isize shared_blocks

стало:
Filesystem features:      ext_attr dir_index filetype extent sparse_super large_file huge_file uninit_bg dir_nlink extra_isize

и теперь можно монтировать образ в rw.

Но вопросы. Какого хрена нигде не описана эта фича? Как вообще создают такие образы? Можно ли обратно сжать раздедуплицированный образ? Три часа гугления - ноль результатов…

★★★★★
Ответ на: комментарий от t184256
#define EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS	0x4000

Ну хоть понятно, откуда это число 4000 в логе.

Почитал, это вроде как раз добавили чтение в RO таких образов с shared blocks. А вот как их создают? Должны же быть какие то инструменты типа mkisofs, раз в режиме записи они не работают…

AVL2 ★★★★★
() автор топика
Ответ на: комментарий от AVL2

В патче, на который давали ссылку, задевается утилита e2fsdroid: добавляется флаг -s. Мне кажется, это как раз и есть нужная тебе программа. Утилиту, видимо, нужно собирать самому. И искать, как её запускать, тоже где-то нужно на стороне. Встроенной помощи у неё нет.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Да, невнимательно посмотрел. Это же github tytso, разработчика e2fsprogs. А оно в контрибах затесалось.

Там еще скрипт подозрительный dir2fs

Создает из директории минифицированную файловую систему ext4

mke2fs -i "${ratio}" -T ext4 -d "${dir}" -O ^resize_inode,sparse_super2,metadata_csum,64bit,^has_journal -E packed_meta_blocks=1,num_backup_sb=0 -b "${block_sz}" -I "${inodesz}" -F "${dev}" "${mkfs_blocks}" || exit

Но из всего этого подозрительно только packed_meta_blocks=1 и то очень сомнительно.

А еще он делает

e2image -ar "${dev}" "${dev}.min"; mv "${dev}.min" "${dev}")

Вот этот e2image -ar дампит файловую систему в минифицированном виде. Только занятые блоки метаданные и вполне может сжимать их.

AVL2 ★★★★★
() автор топика
Последнее исправление: AVL2 (всего исправлений: 1)
Ответ на: комментарий от AVL2

Не думаю, что в mke2fs есть что-то нужное. Судя по коду патча, управляет дедупликацией флаг EXT2_FLAG_SHARE_DUP, но он устанавливается только в contrib/android/e2fsdroid.c, а в остальных местах он только проверяется. Стало быть, только e2fsdroid.

Возможно, вот тут будет что-то полезное для понимания аргументов e2fsdroid: https://android.googlesource.com/platform/system/extras/+/master/ext4_utils/mkuserimg_mke2fs.py. Сам не вникал.

Создает из директории минифицированную файловую систему ext4

Не знал, что mke2fs умеет ФС сразу файлами наполнять. Возможно, получится сделать дедупликацию посредством mke2fs, если где-нибудь в неё воткнуть установку флага EXT2_FLAG_SHARE_DUP.

i-rinat ★★★★★
()

Большое спасибо всем, кто отвечал. Боле-менее прояснилось.

Действительно, эти образы создаются утилитой e2fsdroid, которая входит в состав platform_tools, а в линуксе в пакет android_tools

туда вообще входит все для распаковки и упаковки образов, можно было не лазить по 4pda

rpm -ql android-tools
/usr/bin/adb
/usr/bin/append2simg
/usr/bin/avbtool
/usr/bin/e2fsdroid
/usr/bin/ext2simg
/usr/bin/fastboot
/usr/bin/img2simg
/usr/bin/lpadd
/usr/bin/lpdump
/usr/bin/lpflash
/usr/bin/lpmake
/usr/bin/lpunpack
/usr/bin/mkbootimg
/usr/bin/mkdtboimg
/usr/bin/mke2fs.android
/usr/bin/repack_bootimg
/usr/bin/simg2img
/usr/bin/unpack_bootimg

Отдельно есть скрипт-обертка на питоне с боле-менее человеческими опциями.

https://android.googlesource.com/platform/system/extras/+/master/ext4_utils/mkuserimg_mke2fs.py

В общем, вопрос закрыт. Спасибо еще раз, особенно @i-rinat и @t184256

AVL2 ★★★★★
() автор топика
Ответ на: комментарий от AVL2

Потестировал, образ создается в два этапа. в директории src создаем содержимое будущей ФС

Создаем пустой образ ext4 -

mke2fs  -b 4096 test.img 100000

а затем заполняем его из директории src:

 e2fsdroid -e -s -f src  test.img
AVL2 ★★★★★
() автор топика