對於嵌入式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參數配置沒有寫好。
參考博客: