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文件系统目录内容。
|