网络操作命令nfs 命令
1.网络操作命令
uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linuxkernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcp、ping、nfs 和 tftpboot.
setenv ipaddr 192.168.5.9
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.5.1
setenv netmask 255.255.255.0
setenv serverip 192.168.5.11
saveenv
注意,网络地址环境变量的设置要根据自己的实际情况,确保 Ubuntu 主机和开发板的 IP地址在同一个网段内,比如我现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为192.168.5.9,我的 Ubuntu 主机的地址为192.168.5.11,因此 serverip 就是192.168.5.11。ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个开发板的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题!设置好网络相关的环境变量以后就可以使用网络相关命令了。关于IP的设置可以参考的之前的文章《环境搭建与开发板操作》
2.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 服务开启我们在 4.2.1 小节已经详细讲解过了,包括 NFS 文件目录的创建,如果忘记的话可以去查看一下 4.2.1 小节。我设置的/home/zuozhongkai/linux/nfs 这个目录为我的 NFS 文件目录。uboot 中的 nfs 命令格式如下所示:
nfs [loadAddress] [[hostIPaddr:]bootfilename]
loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址。这里我们将正点原子官方编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的 0x80800000这个地址处。正点原子编译出来的 zImage 文件已经放到了开发板光盘中,路径为:8、系统镜像->1、出厂系统镜像->2、kernel 镜像\linux-imx-4.1.15-2.1.0-gbfed875-v1.6 ->zImage。将文件zImage 通过 FileZilla 发送到 Ubuntu 中的 NFS 目 录 下 , 比 如 我 的 就 是 放 到/home/hzh/linux/nfs 这个目录下。
下载网站:i.MX6ULL Linux阿尔法开发板 — 正点原子资料下载中心 1.0.0 文档
准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,
命令如下:
nfs 80800000 192.168.1.253:/home/hzh/linux/nfs/zImage
命 令 中 的 “ 80800000 ”表示 zImage 保 存 地 址 ,
“192.168.1.253:/home/用户名/linux/nfs/zImage”表示 zImage 在 192.168.1.253 这个主机中,路径为/home/用户名/linux/nfs/zImage。下载过程如图所示:
nfs时出现的问题:
导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件。
解决办法为:让buntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。
操作方法如下:
(1)打开文件:sudo vim /etc/default/nfs-kernel-server (注意一定要sudo或者root权限)
RPCNFSDCOUNT="-V 2 8"
RPCMOUNTDOPTS="-V 2 --manage-gids"
RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"
(2)保存退出。
(3)重启NFS服务器。sudo service nfs-kernel-server restart
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
和 NFS 一样,TFTP 也需要一个文件夹来存放文件,在用户目录下新建一个目录,命令如下:
mkdir /home/用户名/linux/tftpboot chmod 777 /home/用户名/linux/tftpboot
这 样 我 就 在 我 的 电 脑 上 创 建 了 一 个 名 为 tftpboot 的目录 ( 文 件 夹 ) , 路 径 为/home/hzh/linux/tftpboot。注意!我们要给 tftpboot 文件夹权限,否则的话 uboot 不能从tftpboot 文件夹里面下载文件。最后配置 tftp,安装完成以后新建件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行创建,然后在里面输入如下内容:
server tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/hzh/linux/tftpboot/ disable = no per_source = 11 cps = 100 2 flags = IPv4 }
完了以后启动 tftp 服务,命令如下:
sudo service tftpd-hpa start
打开/etc/default/tftpd-hpa 文件,将其修改为如下所示内容:
# /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/home/用户名/linux/tftpboot" TFTP_ADDRESS=":69" TFTP_OPTIONS="-l -c -s"
TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过
TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
最后输入如下命令, 重启 tftp 服务器:
sudo service tftpd-hpa restart
tftp 服务器已经搭建好了,接下来就是使用了。将 zImage 镜像文件拷贝到 tftpboot 文件夹中,并且给予 zImage 相应的权限,命令如下:
cp zImage /home/zuozhongkai/linux/tftpboot/ cd /home/zuozhongkai/linux/tftpboot/ chmod 777 zImage
万事俱备,只剩验证了,uboot 中的 tftp 命令格式如下:
tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
看 起来 和 nfs 命令格 式一 样的 , loadAddress 是文 件在 DRAM 中的 存放 地址 ,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:
tftp 80800000 zImage
在上图中可以看到“TFTP error: 'Permission denied' (0)”这样的错误提示,提示没有权限,出现这个错误一般有两个原因:
①、在 Ubuntu 中创建 tftpboot 目录的时候没有给予 tftboot 相应的权限。
②、tftpboot 目录中要下载的文件没有给予相应的权限。
针对上述两个问题,使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹。
我们最常用的就是 ping、nfs 和 tftp 这三个命令。使用 ping 命令来查看网络的连接状态,使用 nfs 和 tftp 命令来从 Ubuntu 主机中下载文件。
ARM开发板QT Linux Tftp命令使用详解
下载文件:tftp -l /mnt/untitled1 -r untitled1 -g 192.168.5.11 上传文件:tftp -l /mnt/untitled1 -r untitled1 -p 192.168.5.11
使用命令
tftp [OPTION]... HOST [PORT]
Options:
-l 是local的缩写,后跟本地或下载到本地后重命名的文件名。
-r 是remote的缩写,后跟远程即PC机tftp服务器根目录中的文件名,或上传到PC机后重命名后的文件名。
-g 是get的缩写,下载文件时用,后跟PC机的IP地址
-p 是put的缩写,上传文件时用,后跟PC机的IP地址。
tftp 默认占用的是69端口
使用以下命令运行程序:
chmod +x untitled1 ./untitled1
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.5.11: /home/hzh/linux/nfs/rootfs ip=192.168.5.9:192.168.5.11:192.168.5.1: 255.255.255.0::eth0:off