nfs文件系统象棋小子 1048272975
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 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 /***in/init
2. 内核配置linux内核确认配置支持nfs文件系统,选中File systems->Network File Systems->NFSclient support。
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 /***in/mdev > /proc/sys/kernel/hotplug
mdev -s
可以添加/etc/mdev.conf配置文件,实现设备的自动挂载/卸载等。支持nfs文件系统后,就可以在主机端构建配置根文件系统,当验证通过后,再把构建好的根文件系统制作成flash烧录镜像并烧录,可以极大地加快开发的进度。
nfs根文件系统目录如下。
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 /***in/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,上电启动。
5. 附录本章所述initramfs文件系统目录内容以及nfs文件系统目录内容。