Nexus 5x(安卓8.1)下目录重定向:符号链接或绑定挂载的正确方案
解决Android外部存储软链接无效的问题(Nexus 5x 8.1.0 Root)
我之前碰到过一模一样的情况,Android的外部存储(也就是你这里的/storage/self/primary,其实是/sdcard的别名)用的是sdcardfs或者fuse这类虚拟化文件系统,它们对软链接的支持非常有限——尤其是APP在沙箱环境下访问时,系统的路径转换机制会让软链接无法被正确解析,这就是你用ln -s无效的核心原因。
推荐用**bind mount(绑定挂载)**来解决,这是文件系统级的映射,比软链接可靠得多,APP会直接“看到”原目录指向的同步目录内容。下面是具体步骤:
操作步骤(需Root权限)
准备目标目录并迁移数据
先确保同步目录存在,把原目录的内容移过去:# 创建目标目录(如果不存在) mkdir -p /storage/self/primary/sync/phone/sleep-data # 迁移原目录的所有内容 mv /storage/self/primary/sleep-data/* /storage/self/primary/sync/phone/sleep-data/清理原目录并创建空目录
原目录必须是空的才能绑定挂载,所以先删除再重建:# 删除原目录(确保已迁移所有数据!) rmdir /storage/self/primary/sleep-data # 创建空的原目录作为挂载点 mkdir /storage/self/primary/sleep-data执行绑定挂载
用mount --bind命令把目标目录绑定到原目录:mount --bind /storage/self/primary/sync/phone/sleep-data /storage/self/primary/sleep-data执行完后,你可以测试一下往原目录写入文件,看看同步目录里是否会出现对应的内容。
设置开机自动挂载(可选但必要)
上面的挂载重启后会失效,需要让系统开机自动执行:- 如果你的系统支持
init.d:
创建一个脚本文件/system/etc/init.d/99_bind_sleep_data,内容如下:
然后给脚本加执行权限:#!/system/bin/sh # 延迟10秒确保外部存储已挂载 sleep 10 mount --bind /storage/self/primary/sync/phone/sleep-data /storage/self/primary/sleep-datachmod 755 /system/etc/init.d/99_bind_sleep_data - 如果用Magisk(更推荐,原生系统Root后常装):
在/data/adb/service.d/目录下创建同样的脚本(文件名可以随便取,比如bind_sleep_data.sh),Magisk会在系统启动后自动执行这个目录的脚本,不需要额外设置权限。
- 如果你的系统支持
为什么软链接不行?
Android的sdcardfs是为了实现APP沙箱隔离设计的,它会把APP访问的/storage/self/primary路径转换成对应的私有存储路径,软链接的原始路径在这个转换过程中会被破坏,导致APP无法正确跟随链接到目标目录。而bind mount是直接在文件系统层把两个目录绑定,对APP来说完全透明,就像访问原目录一样,不会有路径解析的问题。
操作前记得备份数据,避免意外丢失哦!
内容的提问来源于stack exchange,提问作者mtfurlan




