需要NFS的目的是建立网络文件系统,开发板通过它把嵌入式根文件系统“安装”过来,另外开发箱通过tftp协议把内核下载下来,通过BOOTP自动配置网卡参数,下面说以下步骤:
1)电脑上安装NFS+TFTP+BOOTP,可以通过如下命令安装
#apt-get install nfs-kernel-server tftpd bootp openbsd-inetd
安装好后在linux输入# dpkg -l tftp*如果返回如下几行,证明安装好了
||/ 名称
+++-==============-==============-============================================
un
ii
ii
接下来就是配置配置文件
编辑/etc/exports(这个是nfs的配置文件,我们把要用nfs挂载的目录或文件按一定格式写在这个文件就可以了如下),在末尾加入下面一行(可以加多个目录的):
/etc/init.d/nfs-kernel-server restart #配置完之后要重新启动这个服务
到了这里如果你linux里防火墙什么的没有开的话,就可以通过命令来挂载nfs文件系统(只是一个统称,对应以实制文件系统,通常就是挂在一个目录),可以现在pc机上试验一下命令如下
#mount -t nfs 192.168.0.3:/work/nfs_root /mnt
在开发板上可以这样手工挂载
#mount -t nfs -o nolock 192.168.0.3:/work/nfs_root /mnt
这个如果也成功了,那么我们就可以把它改成驱动内核是自动挂载它,不用每次都手工来挂载。
这样就挂载上去了,下面说一下在开发板上怎样用nfs挂载文件系统,以TQ2440开发板说明,首先挂载nfs文件系统之前u-boot,内核要烧进(内核可以用tftp直接从内存启动,不需要烧进flash中)flash中了,u-boot中有一个变量是用来存这些参数的,下面可以看一下u-boot中变量
U-Boot 1.1.6 (May
DRAM:
Flash:
NAND:
In:
Out:
Err:
Hit any key to stop autoboot:
tq2440# print
bootcmd=nand read.jffs2 0x30007fc0 kernel;bootm 0x30007fc0
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ipaddr=192.168.0.4
serverip=192.168.0.3
netmask=255.255.255.0
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.0.3:/work/nfs_root ip=192.168.0.4:192.168.0.3:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
stdin=serial
stdout=serial
stderr=serial
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:1m@0(boot),1m(params),2m(kernel),8m(jffs2),-(yaffs2)
partition=nand0,0
mtddevnum=0
mtddevname=boot
Environment size: 528/131068 bytes
tq2440#
这时内核启动情况如下:
Bytes transferred = 1869388 (1c864c hex)
## Booting image at 32000000 ...
OK
Starting kernel ...
Uncompressing Linux...................................................................................................................... done, booting the kernel.
Linux version 2.6.30.4-EmbedSky (root@www) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #13 Sun May 27 11:53:09 CST 2012
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
......
Looking up port of RPC 100003/2 on 192.168.0.3
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
Looking up port of RPC 100005/1 on 192.168.0.3
VFS: Mounted root (nfs filesystem) on device 0:12.
Freeing init memory: 128K
my tq2440 cgy
Try to bring eth0 interface up...
ifconfig eth0 hw ether 10:23:45:67:89:ab
ifconfig eth0 192.168.0.4 netmask 255.255.255.0 up
route add default gw 192.168.0.1
Done
Please press Enter to activate this console.
[root@cgyl2010 ~]#
上面红色标志的就是我们开发板启动挂载nfs文件系统要用到的一些参数,下面分析一下这些参数意义
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.0.3:/work/nfs_root ip=192.168.0.4:192.168.0.3:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
bootargs是一个环境变量可以用命令setenv来改,noinitrd root=/dev/nfs指明要挂载文件系统,nfsroot=192.168.0.3:/work/nfs_root 要挂载的文件系统所在主机ip和要挂载的文件系统(其实就是一个目录),ip=192.168.0.4:192.168.0.3:192.168.0.1:255.255.255.0分别是开发板IP,文件系统所在目标主机的Ip,网关,子网掩码,要注意一点的是上面IP要在同一个网段,我是使用路由器分出来的,使用的是ubutu版本linux虚拟机,把它设成桥接,init=/linuxrc console=ttySAC0,指明init进程,使用串口。。。。。
这样设置好之后我们就可以在开发板启动的时候把pc机上/work/nfs_root文件系统直接挂载过来了,不用烧写进flash(nfs_root目录是我建好的一个文件系统),这样还有一个好处就是我们可以在pc 机上编好程序,用交叉编译链编译好就可以在开发板上运行,还可以在pc机上建目录在开发板上立刻就可以看到。。。。
##################################################################################################
下面是tftp设置
修改文件/etc/inetd.conf,加入如下一行:
bootps dgram udp wait root /usr/sbin/bootpd bootpd -i -t 120
tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /srv/tftproot
其中的/srv/tftproot就是我们要建立的目录,以后通过tftp上传,下载的目录都会出现在这个文件里面。
下面是对BOOTP配置文件修改
修改文件/etc/bootptab,内容如下:
CrossBox11:ht=1: ha=0x123456789A00: ip=192.168.0.4(这个是对应开发板IP): sm=255.255.255.0
主意:上述行中的“0x123456789A00”指开发箱的网卡物理地址(MAC),在具体操作过程中要替换成你的开发板的网卡物理地址。
重启inetd,从而监听bootp和tftp服务:
/etc/init.d/openbsd-inetd restart
这样就可以在u-boot中使用tftp或nfs下载内核到内存中了,很方便,如下是下载内核到开发板内存
Enter your cgytq2440: 9
dm9000 i/o: 0x20000300, id: 0x90000a46
MAC: 08:00:3e:26:0a:5b
TFTP from server 192.168.0.3; our IP address is 192.168.0.4
Filename 'uImage'.
Load address: 0x32000000
Loading: T #################################################################
done
Bytes transferred = 1936668 (1d8d1c hex)
这样就可以了,下面来说一下具体设置:
通过上面设置只是tftp等服务起来了,具体怎么用还要一些设置
如果用的是linux虚拟机,先把上网方式改为桥接,不过桥接时要用到路由器的,如果是一般电信方式上网的,只能用一个IP这时桥接就没法用了,可以配合路由器来用(通过路由器分多几个IP来用):
首先把网接成桥接
如果是用了路由器的话,首先windows的IP设为192.168.0.2(我的路由器网关是192.168.0.1,有的是192.168.1.1这个网段,具体怎样要看自己路由器),虚拟机linux的IP作为服务器用IP设为192.168.0.3
开发板IP就设成192.168.0.4;这是、srv/tftproot中的文件就可以通过tftp来下载了。
最后说一下可以用vim /etc/services查看端口号,这个方便我们查看我们服务所对应的端口。