关于在exFAT中使用软链接的问题探究

起因

在路由器上通过挂载U盘跑了一些程序,但是U盘没两天就频繁掉盘不识别,于是换了个质量好的U盘,将所有文件通过Win10复制了再挂载去执行,但是此时很多却无法启动了,又换回原U盘,此时正常启动。经过排查,发现是U盘中软链接失效的问题,在路由器上通过Shell修复新U盘上对应的几个软链接后,事情解决。但是此时为什么通过Win10复制文件会造成软链接失效的原因,引起了我探究的好奇。

分析

首先确定一点,U盘是exFAT格式,在查询了相关规范后发现其标准并不支持软链接这一操作。所以经Win10复制后,软链接失效是没有问题的。之所以路由器在exFAT上支持软链接,想必是其实现模块在标准上做了一些扩展支持。于是接着往下找路由器相关的问题。

路由器采用的是OpenWrt19.07,exFAT由kmod-fs-exfat实现支持,它是在exfat-nofuse的基础上编译出来的。继续查找exfat-nofuse代码,看到其确实是支持了非标准的软链接操作。正是这一部分代码,造成了我在起因一节中的问题。

结论

在使用exFAT时,不建议使用软链接,因为其标准并不支持这一操作。即使某个模块的这个版本的支持,但也不能保证后续版本是否还会支持。同时,在跨平台使用时,也不能保证兼容不出问题。

我的是使用virtualenv创建Python环境时创建的软链接,在这种情况下可以酌情添加--always-copy参数来避免意外的发生。

参考

  1. OpenWrt19.07上的kmod-fs-exfat
  2. GitHub上的exfat-nofuse源码
  3. Kernel上删除exFAT软链接特性的详述