【小鱼的arm学习心得02】使用TFTP和NFS移植linux内核

引语:已经过去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的博客)

 

  

【小鱼的arm学习心得02】使用TFTP和NFS移植linux内核

       安装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 使用的端口和允许通信的主机。一般设置如下:

    service iptables stop(如果这个没用,还有两个办法,1。在终端输入setup,进入图形化页面,关闭防火墙;2.永久性关闭:lokkit --disabled,如果这两种还没用,就自己搜索了,反正一定要关闭防火墙


4:测试宿主机NFS服务启动是否成功并对ARM板进行挂载

       首先在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

你可能感兴趣的:(linux)