You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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权限)

  1. 准备目标目录并迁移数据
    先确保同步目录存在,把原目录的内容移过去:

    # 创建目标目录(如果不存在)
    mkdir -p /storage/self/primary/sync/phone/sleep-data
    # 迁移原目录的所有内容
    mv /storage/self/primary/sleep-data/* /storage/self/primary/sync/phone/sleep-data/
    
  2. 清理原目录并创建空目录
    原目录必须是空的才能绑定挂载,所以先删除再重建:

    # 删除原目录(确保已迁移所有数据!)
    rmdir /storage/self/primary/sleep-data
    # 创建空的原目录作为挂载点
    mkdir /storage/self/primary/sleep-data
    
  3. 执行绑定挂载
    mount --bind命令把目标目录绑定到原目录:

    mount --bind /storage/self/primary/sync/phone/sleep-data /storage/self/primary/sleep-data
    

    执行完后,你可以测试一下往原目录写入文件,看看同步目录里是否会出现对应的内容。

  4. 设置开机自动挂载(可选但必要)
    上面的挂载重启后会失效,需要让系统开机自动执行:

    • 如果你的系统支持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-data
      
      然后给脚本加执行权限:
      chmod 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

火山引擎 最新活动