Как работает монтирование Magisk?
Pre. S. Да, я задал этот же вопрос на английском SO. Но я предпочту перезадать вопрос тут (заодно переведу на русский), чтобы соотечественникам было проще понять меня и ответить на вопрос. Честно, отчаялся искать ответ на свой вопрос
Сам вопрос:
Как работает монтирование Magisk? Я вначале обратил внимание на mount:
~ # mount
# покажу только важные точки монтирования
/sbin/.magisk/block/system_root at /sbin/.magisk/mirror/system_root
tmpfs on /system/bin # судя по всему, смонтирован Magisk-ом
tmpfs on /system/etc # Судя по всему, смонтирован Magisk-ом
tmpfs on /tmp # Моя собственная точка монтирования, делаю через init.d
/dev/block/mmcblk0p69 on / type ext4 (ro)
~ # touch /system/bin/binary
# Success
~ # mount -t tmpfs tmpfs /
~ # touch /test
Error: read-only system
/ # mount --bind /tmp /vendor/etc
# /tmp пустой
/ # ls /vendor/etc
/ # umount /vendor/etc
/ # ls /vendor/etc
IPACM_cfg.xml
NOTICE.xml.gz
a2dp_in_audio_policy_configuration.xml
acdbdata
audio
...
Здесь возникает ряд вопросов. Я спрашивал и тут, искал ответы в Google, читал код Magisk-а (я немного знаю C++). Нашёл только функцию в xwrap.hpp (может быть это то самое "magic mount"):
int xmount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data);
Выглядит как mount() в sys/mount.h... Но здесь функция xmount() пустая!
Следующий вопрос о tmpfs. Почему я могу писать в [Magisk-овый] tmpfs в /system/bin, но не могу писать в свой tmpfs, который я смонтировал командой в /?
Я думал, что Magisk использует overlayfs или mhddfs. Но моё ядро эти ФС не поддерживает. Больше того, у меня нет поддержки aufs или unionfs! Так как работает монтирование Magisk???
Следующий вопрос. Зачем Magisk-у свои блочные устройства??
~ # ls /sbin/.magisk/block
data
system_root
vendor
~ # mount | grep /sbin/.magisk/block
/sbin/.magisk/block/system_root on /system/xbin/7z
/sbin/.magisk/block/system_root on /system/xbin/htop
...
~ # dd if=/sbin/.magisk/block/system_root of=./system.img
~ # losetup /dev/block/loop0 ./system.img
~ # mount -t ext4 /dev/block/loop0 /data/local/mnt
~ # ls /data/local/mnt/system/bin
# только стандартные файлы, никаких модульных файлов
ЧТО ЭТО???
1: Неужели возможно "ассоциировать" с реальным разделом/loop-образом более 1 блочного устройства?
2: Я понял, как монтировать В ФАЙЛ (не файл [образа] куда-либо). Но здесь странная ситуация: один блочный девайс на нескольких РАЗНЫХ файлах?? Содержащий при том реальный system раздел, и ни одного файла модуля? Это как вообще работает?
3: Как Magisk монтирует tmpfs поверх системного раздела? Когда я пытаюсь писать в /system/bin, запись идёт в tmpfs, а не реальный раздел. Когда я пытаюсь писать в tmpfs, смонтированный в /, я пишу на реальный раздел, tmpfs игнорируется (почему).
4: Как Magisk монтирует модули? Здесь явно используется не классический mount --bind: я показывал, к чему это на самом деле приведёт. Но когда Magisk монтирует, я могу видеть (и даже использовать) и системные файлы, и файлы модулей, как если бы они лежали в одной папке, одном разделе.