引语:已经过去8天了,这段时间进展很慢,走了许多弯路。下文将梳理自己在学习过程中遇到的问题,并重点讲TFTP和NFS在arm上的应用。
板子情况:mini2440-FriendlyARM板;sdram:64M;nand flash:256M;nor flash : 2M;基本上是裸机,只在nor flash上有一个固化的super vivi 引导程序。
宿主机OS:red hat enterprise 6,使用centos 6的源。
一.宿主机串口装置(超级终端):c-kermit。
特殊说明一下,之前用的是minicom,因为它的操作比c-kermit简单,但在使用过程中碰见一个问题,进入super vivi 引导程序后,设置参数挂载NFS的时候,当输入长度超过一行,比如在Supervivi模式下输入如下命令
Supervivi> param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.112:/opt/mini2440/root_qtopia
ip=192.168.1.230:192.168.1.112:192.168.1.1:255.255.255.0:sbc2440.arm9.net:eth0:off"
minicom终端无法换行输入。每到一行末尾,按enter键换行,重新进入supervivi命令模式,无法衔接上一行尾继续输入。
想了一种解决方法:在行尾接上“/”连接符,再按enter键,无效。
网上搜索,没有找到解决方案。于是换成c-kermit。c-kermit是哥伦比亚大学用C语言开发的一个项目,最初是为了使各个终端之间能够进行通信,所以c-kermit包含了转换协议,附加终端连接,调制拨号(为串口准备),文件管理,脚本编辑等功能。这是一个很强大的工具,对于初学者,并不需要掌握它的所有功能,只需在第一次设置好一些参数值,就可以使用。
c-kermit的具体安装:
由于centos源并没有这个软件安装包,无法使用yum install命令。小鱼是在网站(http://www.columbia.edu/kermit/)上直接下载的,有三种版本的代码包,一种是2进制的,解压后直接运行,另一种是源代码,需要自行编译;小鱼用了cku302.tar.gz包,附带源代码,供以后研究。下载后在宿主机任选目录上使用tar -zxvf cku303.tar.gz命令解压安装,再进入cku文件夹,终端输入make和make install,便安装成功。
注意:ckermit有几个地方容易出错。1.在终端需要使用sudo kermit -c作为输入命令;2. .kermrc文件(带点的隐藏文件)是kermit启动时的环境变量设置文件,其中一般配置为以下内容,可以参看这篇博客:http://blog.163.com/yun_2527/blog/static/35271861201241505052222/ 。
二.在ARM板上移植U-BOOT
一番折腾,小鱼终于在笔记本上安装了c-kermit。下一步,移植bootloader程序,arm裸机上的supervivi已经被小鱼玩了一遍,如测试屏幕、蜂鸣器、按键、安装Linux内核等等。这些试了一遍,没什么好玩的。有人说u-boot更通用,可以在各种arm板子上操作,真假不得而知,但u-boot这个名字不错,很吸引人。于是小鱼决定换成U-boot。
换u-boot之前,小鱼有一个疑问,u-boot安装在arm板的哪一块区域呢?sdram、nor、nand呢?
答:这个问题可以从sdram、nor、nand的特点得到答案。如sdram是掉电丢失数据的,Uboot是引导程序,必须固定在硬件中,sdram显然不行。那只有放在nand和nor了。那么放在flash的哪个地址呢?《嵌入式系统 Boot Loader 技术内幕》文章中有一张图片很好地讲解了固态内存分配(即NAND或NOR等),bootloader在最起始地址,然后是kernel内核,根文件系统,最后可在根文件系统上挂载各种文件系统,所以u-boot安装一般步骤是:
(1)通过网络、串口、U盘、SD卡等方式将文件传输到SDRAM;
(2)使用Nand Flash或Nor Flash相关的读写命令将SDRAM中的数据烧入Flash。(蓝色字体转自tekkemaninja的博客)
安装u-boot的具体过程:
1.打开c-kermit,连接arm板子,使用nor flash启动arm板,进入supervivi 引导程序,选择【a】键盘,此时宿主机会显示等待下载;
2.在宿主机打开dnw软件,进行串口通信,在终端输入:./dnw /u-boot二进制文件所在目录/u-boot.img ;
3.传输结束,然后选nand启动arm板,便进入了u-boot环境。
在这里,小鱼偷懒了,没有自己编译制作u-boot二进制文件,而是直接使用FriendlyARM官网自带的文件。之所以这样,是希望快速地加深对arm板整个开发流程的理解,而不要太早陷入细节中。当然,如果自己制作u-boot时,修改u-boot源码的各种设置,可以参考tekkamanninja这位大侠的博客。
三.使用TFTP传送文件到ARM板
TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族的一个协议,端口号是69,只能传送一些小文件,这也是为什么有了TFTP之后还需要NFS的原因。
ARM板上有DM9000A网卡,支持网络协议,而u-boot自带有DM9000A的驱动程序,所以使用U-BOOT可以进行TFTP传送服务。
TFTP服务设置(主要是在宿主机上设置,小鱼的主机OS是red hat版本):
1.下载tftp服务客户端和守护进程xinetd
yum install xinetd
yum install tftp tftp-server
2.关闭防火墙
service xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]
3.建立tftp宿主机文件夹,想要传送到ARM板的文件都需要先放在tftp上面
cd /
mkdir tftpboot
cd tftpboot
cp /etc/inittab /tftpboot/
chmod 777 -R /tftpboot/(这个命令是修改tftpboot目录属性)
4.配置tftp
vi /etc/xinetd.d/tftp
修改server_args = -s /tftpboot -c,这里的-c一定要加上,否则只能下载不能上传!!!
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -c
per_source = 11
cps = 100 2
flags = IPv4
}
5.启动tftp服务
tftp 172.18.1.90(这个命令是设置目标开发板IP,可以在u-boot中输入printenv ipaddr查看)
接下来就可以传送了。
ubuntu的tftp服务端配置略有不同,可以参考:http://www.cnblogs.com/feisky/archive/2010/04/04/1704167.html
四.使用NFS网络文件系统共享文件
再安装NFS之前,一定要对NFS有个详细了解,否则在设置时云里雾里的,容易出错。
NFS(Network File System网络文件系统),是UNIX系统之间实现磁盘共享的方法,强调一遍,它是一种方法,它的基本原則是「容許不同的客戶端及服务器通過一組RPC分享相同的文件系統」,它是獨立於操作系统,容許不同硬體及操作系統的系統共同進行文件的分享。RPC是一种远程过程调用协议,详细内容参见维基百科,由于存在各式各样的变体和细节差异,对应地衍生了各式RPC(远程过程调用协议),而且它们并不互相兼容,很多人移植失败,常会看到一个RPC有问题的提示,这个时候,你就要分析你的NFS中RPC版本了。
NFS可以实现目录及文件的基本管理功能,如读写文件,改变文件属性,管理目录等。
废话有点多,接下来就着手搭建NFS吧。
嵌入式Linux 的NFS 开发环境的实现包括两个方面:一是宿主机Linux 服务器端的NFS 服务器支持;二是目标开发板的NFS 客户端的支持。因此,NFS 开发环境的建立需要配置Linux 服务器端和嵌入式目标系统端。
1。宿主机的NFS服务器安装
# yum install rpcbind nfs-utils -y
小鱼的操作系统是RHEL6,即红帽企业版6,在RHEL6上搭建NFS服务器比以往更简单,去掉了portmap服务,而是用rpcbind服务器替换掉。所以不需要portmap,网上很多资料都是对portmap进行设置。这里需要注意一下,凡是有portmap的地方,都用rpcbind替换就对了。
2。宿主机的NFS服务器配置
# vim /etc/exports
以root 身份登陆Linux 服务器,编辑/etc 目录下的共享目录配置文件exports,指定共享目录及权限等。这样系统每次重启NFS服务,就会读取里面的内容。
执行如下命令编辑文件/etc/exports:
在该文件里添加如下内容:
/home/work 192.168.0.*(rw,sync,no_root_squash)
然后保存退出。
添加的内容表示:允许ip 地址范围在192.168.0.*的计算机以读写的权限来访问/home/work 目录。
/home/work 也称为服务器输出共享目录。
括号内的参数意义描述如下:
rw:读/写权限,只读权限的参数为ro;
sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。
no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。
3。宿主机启动NFS
# service rpcbind start
# chkconfig rpcbind on
# service nfs start
# chkconfig nfs on
在NFS 服务器启动后,还需要检查Linux 服务器的防火墙等设置(一般需要关闭防火墙服务),确保没有屏蔽掉NFS 使用的端口和允许通信的主机。一般设置如下:
首先在Linux 服务器上进行NFS 服务器的回环测试,验证共享目录是否能够被访问。在Linux 服务器上运行如下命令:
# mount –t NFS 192.168.0.20:/home/work /mnt
# ls /mnt
命令将Linux 服务器的NFS 输出共享目录挂载到/mnt 目录下,因此,如果NFS 正常工作,应该能够在/mnt 目录看到/home/work 共享目录中的内容。如不成功,返回操作二或者操作三。
挂载(只有挂载了NFS目录,才能够访问该目录内的东西,因为对于宿主机,NFS目录是外来的一个“硬盘”,需要挂载在根目录才能识别访问):
arm板启动后,在终端中输入命令:
mount –t nfs 192.168.1.15:/opt/EmbedSky/root_nfs /mnt -o nolock
其中,192.168.1.15 为NFS 服务器IP,/opt/EmbedSky/root_nfs 为服务器开放给本目标板的目录。
挂载成功后,cd /mnt
5 。目标板的NFS客户端配置
这一步容易出错。主要是在U-boot中设置环境变量时出错。
假设使用nand flash 启动u-boot,进入u-boot命令行模式,输入:printenv,查看板子的初始设置,如serverip ,network address,gateway等一些东西。
然后输入:setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.102:/home/student/root_qtopia ip=192.168.1.226:192.168.1.102:192.168.1.102:255.255.255.0:SMDK2440A.arm9.net:eth0:off
解释其中几个字符的含义:
console 随便设,最好是ttySAC0,
root随便设,不影响
nfsroot后面跟着的是宿主机的IP 和宿主机NFS共享目录
ip后面接的分别是:板子IP;宿主机IP;宿主机网关;网络掩码:板子名臣:eth0(这个小鱼没弄明白为什么是off)。
一般这么设置就没有问题了。如还有问题,那可以使用netstat -at查看主机开放的端口。
比较可能的错误:eth0没有开启,比如小鱼的笔记本用了无线网卡,分配了一个IP,所以eth0自动关闭了,需要开启并设置eth0的ip,办法是setup,进入菜单,找到network选项,人工设置eth0的ip和网关,还有掩码,一定要三者都设置好。
如果在用U-BOOT的NFS命令下载文件的时候出现(这一步小鱼不太确定怎么解决)
** ERROR: Cannot umount ”
则要在主机的/etc/hosts文件中加入你的开发板ip nfs目录。比如:
192.168.1.101 /nfsboot/
五。小结
好了,至此,就可以分别使用tftp和nfs传送Linux内核到内存,再固化到nand flash中,便可以使用nand flash 启动进入Linux操作系统了。具体步骤就不讲了。今天太累了,终于完成了自己的约定,写出了这篇半通不通的技术文章。文章一长,就会出现许多问题,如果被你发现了,请告诉小鱼。
nfs详细资料:http://book.51cto.com/art/200808/85167.htm
Linux NFS服务器的安装与配置 - David_Tang - 博客园 http://www.cnblogs.com/mchina/archive/2013/01/03/2840040.html