开发板通过网络加载内核、设备树、根文件系统

开发板要通过网络加载内核、设备树、文件系统,首先要搭建好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 serverip 192.168.9.119
#setenv ipaddr 192.168.9.233
#setenv bootcmd tftpboot 4 1 000000 zImage\;tftpboot 4 2 000000 imx6q-sabresd.dtb\;go 4 1 000000 - 4 2 000000
# setenv bootargs root= /dev/ nfs nfsroot=192.168.80.119:/source/rootfs rw console=ttySAC2,115200init=/linuxrc ip=192.168.80.133
g)设置文件系统启动参数
setenv nfsserverip 192.168.80.119;setenv serverip 192.168.80.119;setenv nfsroot /nfs/rootfs;setenv ipaddr 192.168.80.133;setenv gatewayip 192.168.80.1
# saveenv
注意:(1) 192.168.9.120 对应 Ubuntu ip
 192.168.9.233 对应板子的 ip
这两个 ip 应该根据自己的实际情况适当修改
(2)很多板子是tftp而不是tftpboot,因为我的板子命令格式是tftpboot所以才是tftpboot如图

#setenv bootcmd tftp 41000000 zImage\;tftp 42000000 imx6q-sabresd.dtb\;go 41000000 - 42000000

(3)内核是zImage用go 41000000 - 42000000,内核是uImage用 bootm 4 1 000000 - 4 2 000000



设置完成后重新上电运行,出现如下图现象停在了starting这里就死掉了。


过来两天再来弄了,后来在一篇博客上又说这是因为加载内核和设备树的时候地址不对,

https://www.cnblogs.com/emouse/archive/2013/01/19/2868014.html 这里有介绍,但我的和他的有些差别,最后我在uboot-imx\include\configs\ms6sabre_common.h这个头文件里找到了介绍加载地址的,开始用的0x12000000和0x17800000,到后来还是卡在了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”。恼火!!


最后还是成功了,搞了几天,只要是弄明白了网络加载内核和根文件系统时,加载在内存位置时,有些板子是在内核中固定的,不能随便下载在内存中去,最后给个成功的截图。终于可以在调内核和程序时,每次都下载进去了。节约时间。


猜你喜欢

转载自blog.csdn.net/qq_41133610/article/details/80018376