对于嵌入式Linux开发,通过NFS挂载根文件系统,根文件系统无需下载到FLASH( FLASH还需要先擦除再写入),可以直接保存在Linux主机,而且在Linux开发的驱动程序也无需下载到Linux开发板的FLASH,这使得开发十分方便快捷,下面记录一下我在学习过程中的过程。
准备好可启动的文件系统
首先将准备好的文件系统解压拷贝到你服务器主机上nfs共享出去的文件夹下面,以便后面进行nfs挂载
Linux内核的配置与编译
准备好Linux内核,我这里用的是arm平台的Linux2.6.29内核
解压后进入Linux2.6.29清理内核中间文件,配置文件
#cd Linux2.6.29
#make distclean
选择参考配置文件,然后修改配置文件CMDLINE,我这里选择config-mini2440作为配置文件
#vim config-mini2440
CMDLINE: 命令行启动参数定义了内核挂载根文件系统的方式
root=/dev/nfs 表示内核采用nfs方式起根文件系统
nfsroot=192.168.1.107: 服务器的IP地址,后面是nfs启动的根文件系统位于nfs服务器下面nfs共享出去的目录
ip=192.168.1.148 开发板的IP地址 ,要求与服务器IP地址同一网段
console=ttySAC0 mem=64M ttySAC0作为控制台,内存为64M
修改好后拷贝config-mini2440 到 .config
#cp config-mini2440 .config
配置内核
配置命令:
#make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-
要使内核支持nfs起根文件系统,内核必须选上配置选项:
File systems-->Network File Systems-->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] Root file system on NFS
选上后保存配置,退出
编译内核
编译命令:
#make uImage ARCH=arm CROSS_COMPILE=arm-linux-
便已完成后生成的内核映像uImage位于arch/arm/boot/ 目录下
如果在编译过程中出现如下情况:
提示mkimage命令没有出现,在u-boot中的mkimage用来产生u-boot格式映像文件的,所以可以把u-boot编译之后的源代码中把mkimage拷贝到/bin文件目录下,再次编译
编译后将uImage文件拷贝到tftp服务目录/tftpboot
#cp arch/arm/boot/uImage /tftpboot
开发板配置
接下来就是开发板这边的操作,打开超级终端,启动开发板,在超级终端中进入U-Boot:
- 设置IP地址:
setenv ipaddr 192.168.1.148 // 开发板IP
setenv serverip 192.168.1.107 //服务器 IP
setenv gatewayip 192.168.1.254 // 网关
saveenv
- 修改引导参数:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.107:/home/student/share/rootfs ip=192.168.1.148:192.168.1.107:192.168.1.254:255.255.255.0:sbc2440.arm9.net:eth0:off
nfsroot=服务器ip:/共享文件夹 ip=开发板ip:linux服务器ip:网关ip:子网掩码:主机名:网卡:off
root 表示使用/dev/nfs这个设备作为根文件系统。
rw 表示可读可写的。
nfsroot 表示服务器中rootfs所在路径,注意需要跟上服务器的ip地址。
192.168.1.148 是板子启动之后的ip地址。
192.168.1.107 是nfs服务器的ip地址。
192.168.1.254 是板子网关地址。
255.255.255.0 是板子子网掩码。
eth0 表示板子上的网络设备。
off 表示关闭动态获取ip地址
saveenv 保存配置
printenv 查看配置信息
- 通过tftp下载内核
#tftp 0x31000000 uImage //把服务器中的tftpboot目录下的uImage通过TFTP读入到开发板的内存地址0x31000000处
#bootm 0x31000000 //启动内核
通过上面的步骤基本上就完成了nfs挂载网络文件系统,启动过程中如果没有成功
- 可查看nfs服务配置是否正确,检查/etc/exports
#vim /etc/exports
然后重启nfs服务
#/etc/init.d/nfs restart
- VFS: Cannot open root device “nfs” or unknown-block(2,0)
报这个错误,网上很多说是NFS服务器配置有问题,但实际上我试验的时候还是因为uboot参数配置没有写好。
参考博客: