Android 11下如何将MicroSD卡挂载到所有Mount Namespace?
解决Android下SD卡全局挂载到所有Namespace的方法
核心原理
Android 7.0及以上版本引入了隔离的Mount Namespace,每个应用进程(包括系统应用)都拥有独立的挂载空间,仅在root或init的namespace中挂载无法同步到其他进程。要实现全局可见,需利用shared mount特性同步挂载,同时处理已运行进程的namespace同步,确保新启动进程自动继承挂载状态。
具体操作步骤
1. 设置挂载目录为shared属性
先进入init的namespace(PID为1的进程空间),将/storage目录设置为shared,这样后续挂载操作会自动传播到继承该挂载的其他namespace:
nsenter -t 1 -m mount --make-shared /storage
这是实现全局挂载的关键前提,若跳过此步骤,挂载仅会在当前namespace生效。
2. 在init的namespace中完成SD卡挂载
继续在init的namespace中执行挂载命令:
nsenter -t 1 -m mount -t sdfat /dev/block/mmcblk0p1 /storage/0123-4567
此时新启动的所有进程都会自动继承这个挂载点,但已运行的进程不会同步。
3. 同步已运行进程的Namespace
要让正在运行的应用也能看到挂载点,需遍历所有进程,在各自的namespace中执行bind挂载:
for pid in $(ps -A | grep -v PID | awk '{print $1}'); do if [ -d /proc/$pid/ns/mnt ]; then nsenter -t $pid -m mount --bind /storage/0123-4567 /storage/0123-4567 fi done
4. 验证挂载效果
在任意应用的shell环境(比如Termux切换到普通用户权限)中执行:
ls /storage/0123-4567
若能看到SD卡内的文件,说明挂载已同步到该应用的namespace。
注意事项
- 确保
/storage/0123-4567目录已存在,若不存在先执行nsenter -t 1 -m mkdir -p /storage/0123-4567 - 部分定制ROM可能限制挂载权限,若bind挂载失败,可尝试添加
--rw参数 - 重启后挂载会失效,如需持久化,可将上述命令写入Magisk启动脚本(放置在
/data/adb/post-fs-data.d/或/data/adb/service.d/目录下)
内容的提问来源于stack exchange,提问作者Сергей Евтухов
相关产品推荐
相关产品推荐

