NFS(Network File System)是一种在Unix/Linux下广泛使用的网络文件系统。Linux的内核已经内置了对NFS客户端和服务器的支持。但是播放机的内核没有打开NFS服务器支持,因此我们需要自己编译相关的模块。另外我们还需要相应的辅助程序:
portmap和
nfs-utils。其中nfs-utils要求C程序库包含对RPC的支持,然而播放机的uclibc没有打开RPC支持。下面我将介绍如何解决这些问题。
一、编译内核NFS服务器模块
仍然使用从华硕下载的内核源码,请参考:
下载源代码(Download The Source Code)内核源码目录下有一个名为config.develop.avhdd.mars.old的文件,我们以这个配置文件为基础重新配置内核:
$ cd linux-2.6.12
$ cp config.develop.avhdd.mars.old .config
$ make menuconfig
1. 关闭模块版本检查,使得我们编译的模块可以在原厂内核上加载。
配置菜单位置: Loadable module support ---> [ ] Module versioning support (EXPERIMENTAL)
2. 打开NFS服务器支持,选择把它编译成模块。
配置菜单位置:File systems ---> Network File Systems ---> [M] NFS server support
3. 打开或关闭内核调试。这个一定要与你的播放机内核的实际配置保持一致,否则编译出的模块会无法加载。
Kernel hacking ---> [?] Kernel debugging
然后执行make进行编译。编译完成后我们得到以下两个模块:
fs/exortfs/exportfs.ko
fs/nfsd/nfsd.ko
附件:
编译好的模块:
nfs-server-modules-debug.tar.bz2 (打开内核调试)
nfs-server-modules-nodebug.tar.bz2 (关闭内核调试)
二、打开uClibc对RPC的支持
NFS的通讯协议是基于
ONC RPC(一种远程过程调用协议)的。nfs-utils工具调用了C函数库的RPC函数,因此要求uClibc必需提供这些函数。原厂固件中的uClibc关闭了RPC支持,我们只能用自己编译的支持RPC的uClibc来替换原厂的uClibc。
其实在编译Buildroot时就会自动编译uClibc,请参考:
Buildroot - 让交叉编译更轻松。我们只需在配置buildroot时指定uClibc的配置文件,这个配置文件应该包括下面两项:
UCLIBC_HAS_RPC=y
UCLIBC_HAS_FULL_RPC=y
对应的uClibc的配置菜单如下图:
附件:
补丁:
uClibc-0.9.28-patches.tar.bz2配置文件:
config-uClibc-0.9.28.bz2编译好的uClibc:
uClibc-0.9.28-binary.tar.bz2三、编译辅助程序
为了方便链接上述的uClibc,请使用buildroot生成的工具链来编译portmap和nfs-utils。详细步骤请看:
编译portmap和nfs-utils附件:
编译好的portmap和nfs-utils:
portmap_and_nfs-utils_binary.tar.bz2四、更新固件
用以上三步编译产生的二进制文件制作新固件:
1. 内核模块放在如下路径:
lib/modules/2.6.12.6-VENUS/kernel/fs/exportfs/exportfs.ko
lib/modules/2.6.12.6-VENUS/kernel/fs/nfsd/nfsd.ko
2. 用自己编译的uClibc替换原厂的uClibc,放在/lib下:
/lib/libm.so.0 -> libm-0.9.28.so
/lib/libresolv.so.0 -> libresolv-0.9.28.so
/lib/libpthread-0.9.28.so
/lib/libnsl.so.0 -> libnsl-0.9.28.so
/lib/ld-uClibc-0.9.28.so
/lib/libutil.so.0 -> libutil-0.9.28.so
/lib/libcrypt-0.9.28.so
/lib/libm-0.9.28.so
/lib/libutil-0.9.28.so
/lib/ld-uClibc.so.0 -> ld-uClibc-0.9.28.so
/lib/librt-0.9.28.so
/lib/libuClibc-0.9.28.so
/lib/libdl-0.9.28.so
/lib/libresolv-0.9.28.so
/lib/libcrypt.so.0 -> libcrypt-0.9.28.so
/lib/libdl.so.0 -> libdl-0.9.28.so
/lib/libnsl-0.9.28.so
/lib/libpthread.so.0 -> libpthread-0.9.28.so
/lib/libc.so.0 -> libuClibc-0.9.28.so
/lib/librt.so.0 -> librt-0.9.28.so
3. portman,nfs-utils及脚本
/etc/init.d/S60nfs
/sbin/portmap
/usr/sbin/exportfs
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpc.statd
参考:
1.
下载源代码(Download The Source Code)2.
重新编译uClibc3.
编译portmap和nfs-utils4.
Buildroot - 让交叉编译更轻松