Linux系统——通过tftp下载zImage和nfs网络方式挂载根文件系统

Posted 火山上的企鹅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统——通过tftp下载zImage和nfs网络方式挂载根文件系统相关的知识,希望对你有一定的参考价值。

在这里插入图片描述


所有的热爱都要不遗余力,真正喜欢它便给它更高的优先级,和更多的时间吧!

Linux系统&驱动其它文章:     Linux


本文为《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.1》 中学习笔记


为了方便调试,一般通过网络方式启动 Linux,如果每次修改 Linux 系统文件或者 linux 下的某个驱动以后都要将其烧写到 EMMC 中去测试,这样太麻烦;

只需将 linux 镜像文件和根文件系统都放到 Ubuntu 下,这样每次重新编译 linux 内核或者某个 linux 驱动,只需 cp 将其拷贝到这个指定的文件夹中即可;

tftp 从 Ubuntu 中下载 zImage 和设备树文件,通过 nsf 挂载根文件系统;

首先应对 nsf 和 tftp 进行安装配置:

1. nsf、tftp 安装和配置

配置工作基本分四步:

安装
指定服务器目录
配置文件
重启

1.1 nsf

一般Linux 驱动在开发中通过 nfs(Network File System) 挂载根文件系统,当产品最终上市开卖的时候才会将根文件系统烧写到 EMMC 或者 NAND 中。

① 安装 NFS 服务:

sudo apt-get install nfs-kernel-server rpcbind

② 在 linux 下 创建nfs 文件夹供 nfs 服务器使用:

mkdir /home/chunn/linux/nfs

③ 修改nfs配置文件:

sudo vi /etc/exports

在最后添加:
/home/chunn/linux/nfs *(rw,sync,no_root_squash)在这里插入图片描述
④ 重启 NFS 服务,使用命令如下:

sudo /etc/init.d/nfs-kernel-server restart

⑤ 检查nfs服务器中挂载的目录。

showmount  -e

配置到此结束,接下来就是在nfs目录下构件根目录系统。

PS: 博主之前只想快速开发驱动,而忽略nfs的配置,检查挂载的目录时:
在这里插入图片描述
本文ubuntu系统使用的正点原子提供的镜像文件,所以默认还是 alientek 的用户名,从而引起内核恐慌,始终挂载失败~

1.2 tftp

tftp(Trivial File Transfer Protocol) 命令的作用和 nfs 命令一样,都是用于通过网络下载东西到 DRAM 中,只是 tftp 命令使用的 TFTP 协议,Ubuntu 主机作为 TFTP 服务器。

① 安装:

sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd

② 在 linux 下 创建 tftp 文件夹供 tftp 服务器使用, 并给权限:

mkdir /home/chunn/linux/tftpboot
chmod 777 /home/chunn/linux/tftpboot

③ 修改 tftp 的配置文件:

sudo vi /etc/xinetd.d/tftp
# /etc/xinetd.d/tftp
server tftp
{
	socket_type = dgram     					#socket的链接类型是dgram(UDP)
	protocol = udp								#UDP协议
	wait = yes									#等待到启动完成
	disable = no  								#yes表示TFTP服务器是关闭的;no表示启动TFTP服务器
	user = root                          		#指定root用户启动服务进程
	server = /usr/sbin/in.tftpd					#指定服务进程是/usr/sbin/in.tftpd
	server_args = -s /home/chunn/linux/tftp -c  #指定传给该进程的参数(确定目录)
	#log_on_success += PID HOST DURATION
	#log_on_failure += HOST
	per_source = 11								#表示每一个ip地址上最多可以建立的实例数目
	cps =100 2									#表示每秒100个入站链接,如果超过限制,则等待2秒
	flags =IPv4									#IPv4网络
 }

④ 修改tftp-hpa 的配置文件:

sudo vi /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"   
TFTP_DIRECTORY="/home/chunn/linux/tftp"     #TFTP服务器的目录设置
TFTP_ADDRESS=":69"						    #ip地址和端口号
TFTP_OPTIONS="--secure"

⑤ 重启tftp

sudo service tftpd-hpa restart

配置到此结束,还需要把zImage拷贝到 tftp中目录,并下载

2. uboot 环境变量配置

使用SecureCRT进入uboot, 输入uboot 指令进行网络环境变量设置

2.1 设置IP

setenv ethaddr 00:04:9f:04:d2:35    //硬件地址
setenv gatewayip 192.168.1.1		//网关	
setenv ipaddr 192.168.1.103         //开发板的IP地址
setenv netmask 255.255.255.0		//子网掩码
setenv serverip 192.168.1.102		//Ubuntu的IP地址(可以通过ifconfig查询)
saveenv                   			//保存环境变量

2.2 设置bootcmd (tftp下载zImage和设备树)

