开发板要通过网络加载内核、设备树、文件系统,首先要搭建好tftp和nfs服务
1.搭建tftp服务器
tftp服务安装
//----虚拟机上安装tftp服务
$ sudo dpkg -s tftpd-hpa //检查是否安装tftp server
$ sudo apt-get install tftpd-hpa //如果未安装,安装 tftp-server
$ sudo vi /etc/default/tftpd-hpa //修改tftp服务器配置文件为
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l"
$ mkdir /tftpboot //创建tftpboot目录,
$ sudo chmod a+w /tftpboot
$ sudo service tftpd-hpa restart //启动 tftp-server
//-----验证虚拟机tftp服务是否OK
$ sudo cat /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-l -c -s"
$ sudo service tftpd-hpa restart //如果有更改配置,需要重启一下 tftp-server
$ cd /tftpboot
$ touch test
$ cd /tmp
$ tftp 127.0.0.1
tftp>get test
tftp>q
$ ls //看到有test文件,表示该tftp服务是OK的
2.nfs服务搭建
//nfs服务安装
$ service nfs-kernel-server /*检查nfs服务是否安装
如果显示下面信息, 表示有安装
* Usage: nfs-kernel-server {start|stop|status|reload|force-reload|restart}
如果没有,需安装
#sudo apt-get install nfs-kernel-server
*/
$ sudo vi /etc/exports /*修改配置文件,指定共享目录位置
在末尾追加
/nfs/rootfs *(rw,sync,no_root_squash)
或 /source/ *(rw,sync,no_subtree_check)
*/
$ sudo mkdir /nfs
$ sudo chmod 777 /nfs
$ cd /nfs
$ sudo mkdir /nfs/rootfs
$ 拷贝 文件系统压缩包 rootfs.tar.xz 到 /nfs/rootfs 目录下 //rootfs.tar.xz是已制作好的根文件系统
$ tar -xvf rootfs.tar.xz
$ sudo chmod 777 rootfs
$ sudo /etc/init.d/nfs-kernel-server restart //重启nfs服务(使得前面修改生效)
$ sudo mount -t nfs localhost:/nfs/rootfs/ /mnt/ //测试nfs服务是否安装成功。
$ ls /mnt/ /*如果其中的内容和/nfs/rootfs中一致。 表示有挂载成功
如显示下面内容,表示成功
bin dev etc lib linuxrc mnt proc root sbin sys tmp usr var
*/
$ sudo umount /mnt
3.设置内核加载启动参数
#setenv bootcmd tftp 41000000 zImage\;tftp 42000000 imx6q-sabresd.dtb\;go 41000000 - 42000000
设置完成后重新上电运行,出现如下图现象停在了starting这里就死掉了。
过来两天再来弄了,后来在一篇博客上又说这是因为加载内核和设备树的时候地址不对,
我又在串口调试窗口查看环境printenv,把地址改为了12000000-18000000,我用“setenv bootcmd tftpboot 12000000 zImage\;tftpboot 18000000 imx6q-sabresd.dtb\;run netargs\;bootz 12000000-18000000”设值,但是还是卡死在starting。但是我用“setenv bootcmd tftpboot 12000000 zImage\;tftpboot 18000000 imx6q-sabresd.dtb\;run netargs\;bootz ${loadaddr} - ${fdt_addr}”这么赋值就可以运行了。但是就下面这个图里一样,显示的却是setenv bootcmd tftpboot 12000000 zImage\;tftpboot 18000000 imx6q-sabresd.dtb\;run netargs\;bootz 0x12000000 - 0x18000000,我以为是没有加0x,但是加了也不行。后来发现‘-’这个符号要用空格隔开,要这么才行“setenv bootcmd tftpboot 12000000 zImage\;tftpboot 18000000 imx6q-sabresd.dtb\;run netargs\;bootz 0x12000000 - 0x18000000”。恼火!!
最后还是成功了,搞了几天,只要是弄明白了网络加载内核和根文件系统时,加载在内存位置时,有些板子是在内核中固定的,不能随便下载在内存中去,最后给个成功的截图。终于可以在调内核和程序时,每次都下载进去了。节约时间。