一、实验目的:
1. 熟悉Linux TFTP配置,为后续Linux底层开发做准备。 2. 熟悉Linux NFS文件系统的配置过程,为后续Linux底层开发实验做准备。
3. 熟悉嵌入式Linux交叉开发环境的搭建与使用。 二、 实验内容:
1. 利用安装好的虚拟机系统,测试TFTP服务是否正常。 2. 重新配置NFS文件系统。
3. 使用TFTP的方式下载内核,运行到开发板上;使用nfs方式挂载文件系统,为后续的开发做准备。
三、实验原理:
TFTP协议是简单文件传输协议,基于UDP协议,没有文件管理、用户控制功能。TFTP分为服务器端程序和客户端程序,在主机上通常同时配置有TFTP服务端和客户端。
NFS方式是开发板通过NFS挂载放在主机(PC)上的根文件系统。此时在主机上文件系统中进行的操作同步反映在开发板上;反之,在开发板上进行的操作同步反映在主机中的根文件系统上。实际工作中,我们经常使用NFS方式挂载系统,这种方式对于系统的调试非常方便。
四、实验步骤及过程:
1
1. 打开虚拟机,运行Ubuntu 12.04系统,打开命令行终端。
$cd /tftpboot $ls
回到home目录。
$ cd ~ //Linux下波浪线【~】代表用户的home目录,我们俗称主目录或者家目录 $ tftp 127.0.0.1 > get test
如上图所示,没有出现错误代码,且在家目录(/home/linux)下出现test文件,内容相同,则证明tftp服务建立成功。
2. 配置/etc/exports(sudo获取权限。输入密码,默认为1;如不会使用vim,
命令行vim字段用gedit代替,下面省略此说明。):
2
$sudo vim /etc/exports NFS允许挂载的目录及权限在文件/etc/exports中进行了定义。例如,我们要将/source/rootfs目录共享出来,那么我们需要在/etc/exports文件末尾添加如下一行:
/source/rootfs *(rw,sync,no_root_squash,no_subtree_check)
其中:/source/rootfs是要共享的目录,*代表允许所有的网络段访问,rw是可读写权限,sync是资料同步写入内存和硬盘,no_root_squash是NFS客户端分享目录使用者的权限,如果客户端使用的是root用户,那么对于该共享目录而言,该客户端就具有root权限。
重启服务:
$sudo etc/init.d/nfs-kernel-server restart 重启服务成功如下显示。(如果设置的路径没有相应的内容,会提示错误,可以先忽略这个问题)
3
3. 交叉开发环境搭建 1)配置开发环境网络
虚拟机网络方式为桥接模式,此状态下虚拟机下的操作系统和主机操作系统为平级状态。为了调试方便,我们可以给虚拟机下的Ubuntu一个静态的IP地址。
假设我们使用的网络地址为192.168.100.x段的,那么我们可以给Ubuntu分配一个IP为192.168.100.192,配置过程如下所示。 配置虚拟机网络环境。
$ sudo vim/etc/network/interfaces
修改文件如下图所示。保存退出(环境默认是加【#】注释掉的内容,修改前删除4-11行每行的注释。
应用网络修改。
$ sudo /etc/init.d/networking restart
4
如上图所示表明IP修改成功。使用【ifconfig】命令查看我们修改的结果。如果没有修改成功,重复上述步骤,或者重新启动虚拟机Ubuntu系统即可。
2) 配置交叉工具链
华清远见开发环境包含了3个版本的交叉工具链,路径在/usr/local/toolchain/下,不必再次解压,直接指向路径即可。
一般情况下,当我们输入一个Linux命令,比如【ls】可以直接执行功能,但当前的目录并没有【ls】这个文件。【ls】这个命令文件在【/bin】这个目录中,我们可以执行是因为这些命令所在的路径包含在了用户的环境变量中。为了使用方便需将经常使用的交叉工具链添加到环境变量中。
5
修改文件~/.bashrc,添加如下内容:
$ vim ~/.bashrc //注意bashrc前面有句点添加下面一行代码到文件的末尾。 export PATH=$PATH:/usr/local/toolchain/toolchain-4.4.6/bin/
重启配置文件
$ source ~/.bashrc
工具链的测试
$ arm-none-linux-gnueabi-gcc–v
6
直接输入命令,即可执行,这样说明我们的交叉工具链就安装好了。
3)拷贝文件
拷贝华清远见-WSN4412A资料光盘:\\实验代码\\2、Linux移植驱动及应用\\2、Linux系统移植\\实验代码\\镜像中的所有文件拷贝到Ubuntu共享目录D:\\share下(虚拟机共享文件夹设置)。
将共享目录中需要下载的文件拷贝到tftp目录中拷贝u-boot-fs4412.bin、uImage、exynos4412-fs4412.dtb文件到虚拟机Ubuntu下的/tftpboot目录下。
$cp /mnt/hgfs/share/u-boot-fs4412.bin /mnt/hgfs/share/uImage /mnt/hgfs/share/exynos4412-7
fs4412.dtb /tftpboot/
解压文件系统
拷贝华清远见-WSN4412A资料光盘:\\实验代码\\2、Linux移植驱动及应用\\2、Linux系统移植\\实验代码\\移植后的源码\\rootfs.tar.xz文件到虚拟机Ubuntu下的/source目录下。
$ cp /mnt/hgfs/share/rootfs.tar.xz /source/
$ cd /source/
$ tar xvf rootfs.tar.xz
8
4)连接开发板
设置串口调试工具
打开【华清远见-WSN4412A资料光盘\\工具软件\\Windows\\串口调试工具\\putty.exe】文件。
9
选择串口(Serial)连接方式:
选中第一步方框内的Serial,再点击第二步中的Serial,进入串口设置的对话框:
10
点击open打开串口。
5)启动开发板
拨码开关拨至0110,如下图所示。
启动开发板,在倒计时结束前,按任意键停止在Uboot处,串口终端显示图下图所示。
11
(注意下图的操作是需要在uboot版本为2013.01下操作,如果开发板中uboot版本为2010,则无法烧写成功。如果此处uboot版本不正确,需使用SD卡方式烧写UBoot)
修改开发板环境变量(命令框内开头为【#】一般是需要在串口终端对开发进行的操作,【$】一般是在虚拟机下对Ubuntu进行的操作,下面省略此说明)。尽量手动输入,不去复制pdf,避免非法字符。
# setenv serverip 192.168.100.192 //主机的IP地址,和3.4.1节,设置的Ubuntu IP地址一致
# setenv ipaddr 192.168.100.191 //板子的IP,不要和Windows或Ubuntu冲突 # saveenv //保存环境变量
使用【print】命令查看修改后的环境变量。
12
使用ping命令尝试ping一下Ubuntu主机,如下图所示,表示网络已经联通。
# ping 192.168.100.192
13
6)烧写uboot
在Uboot命令行下,执行命令:
#tftp 40008000 u-boot-fs4412.bin #movi write u-boot 40008000
重启开发板,如下图所示。
14
7)NFS挂载方式启动 修改开发板环境变量。
#setenv serverip 192.168.100.192 #setenv ipaddr 192.168.100.191 #setenv gatewayip 192.168.100.1
#setenv bootcmd tftp 41000000 uImage\\; tftp 42000000 exynos4412-fs4412.dtb\\; bootm 41000000 – 42000000 //此处和上文是一行内容,避免复制遗漏,结果参见下图
#setenv bootargs root=/dev/nfsnfsroot=192.168.100.192:/source/rootfs rw ip=192.168.100.191 init=/linuxrc console=ttySAC2,115200 //此处和上文是一行内容,避免复制遗漏,结果参见下图 # saveenv
用户在设定完这些环境变量后,如果需要重新启动android系统,首先需要将开发板的uboot版本变为2010.03版本(移植所需要的uboot版本为2013.01,用户需要特别注意),其次在烧写完android系统镜像后,需要修改环境变量。
重启开发板,如下图启动,表明内核从主机的/tftpboot处下载,文件系统为nfs网络文件系统,位置为主机的/source/rootfs/处。
15
8)EMMC方式启动
将【华清远见-WSN4412A资料光盘:\\实验代码\\2、Linux移植驱动及应用\\2、Linux系统移植\\实验代码\\镜像】下的U-boot(u-boot-fs4412.bin)、内核镜像(uImage)、设备树(exynos4412-fs4412.dtb)、
16
文件系统(ramdisk.img)拷贝到虚拟机/tftpboot目录下:
a) 烧写U-boot到EMMC上
#tftp 40080000 u-boot-fs4412.bin #movi writeu-boot 40008000
b) 烧写内核镜像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000
c) 烧写设备树文件到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb # movi write dtb 41000000
d) 烧写文件系统镜像到EMMC上
# tftp 41000000 ramdisk.img
# movi write rootfs 41000000 300000(烧写大小)
e) 设置启动参数(从EMMC模式自启动完全脱离服务器)
# setenv bootcmd movi read kernel 41000000\\;movi read dtb 42000000\\;movi read rootfs 43000000 300000\\;bootm 41000000 43000000 42000000 # saveenv
17
9)制作SD卡启动盘(只需在开发板没有UBoot时做) SD启动盘制作:
$ cd ~
将“华清远见-WSN4412A资料光盘:\\实验代码\\2、Linux移植驱动及应用\\2、Linux系统移植\\实验代码\\制作SD卡启动盘工具”目录下的sdfuse_q拷贝到虚拟机Ubuntu的共享目录下。
$cp /mnt/hgfs/share/sdfuse_q/ ~ -a
$ cd sdfuse_q //进入sdfuse_q目录 $ make //执行编译命令 $chmod 777 *.sh
用读卡器将SD卡插入电脑,虚拟机识别到SD读卡器。
18
右键点击图标,选择【连接】
查看生成的设备节点,笔者SD卡在Ubuntu系统中的设备节点是/dev/sdb,这里提供一种方式查看设备节点,首先输入ls /dev/sd*【*代表匹配所有符合sd的选项】,sd*最后的设备为sdb。
使用df–Th命令,下图就是整个SD卡被ubuntu识别之后所产生的设备节点。(从容量来说和SD卡容量对等,从挂载点来说符合一般的SD卡挂载点)。
19
NOTE:关于SD卡或者U盘在ubuntu下识别顺序的问题,有如下的规则:在插入的SD卡或者U盘设备被ubuntu识别之后,会依次识别成b,c,d……如果在插入需要制作的SD卡后没有其他的SD卡或者U盘设备插入,那么插入的SD卡会被识别成为/dev/sd*下的最后一个纯字母的设备(如下图中即被识别成为sdb),即类似于下图:
在确定了设备节点之后,使用如下的命令制作SD卡,如果识别的节点不是sdb,则需要更换为识别的节点。
$sudo ./mkuboot.sh /dev/sdb //将uboot烧写到sd卡中
重新插入SD卡,如果提示需格式化,格式化即可。在SD卡目录下创建目录sdupdate,并将“光盘:\\ 实验代码\\2、Linux移植驱动及应用\\2、Linux系统移植\\实验代码\\镜像”下的u-boot-fs4412.bin(图一)拷贝到sdupdate(图二)目录下,这个操作在windows下或Linux下做都可以。
20
将SD卡插入开发板SD卡槽内,拨码拨至1000,连接开发板,设置串口调试助手,设置完毕启动开发板。
在倒计时时按任意键即可看到上图所示,即为SD卡启动成功。在uboot命令行下,执行命令:
#sdfuse flashall
21
将拨码开关拨至0110,重启开发板,如下图所示。
用户再设置环境参数即可。 五、总结与体会:
从实验来看TFTP和NFS都能正常使用,在NFS服务重启中,会提示设置的路径没有相应的内容的错误提示,但这可以忽略,因相应内容会在后面的实验进行补充。
Linux具有很丰富的命令,绝大多数命令具有大量的参数。在学习命令的过程中,只要你认真的看着老师操作还有认真听着他讲,你就会发现有些命令的操作还是很简单的,不过在操作的过程中,我也有遇到有些困难,会出现你按照书上学习的例子,将命令输入终端时会出现你不想要的结果,也就是错误的结果。这是问问旁边的同学或是懂的同学就可以解决了。在对于这部分的学习中,让我知道了命令对于嵌入式的重要性。它是linux的重要内容,linux中所有的功能都是通过命令执行。在实际应用中,为了减少系统开销,经常不使用图形界面,此时,对系统的所有操作都需要以命令方式来执行。在嵌入式系统开发过程中,由于目标机的性能和配置比较低,因此,一般情况下目标机仅具有命令窗口而没有图形界面,对目标机的所有操作都通过命令来实现。
通过本次实验,主要掌握了嵌入式Linux主机调试环境的搭建,掌握了嵌入式主机通信环境的配置,学会了使用交叉编译工具链,学会配置Linux下的超级终端如进行超级终端的参数设置,能够建立超级终端和Linux之间的连接,并且连接到开发板,进行操作,了解u-boot-的移植流程。虽然一开始对于该实验遇到不少难点,如进行一些参数设置,但经过老师的指导和与别人的交流逐步的解决了,通过本次实验不仅让我们学到了嵌入式的一些专业知识,更让我们明白做实验所需要的合作与交流,这是至关重要的。接触嵌入式交叉编译环境并不是太容易,课下还需要不断的练习,才能更好地掌握嵌入式Linux主机调试环境的搭建和使用。
22
因篇幅问题不能全部显示,请点此查看更多更全内容