rsync同步MTP挂载Android文件报Operation not supported(95)错误
问题根因
报Operation not supported (95)和权限、安卓设备是否root没有关系,本质是MTP协议自身的功能限制:
- MTP是面向媒体传输设计的简单协议,不支持类Unix文件系统的常规操作:包括修改文件修改时间戳、设置文件权限、创建临时文件再原子重命名的写入逻辑,刚好和rsync默认的工作逻辑冲突。
- 你访问的
/run/user/1000/gvfs/下的MTP路径是GVFS提供的用户态虚拟文件系统,哪怕加sudo提权也绕不开协议层面的功能缺失。rsync默认的-ra参数中,-a归档模式隐含了保留修改时间、保留权限、临时文件写入等操作,必然触发报错。
解决方案
方案1:调整rsync参数适配MTP挂载(无额外安卓端配置)
直接调整rsync参数,避开所有MTP不支持的操作,不需要在手机上装任何软件:
# 从PC同步到手机示例 rsync -r --checksum --no-perms --no-owner --no-group --no-times --inplace /home/yourname/Obsidian/ /run/user/1000/gvfs/mtp:host=243c3c45/cellular/Obsidian/ # 从手机同步到PC示例 rsync -r --checksum --no-perms --no-owner --no-group --no-times --inplace /run/user/1000/gvfs/mtp:host=243c3c45/cellular/Obsidian/ /home/yourname/Obsidian/
参数说明:
-r:仅递归遍历子目录,去掉-a附带的所有属性保留逻辑--checksum:通过文件内容校验和判断版本新旧,替代默认的修改时间比对逻辑,精准识别文件更新;如果追求速度可以换成--size-only,仅当文件大小不一致时才同步--no-perms --no-owner --no-group --no-times:显式关闭所有属性同步操作,完全不尝试修改MTP不支持的文件元数据--inplace:直接写入目标文件,不生成.xxx.随机后缀的临时文件,解决mkstemp失败的报错
双向同步注意:不要直接连续执行两次单向rsync,需要先比对两端同名文件的校验和,确认哪端是更新版本后再执行单方向覆盖,避免旧文件覆盖新内容。
方案2:基于ADB的同步方案(稳定性优于MTP)
MTP传输大量小文件时容易出现断连、文件属性读取异常的问题,用ADB传输可以完全绕过GVFS的MTP挂载逻辑:
- 在安卓端开启系统自带的「USB调试」,PC端安装adb工具,连接后执行
adb devices确认设备被正常识别 - 使用adb自带的sync功能,或者基于adb实现的同步工具直接双向同步Obsidian目录,不需要在安卓端安装额外应用,未root设备完全可用,不会触发操作不支持的报错。
方案3:Termux SSH通道同步(支持原生rsync全特性)
如果需要保留基于文件修改时间的比对逻辑,可以在安卓端安装Termux配置SSH环境:
- 安卓端安装Termux,执行
pkg install openssh rsync,给Termux授予存储访问权限后启动sshd服务 - PC端通过USB做端口转发连接Termux的SSH服务,直接用标准rsync命令同步目录即可。此时rsync操作的是Termux有权限访问的本地存储,完全支持时间戳修改、临时文件写入等所有操作,同步可靠性和速度都远高于MTP挂载。
内容的提问来源于stack exchange,提问作者macbeto
相关产品推荐
相关产品推荐

