设置开发板uboot通过TFTP下载内核镜像与设备树,通过NFS挂载主机上的根文件系统
//##############################################################################
// uboot 里面的 bootargs 环境变量会设置“root”的值,所以我们将 root 的值改为 NFS 挂载即可。
// 在 Linux 内核源码里面有相应的文档讲解如何设置,文档为 Documentation/filesystems/nfs/nfsroot.txt,格式如下:
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
// <server-ip> :服务器 IP 地址(即 Ubuntu 主机的 IP 地址),我的是 192.168.31.172。
// <root-dir> :根文件系统的存放路径,比如我的就是 /home/book/nfs_rootfs 。
// <nfs-options>:NFS 的其他可选选项,一般不设置。
// <client-ip> :客户端 IP 地址(即开发板的 IP 地址),我的是 192.168.31.173。
// <server-ip> :服务器 IP 地址,同前面。
// <gw-ip> :网关地址,我的是 192.168.31.1。
// <netmask> :子网掩码,我的是 255.255.255.0。
// <hostname> :客户机的名字,一般不设置,可以空着。
// <device> :设备名,也就是网卡名,一般是 eth0,eth1….,看你实际插哪个。
// <autoconf> :自动配置,一般不使用,所以设置为 off。
// <dns0-ip> :DNS0 服务器 IP 地址,不使用。
// <dns1-ip> :DNS1 服务器 IP 地址,不使用。
// 根据上面的格式 bootargs 环境变量的 root 值如下:
root=/dev/nfs nfsroot=192.168.31.172:/home/book/nfs_rootfs,proto=tcp rw ip=192.168.31.173:192.168.31.172:192.168.31.1:255.255.255.0::eth0:off
// “proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。
//##############################################################################
// 【NFS挂载】示例
//// 1) 修改 Ubuntu 的 nfs 版本配置
// Ubuntu18 的 nfs 默认只支持 3 和 4 版本的 nfs,uboot 默认使用的是版本 2,所以直接需要修改 Ubuntu18 的 nfs 配置,
// 打开 Ubuntu 下的/etc/default/nfs-kernel-server 文件,然后在最后面添加下面这一行:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
// 然后重启服务
sudo /etc/init.d/nfs-kernel-server restart
//// 2) 开发板 u-boot 的 bootargs 变量设置
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.31.172:/home/book/nfs_rootfs,proto=tcp rw ip=192.168.31.173:192.168.31.172:192.168.31.1:255.255.255.0::eth0:off'
saveenv
//##############################################################################
// 【TFTP下载】示例
==》》配置TFTP服务(待续)。
//// 1)开发板 u-boot 的 bootcmd 变量设置(这里是设置从 tftp 服务器下载内核镜像和设备树到开发板内存上)
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157c-100ask-512d-lcd-v1.dtb;bootm c2000000 - c4000000'
saveenv
//// 2) 作为与1)的对照,这里是设置从开发板外存(EMMC Flash ROM 等)上加载内核镜像和设备树到内存上运行,例如:
setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157c-100ask-512d-lcd-v1.dtb;bootm c2000000 - c4000000'
saveenv
一般地,在调试驱动过程中,我们会设置第 1)种方法,即 u-boot 直接从 Ubuntu 的 tftp 目录下载内核镜像和设备树到开发板内存上运行,因为调试时,我们可能会不时修改并重新编译内核镜像或设备树,
采用第 1)种方法,就不用在每次更改镜像或设备树后,都去重新下载内核镜像与设备树到开发板。
而在产品完成时,我们会将系统镜像和设备树,以及打包好的文件系统一起下载到外存上,然后用第 2)种方法启动。
//##############################################################################
最后, 执行 bootcmd ,之后会自动引导内核,解析设备树,挂载文件系统。
run bootcmd
浙公网安备 33010602011771号