Как запускается fs_mgr в Android?

Изучал исходники /init у Android 10. В init/init.cpp вообще не описана работа с fstab, хотя он находится в /vendor, а не в initrd. На удивление, это описано в first_stage_mount.cpp. И вопрос: неужели first_stage_init, даже прежде чем сделать switch_root в /system, монтирует все разделы? Ладно, /system и /vendor описаны в DTB (/proc/devicetree/android/fstab), но остальные-то разделы - в /vendor/etc/fstab. Причём его формат такой:

/dev/block/by-name/userdata /data ext4 rw,nodev forceencrypt

Т е по идее, чтобы правильно спарсить fstab, init-у уже надо сделать switch_root в /system. По крайней мере, second_stage init уже не монтирует разделы... Так что вопрос: какой из init-ов, как и когда монтирует разделы по fstab??

В исходниках я обнаружил некий fs_mgr. Забавно, что его нету ни в /system/bin, ни в /system/xbin, ни в /vendor/bin. /init.rc, правда, пишет интересные вещи:

    # Mount fstab in init.{$device}.rc by mount_all command. Optional parameter
    # '--early' can be specified to skip entries with 'latemount'.
    # /system and /vendor must be mounted by the end of the fs stage,
    # while /data is optional.
    trigger fs
    trigger post-fs

А ещё:

on early-fs
    # Once metadata has been mounted, we'll need vold to deal with userdata checkpointing
    start vold

Получается, /system/bin/vold и отвечает за монтирование? Ну, для system_as_root неудивительно... Но мне этого мало, я хочу узнать параметры /system/bin/vold. Вот ответ от /system/etc/init/vold.rc

service vold /system/bin/vold \
        --blkid_context=u:r:blkid:s0 --blkid_untrusted_context=u:r:blkid_untrusted:s0 \
        --fsck_context=u:r:fsck:s0 --fsck_untrusted_context=u:r:fsck_untrusted:s0
    class core
    ioprio be 2
    writepid /dev/cpuset/foreground/tasks
    shutdown critical
    group root reserved_disk

И тут мне даже стало интересно, за что отвечают параметры vold...

Но ещё интереснее в Android 9:

android10 ~ $ adb connect android9:5555
android10 ~ $ adb root
android10 ~ $ adb shell
android9 ~ # mount
rootfs on / type rootfs
/dev/block/mmcblk0p9 on /system type ext4
...
android9 ~ # cat /init.manta.rc
...
on fs
    mount_all fstab.manta

И вопрос: откуда берётся команда mount_all, если её нету в /sbin?

Впрочем, dmesg говорит такое:

[    2.837756] init: Using Android DT directory /proc/device-tree/firmware/android/

/proc/device-tree, которого нету... [да, я знаю, что там по идее висит DTB ядра и настройки для монтирования /system и /vendor].


Ответы (0 шт):