本帖最后由 仰望星空之云 于 2021-9-14 15:11 编辑
这里给大家分享一下我自己搭建TFTP+NFS的简洁笔记,还有TFTP加载内核和设备树以及NFS挂载文件系统的简单步骤。由于篇幅原因,操作步骤只做了简单的介绍。 左工的视频和教程也有讲解到搭建了TFTP和NFS了,按照左工的文档或者视频介绍搭建好NFS环境以后直接mount那个路径就可以在开发板上访问NFS目录了的。我Ubuntu (我用的是14.04版本的)设置的是桥接,开发板通过网线接着路由器,开发板和电脑通过一根网线来直连电脑也是可以的,直连的方式的话,需要设置Windows为静态IP, Ubuntu也要设置为静态IP,将Windows、UBuntu、开发板的IP设置在同一个网段,两两能互相ping通。我使用的是正点原子阿尔法开发板,核心板版本是EMMC的,核心板已 经烧录好了Linux文件系统了。
一、TFTP开发环境搭建 虚拟机设置成桥接模式: 安装安装和配置xinetd - sudo apt-get install xinetd
复制代码查询/etc/下是否存在xinetd.conf文件,没有的话则自己新建一个 我这里是已经有了xinetd.conf文件的,如果没有的话自己新建xinetd.conf这个文件,的方法是: 修改xinetd.conf文件,内容如下: - # Simple configuration file for xinetd
- #
- # Some defaults, and include /etc/xinetd.d/
- defaults
- {
- # Please note that you need a log_type line to be able to use log_on_success
- # and log_on_failure. The default is the following :
- # log_type = SYSLOG daemon info
- }
- includedir /etc/xinetd.d
复制代码新建TFTP工作目录,此目录可以新建在其它地方,个人习惯建立在/home/MY目录下 修改TEST目录权限为可读可写可执行 安装tftp-hpa和tftpd-hpa服务程序 - sudo apt-get install tftp-hpa tftpd-hpa
复制代码- vi /etc/default/tftpd-hpa
复制代码- TFTP_USERNAME="tftp"
- TFTP_DIRECTORY="/home/MY/TEST"
- TFTP_ADDRESS=":69"
- TFTP_OPTIONS="-l -c -s"
复制代码其中/home/MY/TEST是ubuntu上TFTP目录,我是把/home/MY/TEST当做TFTP目录,大家可以自己设定一个目录。 将TEST文件夹设置为TFTP服务器工作目录 配置/etc/ xinetd.d/tftp文件 - sudo vi /etc/xinetd.d/tftp
复制代码- servicetftp
- {
- socket_type = dgram
- wait = yes
- disable = no
- user = root
- protocol = udp
- server = /usr/sbin/in.tftpd
- server_args = -s /home/MY/TEST -c
- #log_on_success += PID HOST DURATION
- #log_on_failure += HOST
- per_source = 11
- cps =100 2
- flags =IPv4
- }
复制代码重启tftpd-hpa - sudo service tftpd-hpa restart
复制代码重新启动xinetd服务 - sudo service xinetd restart
复制代码开发板和Windows、Ubuntu互相ping测试 查看Windows的IP为192.168.1.88 查看Ubuntu的IP为192.168.1.185 查看开发板的IP为192.168.1.229 Windows和开发板以及Ubuntu互相两两ping测试,测试ping通过
TFTP功能测试,即开发板下载TFTP服务器(就是指Ubuntu)的文件
如上我在前面新建的TEST目录下新建了一个test.c的文件,并在文件中写入内容为123 下载虚拟机TFTP服务器文件(就是下载刚才新建的那个test.c文件) 先查看原来开发板的/home/root下有什么,可以看到有driver和shell这两个文件夹 执行如下指令让开发板获取TFTP服务器上的文件: - tftp -g -r test.c 192.168.1.185
复制代码执行以上指令以后可以看到开发板的/home/root目录下有了test.c文件,用cat指令查看这个文件的内容是123,说明这个文件是TFTP服务器上的那个test.c文件, 此时开发板通过TFTP服务获取服务器上的文件成功。类似其它的文件我们也可以用类似的方法来获取。 至此,TFTP开发环境搭建成功。
当然,要验证TFTP是否有搭建成功,除了上面的和开发板使用TFTP来进行互传文件以外,也可以直接在Ubuntu上测试: 先在TFTP目录/home/MY/TEST下新建文件q.c,文件内容是1234561,然后回到/home/MY目录下执行tftp 127.0.0.1指令实现TFTP连接到本机(127.0.0.1表示本机,即ubuntu),然后执行 get q.c从TFTP目录(/home/MY/TEST)拷贝文件到当前目录(/home/MY)执行q退出TFTP连接,查看/home/MY下有文件q.c,用cat指令查看q.c文件的内容是1234561,和TFTP的文件的内容一样。
同理,可以将当前目录的文件通过TFTP传输到TFTP目录,如我在当前目录/home/MY下新建文件b.c,文件内容是abcdef,执行tftp 127.0.0.1连接TFTP,然后执行put b.c将文件b.c传输到TFTP目录下/home/MY/TEST
,按q退出连接,查看TFTP目录下有了文件b.c文件内容和/home/MY下的b.c文件内容一样。可以验证TFTP搭建成功。
以上TFTP命令行的解释: put:将文件上传到TFTP目录 get:取得TFTP目录上的文件 quit/q:退出TFTP
二、NFS开发环境搭建 同上我设置虚拟机上网方式为桥接模式。 Ubuntu终端安装NFS服务包: - sudo apt-get install nfs-kernel-server
复制代码新建NFS共享目录,并给予NFS目录可读可写可执行权限: - sudo mkdir /home/MY/NFS
- sudo chmod 777 NFS/
复制代码配置NFS服务: 进入 etc/exports目录,在最后添加如下一句话,这句话的意思是/home/MY/NFS是我的NFS共享的目录(我把ubuntu上 /home/MY/NFS这个目录当做NFS目录), *:表示允许所有的网络段访问,rw:访问者具有可读写权限,sync:表示将缓存写入设备中,可以说是同步缓存的意思,no_root_squash:表示访问者具有root权限。 - /home/MY/NFS *(rw,sync,no_root_squash)
复制代码修改完以后保存退出,重启NFS服务器: - sudo /etc/init.d/nfs-kernel-server restart
复制代码查看NFS共享目录: NFS功能测试,就是想让开发板通过NFS服务访问NFS服务器(就是指UBuntu)的数据: 如上的操作,我就是在前面新建的NFS目录下新建了一个my.c文件,并在这个文件中输入abcdefg Windows、Ubuntu和开发板两两互相ping测试(这里因为篇幅原因省略,要保证开发板、Windows和UBuntu两两互相ping测试成功) NFS服务器测试,就是让开发板挂载NFS目录,然后开发板就能够从NFS服务器获取NFS目录的数据。这里,我是将Ubuntu上的那个NFS目 录挂载在了开发板的/home/root/you下,这个you是我在开发板/home/root下新建的目录,然后将NFS目录挂载在新建的目录下。 开发板文件系统下执行如下指令: - mkdir you
- mount -t nfs -o nolock,nfsvers=3 192.168.1.185:/home/MY/NFS you/
复制代码查看挂载目录: 卸载NFS挂载目录 可以看到192.168.1.185:/home/MY/NFS已经卸载了 三、挂载Linux文件系统 将开发板光盘A-基础资料\5、开发工具\4、正点原子修改过的MFG_TOOL烧写工具\mfgtool\Profiles\Linux\OS Firmware\files\boot下的内核和对应的设备树拷贝到 TEST目录下。(这里我直接用了正点原子提供的内核和设备树来操作,自己也可以按照教程来移植然后用自己编译的内核和设备树): ubuntu下如下:
将开发板光盘A-基础资料\5、开发工具\4、正点原子修改过的MFG_TOOL烧写工具\mfgtool\Profiles\Linux\OS Firmware\files\filesystem下的文件系统压缩包rootfs.tar.bz2拷贝 到前面我搭建的NFS的目录下(这里我用的是正点原子提供的文件系统,按照教程来移植文件系统以后,也可以用自己移植的文件系统): 如下图,拷贝成功以后,ubuntu下新建一个rootfs目录,并将文件系统压缩包解压到新建的rootfs目录下: - mkdir rootfs
- tar -jxvf rootfs.tar.bz2 -C rootfs/
复制代码如下图,解压完成以后,进入ubuntu新建的rootfs目录,查看有了解压的文件系统,那么文件系统的根目录是/home/MY/NFS/rootfs (1)开发板从EMMC启动uboot,进入uboot设置,即TFTP加载内核和设备树,从EMMC启动文件系统: 这些指令是在开发板的uboot下执行的: 先设置IP,serverip是服务器(Ubuntu)的IP, ipaddr是开发板的IP,ethaddr 是开发板的MAC地址,gatewayip 是网关,netmask 是子网掩码。 Ps:这些IP的设置要根据自己网络拓扑情况来。关于设置,我们左工的教程里也有写到了。这些设置是在英文下的。
- setenv serverip 192.168.1.185
- setenv ipaddr 192.168.1.110
- setenv ethaddr 00:04:9f:04:d2:35
- setenv gatewayip 192.168.1.1
- setenv netmask 255.255.255.0
复制代码然后进行ping测试,即开发板ping测试Ubuntu,能ping通说明网络通了。 ping 192.168.1.185
设置mmcboot - setenv mmcboot 'echo Booting from mmc ...; run mmcargs; tftp ${loadaddr} zImage;tftp ${fdt_addr} imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz ${loadaddr} - ${fdt_addr};'
复制代码保存环境变量: saveenv 按照以上方法,保存环境变量以后开发板重启。 启动过程中看到开发板从TFTP加载了内核和设备树: 然后系统加载了EMMC里的文件系统(前提是我之前是已经将文件系统固化到EMMC了,这个步骤可以参考《【正点原子】I.MX6U用户快速体验》的固化步骤),如下,系统加载成功。 (2)从EMMC启动uboot,进入uboot设置,即TFTP加载内核和设备树,从NFS挂载文件系统: 这些指令是在开发板的uboot下执行的: 设置步骤如上相似。 - setenv serverip 192.168.1.185
- setenv ipaddr 192.168.1.110
- setenv ethaddr 00:04:9f:04:d2:35
- setenv gatewayip 192.168.1.1
- setenv netmask 255.255.255.0
复制代码- setenv bootcmd 'tftp ${loadaddr} zImage;tftp ${fdt_addr} imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz ${loadaddr} - ${fdt_addr};'
复制代码- setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.185:/home/MY/NFS/rootfs ip=192.168.1.110:192.168.1.185:192.168.1.1:255.255.255.0::eth0:off'
复制代码按照以上方法,保存环境变量以后开发板重启,启动过程中看到开发板从TFTP加载了内核和设备树: NFS挂载文件系统成功: 以上的操作步骤,核心板是NAND的操作也是类似的。按照《【正点原子】I.MX6U用户快速体验》这个文档将配套的TF卡做成了一张系统启动卡,开发板从SD卡启动uboot以后也 可以按照以上的操作方法来设置。只要uboot起来了,内核和设备树也加载成功了,在uboot下进行环境变量的设置,挂载文件系统的话,可以选择挂载TF系统启动卡/NAND/EMMC 里的文件系统(前提是已经将文件系统固化好了),或者是挂载NFS里的文件系统。操作的话大家可以自己试试,不同的方式环境变量配置不同。
当然,也可以使用NFS加载内核和设备树,如下:这些指令是在开发板的uboot下执行的:
NFS加载内核和设备树以及挂载文件系统的bootcmd和bootargs指令就贴出来,不截图了: - setenv bootcmd 'nfs 80800000 192.168.1.185:/home/MY/NFS/zImage;nfs 83000000 192.168.1.185:/home/MY/NFS/imx6ull-14x14-emmc-4.3-800x480-c.dtb;bootz 80800000 - 83000000;'
复制代码- setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.185:/home/MY/NFS/rootfs ip=192.168.1.110:192.168.1.185:192.168.1.1:255.255.255.0::eth0:off'
复制代码其它方式,也基本上是修改uboot下的环境变量了,都差不多的。把uboot下的环境变量研究一遍,修改起来就理解了。
另外提醒一下:uboot 无法通过 nfs 启动 Ubuntu 18.04 内的根文件目录的问题(ubuntu版本高于16.04的都会有这个问题):
需要在ubuntu的 /etc/default/nfs-kernel-server文件进行修改,改好了保存退出,然后重启一下 nfs 就可以了:
或者报错Loading:*ww ERROR:File lookup fail的话,先检查自己的指令是不是写对了,例如用nfs加载内核的时候,内核名字是zImage,
有的人不小心写错了,写成了zlmage(其中的小写的i对应的大写I不小心写成了大写L对应的小写l,这个名字就错了),也是会报错Loading:*ww ERROR:File lookup fail的:
如果检查指令没问题,还是报错Loading:*ww ERROR:File lookup fail的话,那请检查自己的ubuntu版本,可以执行如下指令查看Ubuntu的版本
特别是大于16.04版本的ubuntu需要修改如下地方的配置:
按照上面截图改完后保存退出,再在ubuntu下执行指令sudo service nfs-kernel-server restart重启nfs服务。------(这里提示一下,如果执行这个指令还是没有效果的话,那就试试重启ubuntu吧,重启ubuntu以后,以上的配置应该就生效了)
在客户端上挂载服务端的nfs,可以执行指令进行挂载:在开发板文件系统下新建一个目录you
mkdir you
然后,在开发板下执行如下指令进行挂载ubuntu上的文件系统
- mount -t nfs -o nolock,nfsvers=3 192.168.1.185:/home/MY/NFS you/
复制代码 上面的这个指令是在开发板启动以后在文件系统下执行的,我上面有截图
如果不加 -onolock,nfsvers=3 ,挂载的时候会出现各种问题,所以我们要指定nfs版本为3。
执行指令 df -h 可以查看挂载情况。
正点原子开源电子公众号开启了,喜欢的伙伴可以关注哦:https://mp.weixin.qq.com/s/IFDd5am26K1rImLXjoBhEw
|