OpenWrt通过NFS方式启动

一、什么是NFS

Net File System。
举个例子,开发板与电脑通过网线连接,电脑的某个目录下有开发板系统所需要的文件系统,开发板直接通过网络,加载文件系统运行。
在嵌入式开发中,有很多场景会应用到这种方法,比如ROM不足,或在调试阶段直接烧写FLASH会有风险等等。

二、OpenWrt 分区

直接make V=99出来的bin可以分成3段
1. uboot :OpenWrt采用的bootloader
2. kernel :Linux Kernel,xxx-uImage.bin
3. root file system:xxx-rootfs.tar.gz
以上想生成,直接在make menuconfig中,Target Images和Boot Loaders选项下选择。

三、NFS支持

NFS加载rootfs时,OpenWrt开发板作为NFS Client端,因此make kernel_menuconfig中,将
NFS client相关项全部选择。

File systems  --->
    Network File Systems  --->
        <*>   NFS client support 
        [*]   Root file system on NFS

然后编译。

四、OpenWrt 启动

a、uboot

如果入手的是一个空flash,没办法,只能通过烧写器,或jtag线烧写。
如果flash中已经有uboot或其他bootloader,可以根据需要,是否升级到自己编译出的uboot。

b、kernel

  1. tftp server搭建(此部分内容,度娘上有很多)
    以ubuntu为例,
    1)安装服务
    $ apt-get install xinetd tftp tftpd 2)创建/etc/xinetd.d/tftp文件,拷贝下面内容到文件中。
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}

3)创建/tftpboot目录,这是配置文件中指定的tftp服务器主目录。
4)重启xinetd服务器:
$ /etc/init.d/xinetd restart
5)将XXX-uImage.bin拷贝到/tftpboot
6)更改权限
$ chmod 777 -Rf /tftpboot

  1. console连接
    1)安装工具minicom
    $ apt-get install minicom 2)将TTL-USB线插在开发板console接口上,一般3跳线,Tx Rx GND,Tx线接开发板的Rx,Rx接开发板Tx。
    3)终端运行minicom,进行端口设置,一般为:
+-----------------------------------------------------------------------+                               
| A -    Serial Device      : /dev/ttyUSB0     (这个可以ls /dev/ttyUSB*)|                               
| B - Lockfile Location     : /var/lock                                 |                               
| C -   Callin Program      :                                           |                               
| D -  Callout Program      :                                           |                               
| E -    Bps/Par/Bits       : 115200 8N1         (波特率一般为115200)   |                                 
| F - Hardware Flow Control : No                             (设置为No)|                               
| G - Software Flow Control : No                             (设置为No)|                               
|                                                                       |                               
|    Change which setting?                                              |                               
+-----------------------------------------------------------------------+
  1. 加载kernel到RAM
    1)网线连接Ubuntu调试机和开发板;
    2)设置调试机IP,ubunut直接在网络里设置(以192.168.0.10为例);
    3)uboot启动后,会通过console出log,出现下面提示时,停止auto boot;
    Hit any key to stop autoboot: 2 4)通过uboot命令setenv设置开发板IP和对端调试机IP;
    > setenv ipaddr 192.168.0.99> setenv serverip 192.168.0.10 5)通过tftp加载kernel到RAM中(以加载到RAM起始地址0x81000000为例);
    > tftp 0x81000000 XXX-uImage.bin 6)启动kernel
    > bootm
    > bootm 0x81000000原理:
  • uboot集成简单tftp网络支持,当然开发板上要有网络接口。
  • OpenWrt启动kernel时,也是从FLASH上将kernel加载到RAM中运行,所以当前的办法直接通过tftp加载kernel到RAM中,替代了从FLASH上read的过程。

c、rootfs

  1. 按照 2、kernel 小节,搭建tftp和minicom
  2. 解压缩xxx-rootfs.tar.gz到/tftpboot/
  3. 在uboot命令行,设置启动参数。
    这里只举一个例子,每个开发板的情况不同
    setenv bootargs board=AP143 console=ttyS0,115200 nfsroot=192.168.0.10:/tftpboot/rootfs rw ip=192.168.0.99:192.168.0.10:196.168.0.1:255.255.255.0::eth1:off 解释:
  • board=AP143,板子类型最好设对,不然kernel可能启动失败;
  • nfsroot=192.168.0.10:/tftpboot/rootfs,就是tftp server ip: + rootfs路径,解压xxx-rootfs.tar.gz出来的;
  • rw设置可读可写权限;
  • ip=板子IP: tftp server ip :网关ip(都在同一网段,网关ip随意填写):掩码:板子eth接口;(这里使用的是静态IP,如果想设置成dhcp,需要在make kernel_menuconfig中,在Networking support里,打开IP: kernel level autoconfiguration的dhcp支持)

完成以上步骤,可以加载了。

五、问题

在启动过程中,发现挂载成功了后,发现nfs server断开的情况,文件系统找不到了!
其实,这跟OpenWrt自身,启动过程中,需要对eth接口再配置导致的。
所以。OpenWrt开发过程中,需要频繁对网络进行设置,也导致NFS方式启动OpenWrt的意义不大,只在开始时,确认kernel以及rootfs加载没有问题有用。加载没有问题,最终还是需要烧写到flash中进行调试。