nfs即网络文件系统,通过网络,对在不同主机上的文件进行共享。嵌入式开发中,往往需要构建调试文件系统,在主机端以nfs文件系统的方式先调试构建文件系统,将极大地方便开发。

1. nfs文件系统

nfs需要主机端以及板端的nfs服务支持。

1.1. 主机端nfs配置

主机端以/nfs/rootfs目录作为文件共享目录,该目录必须具备读写权限。打开/etc/exports文件加入目录共享。

/nfs/rootfs 192.168.0.*(rw,async,no_root_squash)

关闭防火墙

service iptables stop

重启nfs服务,如果没有nfs服务,需要先安装nfs服务。

service rpcbind start

service nfs restart

配置ip地址,并且自挂载以确认主机nfs服务工作正常。

ifconfig eth0 down

ifconfig eth0 192.168.0.10 up

mkdir /mnt/nfs

#mount –t nfs 192.168.0.10:/nfs/rootfs /mnt/nfs

1.2. 板端nfs配置

linux内核成功挂载基于initramfs的rootfs,会尝试执行第一个用户进程init。通常initramfs作为过渡的根文件系统,可以加载一些必要的内核模块,然后解析命令行,获取真正的根文件系统,挂载并且切换到对应的根文件系统。

此处是nfs作为根文件系统,在rootfs中的init进程需要开启网络,用ifconfig命令配置网卡ip并开启。

ifconfig eth0 192.168.0.20 up

网络准备好后,用mount命令挂载nfs文件系统。

mount -t nfs -o nolock 192.168.0.10:/nfs/rootfs  /mnt/root

nfs文件系统挂载好后,用busybox的switch_root命令切换rootfs文件系统到nfs文件系统,并且要求PID为1的init进程直接执行switch_root。

exec switch_root /mnt/root /sbin/init

2. 内核配置

linux内核确认配置支持nfs文件系统,选中File systems->Network File Systems->NFSclient support。

04_NFS文件系统 - 图1

3. 主机端构建nfs文件系统

在主机/nfs/rootfs目录中构建板端nfs根文件系统,把交叉编译工具的加载器以及动态库复制到根文件系统的lib目录。

cp  *.so*  /nfs/rootfs/lib  –d

重新以共享库的方式交叉编译busybox,并把库、配置文件、可执行文件等拷贝到/nfs/rootfs根文件系统中。

减少对flash的读写,把/tmp、/dev目录挂接在tmpfs设备上。打开/etc/fstab文件,加入/tmp、/dev目录的挂载。

tmpfs         /tmp    tmpfs   defaults      0    0

tmpfs         /dev     tmpfs   defaults      0    0

etc/init.d/rcS 文件加入mdev的支持,从而不用手动创建设备节点。

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

可以添加/etc/mdev.conf配置文件,实现设备的自动挂载/卸载等。支持nfs文件系统后,就可以在主机端构建配置根文件系统,当验证通过后,再把构建好的根文件系统制作成flash烧录镜像并烧录,可以极大地加快开发的进度。

nfs根文件系统目录如下:

04_NFS文件系统 - 图2

4. 编译内核

用busybox构建initramfs,在init脚本中实现根文件系统的切换,init脚本文件如下。

#!/bin/busybox sh

ifconfig eth0 192.168.0.20 up

sleep 10

mkdir -p /mnt/root

mount -t nfs -o nolock 192.168.0.10:/nfs/rootfs  /mnt/root

exec switch_root /mnt/root /sbin/init

在initramfs目录下,打包生成rootfs档案。

find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz

在initramfs上一目录生成一个独立的rootfs.cpio.gz归档文件。把rootfs.cpio.gz拷贝到lichee/linux-3.10目录中,重新编译linux内核,在/lichee/out/sun50iw2p1/linux/common目录生成新的boot.img镜像,把编译生成的boot.img替换掉sd卡里的boot.img,上电启动。

04_NFS文件系统 - 图3

5. 附录

本章所述initramfs文件系统目录内容以及nfs文件系统目录内容。
源码:http://pan.baidu.com/s/1slNPVFR