bootcmd: 其名分为 “boot”“cmd”,也就是“引导”和“命令”,其实就是启动的命令集合, 如下为使用 tftp 从网络启动 Linux(验证通过的):

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
saveenv        

● bootcmd 设置的内容:

1) tftp 80800000 zImage : (tftpboot [loadAddress] [[hostIPaddr:]bootfilename] )

将 tftpboot 文件夹里面的 zImage 文件下载到DRAM的0X80800000地址处;

2) tftp 83000000 imx6ull-alientek-emmc.dtb;  

将设备树imx6ull-14x14-emmc-7-1024x600-c.dtb 下载到 DRAM 中的 0X83000000 地址处

3) bootz 80800000 - 83000000

使用命令 bootz 启动

● 指令:

setenv bootcmd : 设置bootcmd  变量,后续有空格,所以加上引号
saveenv  :       保存环境变量

● 注意:

1) Ubuntu 中创建 tftpboot 目录的时需要给予 tftboot 相应的权限。

2) tftpboot 目录中要下载的文件没有给予相应的权限

使用命令“chmod 777 xxx”来给予权限,其中“xxx”就是要给予权限的文件或文件夹

2.3 设置bootargs (从nfs 挂载根文件系统)

bootargs 保存着 uboot 传递给 Linux 内核的参数,主要用来告诉内核分区信息和根文件系统所在的分区等

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.0.102:/home/chunn/linux/nfs/rootfs ip=192.168.0.103:192.168.0.102:192.168.0.1:255.255.255.0::eth0:off' 
saveenv

● nfs 挂载的 bootargs 格式如下:

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 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP
地址,比如我的 Ubuntu 主机 IP 地址为 192.168.0.102。
<root-dir> :根文件系统的存放路径,比如我的就是/home/chunn/linux/nfs/rootfs。
<nfs-options>:NFS 的其他可选选项,一般不设置。
<client-ip> :开发板的 IP 地址,Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能 ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为 192.168.0.103。
<server-ip> :服务器 IP 地址,前面已经说了。
<gw-ip> :网关地址,我的就是 192.168.0.1。
<netmask>:子网掩码,我的就是 255.255.255.0。
<hostname>:客户机的名字,一般不设置,此值可以空着。
<device> :设备名,也就是网卡名,一般是 eth0,eth1….,正点原子的 I.MX6U-ALPHA 开发板的 ENET2 为 eth0,ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。 这里我们使用 ENET2,所以网卡名就是 eth0。
<autoconf> :自动配置,一般不使用,所以设置为 off。
<dns0-ip> :DNS0 服务器 IP 地址,不使用。
<dns1-ip> :DNS1 服务器 IP 地址,不使用。

其它解释:

1)console=ttymxc0,115200  :ttymxc0(也就是串口 1)作为 Linux 的终端,并且串口波特率设置为 115200
2)“rw” : 表示 nfs 挂载的根文件系统为可读可写。

3. 过程梳理

1)在ubuntu 中 配置好nsf、tftp服务,关键步骤:

sudo vi /etc/exports           //nfs配置
sudo vi /etc/xinetd.d/tftp     //tft配置
sudo vi /etc/default/tftpd-hpa //tftpd-hpa配置

2)/home/chunn/linux/tftp 文件夹下准备好 imx6ull-alientek-emmc.dtb 设备树、zImage 内核镜像;/home/chunn/linux/nfs 文件夹下准备好rootfs 根文件系统

3)设置 uboot 的IP环境变量:

setenv ethaddr 00:04:9f:04:d2:35    //硬件地址
setenv gatewayip 192.168.1.1		//网关	
setenv ipaddr 192.168.1.103         //开发板的IP地址
setenv netmask 255.255.255.0		//子网掩码
setenv serverip 192.168.1.102		//Ubuntu的IP地址(可以通过ifconfig查询)
saveenv                   			//保存环境变量

4)设置 ubootbootcmdbootargs 环境变量 :

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.0.102:/home/chunn/linux/nfs/rootfs ip=192.168.0.103:192.168.0.102:192.168.0.1:255.255.255.0::eth0:off' 
saveenv        

最后终于进入熟悉的根文件系统:
在这里插入图片描述


Linux系统&驱动其它文章:     Linux

以上是关于Linux系统——通过tftp下载zImage和nfs网络方式挂载根文件系统的主要内容,如果未能解决你的问题,请参考以下文章

正点原子I.MX6U-MINI通过tftp从Ubuntu中下载zImage 和设备树文件 | 从网络启动Linux系统

正点原子I.MX6U-MINI通过tftp从Ubuntu中下载zImage 和设备树文件 | 从网络启动Linux系统

嵌入式开发——uboot如何启动内核(以zImage详解)

Linux系统网络安装——基于pxe+dhcp+nfs+tftp+kickstart

linux的uboot启动映像,zImage和uImage的区别

Linux系统下安装使用tftp