Linux系统移植—使用nfs或者ftp给开发板下载linux镜像
Posted 果果小师弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统移植—使用nfs或者ftp给开发板下载linux镜像相关的知识,希望对你有一定的参考价值。
Liunx开发板:uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux kernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcp、ping、nfs 和 tftpboot。
问题:开发板和Ubuntu通信不成功
在使用 uboot 的网络功能之前先用网线将开发板的 ENET1 接口和电脑或者路由器连接起来,I.MX6U-MINI开发板有一个网口: ENET1。将开发板和主机连接在同一个路由器或者网域内, 使用SD卡移植uboot,启动uboot,在MobaXterm软件终端窗口可以看到启动过程;可以看到开发板的网络功能还没设置,开发板的MAC地址ethaddr没设置;
查看电脑主机的IP地址
也可以这样看
查看ubuntu的IP地址
主机和ubuntu在同一网段下
所以要设置开发板的IP地址等信息就是
IP地址:192.168.1.74
MAC地址:00:04:9f:04:d2:35
网关:192.168.1.1
子网掩码:255.255.255.0
如何连线?
参考:https://bbs.elecfans.com/m/jishu_1848268_1_1.html
开发板通过无线网络连接路由器
ubuntu通过桥接的方式连接网络
开发板通过网线连接路由器
在确认电源、串口等连接好以后,按下开发板上的复位按键,启动开发板。在PC的Motaxterm上打开串口调试终端,在倒计时敲回车
在uboot模式下, 可以设置相关的环境变量,如屏幕类型的设置等。
setenv ipaddr 192.168.1.74
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.73
saveenv
注意,网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP地址在同一个网段内,比如我现在的开发板和电脑都在 192.168.1.1这个网段内,所以设置开发板的 IP 地址为 192.168.1.74,我的 Ubuntu 主机的地址为 192.168.1.73,因此 serverip 就是192.168.1.73。ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。
主机、虚拟机、开发板要设置静态的IP,要处于同一个网段,也就是比如192.168.1.* (*后面是不一样的),其他的子网掩码,网关,DNS都设置相同。
然后板子就可以ping通主机和ubuntu了。但是我的主机和ubuntu不能ping通开发板,不知道是咋回事。
为什么uboot下,开发板能ping通主机和虚拟机,但是虚拟机、主机ping不通开发板?
在uboot命令输入状态下,当使用ping命令时,实际上是uboot先根据你输入的IP地址,发送一个ICMP 回送请求和 回答报文到对应主机,然后再等待一段时间,如果在这段时间后主机没有响应,则显示ping不通,主机如果在这段时间内发送了回答报文,则显示能ping通。
当使用主机或者虚拟机ping开发板时,开发板正处于main_loop循环中(等待用户输入命令),没有对应的程序或中断(uboot一般不适用中断)来检测主机的ping命令,因此,显示ping不通。因此,不用纠结为什么虚拟机和主机ping不通龙芯1B是不是哪里有问题,只需要开发板能ping通主机,就可以使用 tftp命令,进行uboot环境下的内核或者文件系统的刷机等操作了。另外,uboot是一个 单线程main_loop函数+中断处理的架构,中断处理程序处理窗口输入输出等,main_loop解uboot命令。负责数据并处理ICMP包。uboot的ping是一个NETLOOP发送和接收ARP包的命令。LOOP会不断检测是否接收到ARP REPLY,所以可以ping通电脑。
上面是网上的答案,事实上也是这样的,虚拟机、主机ping不通开发板并不影响我们使用使用nfs或者ftp给linux开发板下载linux镜像文件。
nfs 命令
nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 Linux 开发中最常用的调试方法。原因是嵌入式 linux开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部的 flash 中,嵌入式 Linux 通常是烧写到 EMMC、NAND Flash、SPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDK,IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、IAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。
我们一般使用 uboot 中的 nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。
Ubuntu开启NFS
使用如下命令安装 NFS 服务:
sudo apt-get install nfs-kernel-server rpcbind
如果不能安装请更新一下apt-get
sudo apt-get update
等待安装完成,安装完成以后在用户根目录下创建一个名为linux
的文件夹,以后所有的东西都放到这个linux
文件夹里面,在linux
文件夹里面新建一个名为nfs
的文件夹
以后我们可以在开发板上通过网络文件系统来访问 nfs
文件夹,要先配置 nfs,使用如下命令打开 nfs 配置文件/etc/exports
sudo vi /etc/exports
打开/etc/exports 以后在后面添加如下所示内容:
/home/zhiguoxin/linux/nfs *(rw,sync,no_root_squash)
重启NFS
服务,使用命令如下:
sudo /etc/init.d/nfs-kernel-server restart
将文件u-boot.imx
通过FileZilla或者Moboxterm发送到 Ubuntu 中的 NFS 目录下,比如我的就
是放到/home/zhiguoxin/linux/nfs
这个目录下,
完成以后的 NFS 目录如图所示:
准备好以后就可以使用 nfs 命令来将u-boot.imx
下载到开发板DRAM
的0X80800000
地址处,
命令如下:
nfs 80800000 192.168.1.73:/home/zhiguoxin/linux/nfs/u-boot.imx
命令中的80800000
表 示u-boot.imx
保 存 地 址 ,192.168.1.73:/home/zhiguoxin/linux/nfs/u-boot.imx
表示u-boot.imx
在192.168.1.73
这个主机中,路径为/home/zhiguoxin/linux/u-boot.imx
。下载过程如图所示:
在图中会以#
提示下载过程,下载完成以后会提示下载的数据大小,这里下载
的424960
字节,而u-boot.imx
的大小就是424960
字节,如图所示:
下载完成以后查看0x80800000
地址处的数据,使用命令md.b
来查看前0x100
个字节的数
据,如图所示:
在使用winhex
软件来查看,检查一下u-boot.imx
前面的数据是否和图中的一致
可以看出前 100 个字节的数据一致,说明 nfs 命令下载到的u-boot.imx
是正确的。
tftp 命令
tftp 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令
使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。因此需要在 Ubuntu 上搭建 TFTP 服务器,
需要安装 tftp-hpa 和 tftpd-hpa,命令如下:
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
如果不能安装请更新一下apt-get
sudo apt-get update
和 NFS 一样,TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,命令如
mkdir /home/zhiguoxin/linux/tftpboot
我这里已经新建好了,并且要给这个文件夹最高权限
chmod 777 /home/zhiguoxin/linux/tftpboot
只有给了最高权限这个文件夹名字的背景颜色才会改变。我们要给 tftpboot 文件夹权限,否则的话 uboot 不能从tftpboot 文件夹里面下载文件。
最后配置 tftp,安装完成以后进入/etc/xinetd.d/tftp
,如果没有/etc/xinetd.d
目录的话自行
创建,然后在里面输入如下内容:
完了以后启动 tftp 服务,命令如下:
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa
文件,将其修改为如下所示内容:
以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
tftp 服务器已经搭建好了,接下来就是使用了。将u-boot.imx
镜像文件拷贝到 tftpboot 文件夹中,并且给予相应的权限
我们现在将 tftpboot 文件夹里面的u-boot.imx
文件下载到开发板 DRAM 的0X80800000
地址处,命令如下:
tftp 80800000 u-boot.imx
我们最常用的网络命令就是ping、nfs 和 tftp 这三个命令。使用 ping 命令来查看网络的连接状态,使用 nfs 和 tftp 命令来从 Ubuntu 主机中下载文件。
以上是关于Linux系统移植—使用nfs或者ftp给开发板下载linux镜像的主要内容,如果未能解决你的问题,请参考以下文章