- 问题现象:
- 使用32位编译的linux内核,在通过nfs mount加载so失败
- cannot load xxx.so
- 排查:
- so所在位置已被包含到LIB_LABRARY_PATH
- so对应的文件类型是32位的动态库文件
- 使用strace加载程序
- 报fstat *** =-1 EOVERFLOW(value too large for defined data type)
- 这个问题的原因是远程机器的IPC或文件系统对象的uid_t off_t gid_t比本地系统的要大,比如远程的是64bit,而本地的是32bit
- 但是我远程mount的也是32bit编译出来的so
- 进一步排查,是nfs在转换过程中,提供的是64bit的inode
- 解决方法:
- 第一种,修改nfsserver,限制inode大小到32bit
- 第二种,修改nfs客户端的配置,返回32bit的inode number
- 不想重新编译nfs模块,则输入如下指令即可
- echo -n N > /sys/module/nfs/parameters/enable_ino64
07-30
1391