NFS ROOT 启动内核的配置(RedBoot)
do2jiang,do2jiang@gmail.com
蒋冬冬,版权所有 转载加注
在一般的嵌入式系统开发中经常需要烧写内核文件和文件系统映像,为了保护和节省片子的烧写次数,为了方便我们开发的过程节省浪费在烧写上的时间,更多的是方便我们的开发不至于把系统上的文件搞的乱七八糟… 其实,其实当我们的内核变大,板子Flash无法容纳内核和文件系统的时候,NFSROOT是个好的解决方案。
因此想试试使用NFS ROOT:
1. 确认HOST机器的NFS服务已经配置完好!具体配置不在此处进行说明,请参考专门介绍的文档。但是,配置完毕后,一定要进行挂载确认。我选择两种确认方法:
A. HOST机器上自己挂:mount –t nfs 192.168.118.159:/work/ep9302/nfsroot /mnt/nfs
B. 在烧写了flash的开发板上试挂: mount –t nfs –o nolock 192.168.118.159:/work/ep9302/nfsroot /mnt/nfs
C. B操作最棘手的问题是出现这个错误:
warning: mount version older than kernel
NFS:mount program didn't pass remote address
mount:Mounting 192.168.118.159:/work/ep9302/nfsroot on /mnt/nfs failed:Invalid argument
解决方法:
mount -t nfs -o nolock,ro,nfsvers=2 192.168.118.159:/ work/ep9302/nfsroot /mnt/nfs
2. 必需開啟下面Kernel Config
n Networking Options
(*)TCP/IP networking
(*)IP: kernel level autoconfiguration
(*)IP: DHCP support
(*)IP: Bootp support
(*)IP: Rarp support
n File systems
l Network File Systems
(*)NFS file system support
(*)Root file system on NFS
3. 开启TFTP服务器,通目录下放置vmlinux文件
在Host机器上设置NFS文件夹,方法如下:
mount –o loop ramdisk /work/ep9302/nfsroot
4. 启动开发板,Ctrl+C进入Bootloader(在此以RedBoot为例)
因为,RedBoot的例子在网上很少,Uboot的例子很容易找到!感谢您理解!
RedBoot> load -m tftp -h 192.168.118.157 -b 0x80000 vmlinux
RedBoot> exec -c "console=ttyAM0,57600 root=/dev/nfsroot nfsroot=192.168.118.159:/work/ep9302/nfsroot ip=192.168.118.160:192.168.118.159:192.168.118.3:255.255.255.0 init=0x1000000"(注意:上述字串之间是没有任何回车符号的,在此仅为word中的显示)
5. Looking up port of RPC 100003/2 on 192.168.118.159
Looking up port of RPC 100005/1 on 192.168.118.159
在现实上述两句之后可能稍微得等上两分钟,请耐心,心急吃不了热豆腐!
6. 你幸运的话,到此,你的NFSROOT配置完毕!
7. 如果你不幸运,出现下述错误依旧的话,很大的原因在上述设置的粗心,请仔细检查!Thank you Read My Documentation!
ERROR:VFS: Cannot open root device "nfs" or 00:ff
Please append a correct "root=" boot option
Kernel panic: VFS: Unable to mount root fs on 00:ff
关于RedBoot的两句参数的意思,第一句相当简单,tftp加载内核文件。
第二句具体参数的意思请查看linux2.x.x/Documentation/nfsroot.txt
到此,可能有人会问,为什么使用vmlinux,不用zImage呢?
这个时候你有必要知道linux的几种内核映像:
整体系统包括两个部分
1. redboot, 属于Ecos(V2.0)的一部分
2. linux kernel + rootfs 映象 (.gz)
每次对内核编译会产生三个有用的文件
² kersrc/vmlinux 是个未经压缩的ELF文档, 能够通过tftp load启动, loader 地址为 RAM_BASE + 0x00100000, 由 kersrc/arch/xxx/vmlinux.lds决定
² kersrc/arch/xxx/boot/compress/vmlinux 一个经过压缩的ELF文档, 能够通过tftp load启动, loader 地址为 RAM_BASE + 0x00500000, 由 kersrc/arch/xxx/boot/compress/Makefile 决定
² kersrc/arch/xxx/boot/zImage 是个从 kersrc/arch/xxx/boot/compress/vmlinux OBJCOPY的来得BIN文档, 用于写入flash
注意:
当kernel + rootfs (kersrc/vmlinux) 小于 5M 时, tftp load 和 fis load 均无问题;
当kernel + rootfs (kersrc/vmlinux) 大于 5M 时,kersrc/vmlinux load -m tftp 能够正常启动
kersrc/arch/xxx/boot/compress/vmlinux load -m tftp 无反应
主要显示信息如下:
Redboot infomation (大于 5M)
RAM: 0x90000000 - 0x91000000, 0x90015208 - 0x90fdd000 available
FLASH: 0x80000000 - 0x81000000, 128 blocks of 0x00020000 bytes each.
... ...