h5py无法在Samba服务器上以追加模式打开HDF文件
问题:Samba共享上的HDF文件无法用h5py追加模式打开
重现代码
import h5py path = "/run/user/1000/gvfs/smb-share:server=xyz.com,share=folder/file.h5" h5f = h5py.File(path, mode="a")
报错信息
OSError: [Errno 95] Unable to open file (unable to open file: name = 'run/user/1000/gvfs/smb-share:server=xyz.com,share=folder/file.h5', errno = 95, error message = 'Operation not supported', flags = 1, o_flags = 2)
已验证的情况
- 路径与代码逻辑无错误,**只读模式(
mode="r")**可正常打开文件 - **写入模式(
mode="w")**具备权限,可正常执行 - 将文件复制到本地存储后,**追加模式(
mode="a")**可正常运行
环境
Manjaro Linux 22.0.4 Xfce桌面环境
strace关键输出
openat(AT_FDCWD, "Image 15_long.h5", O_RDWR) = -1 EOPNOTSUPP (Operation not supported) [...] openat(AT_FDCWD, "/home/aurelienb/anaconda3/lib/python3.9/site-packages/h5py/_hl/files.py", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0664, st_size=21326, ...}) = 0 ioctl(3, TCGETS, 0x7ffdf2e0aab0) = -1 ENOTTY (不适合设备的ioctl操作) lseek(3, 0, SEEK_CUR) = 0 fcntl(3, F_DUPFD_CLOEXEC, 0) = 4 sa_flags=SA_RESTORER, sa_restorer=0x7f129480df50}, 8) = 0 exit_group(1) = ? +++ exited with 1 +++
原因分析
从strace输出可见,h5py的追加模式("a")底层会尝试以**O_RDWR(读写)**标志打开文件,但GVFS挂载的Samba共享不支持该操作:
- h5py的追加模式需要同时读取原文件结构(保留现有内容)和写入新数据,因此必须以读写混合模式打开文件
- GVFS对Samba共享的挂载实现中,存在读写混合模式的兼容性限制——单独的读或写操作可正常执行,但
O_RDWR模式会触发"操作不支持"错误
解决方案
临时 workaround
- 先将Samba共享上的HDF文件复制到本地临时目录,使用追加模式修改后再同步回共享目录
- 绕过GVFS,用原生CIFS命令手动挂载Samba共享:
挂载后使用# 创建本地挂载点 sudo mkdir /mnt/smb-share # 挂载共享(替换为你的服务器地址、共享名、用户名和密码) sudo mount -t cifs //xyz.com/folder /mnt/smb-share -o username=你的用户名,password=你的密码,vers=3.0/mnt/smb-share/file.h5路径操作文件,原生CIFS挂载对O_RDWR模式的支持更完善。
长期优化建议
- 检查Samba服务器配置,确保启用了随机读写相关参数(如
read raw = yes、write raw = yes) - 更新系统的GVFS和Samba组件,新版本可能修复该兼容性问题:
sudo pacman -Syu gvfs-smb samba
内容的提问来源于stack exchange,提问作者Aurelien Barbotin
相关产品推荐
相关产品推荐

