Как запускается 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].