Linux系统——通过tftp下载zImage和nfs网络方式挂载根文件系统
Posted 火山上的企鹅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统——通过tftp下载zImage和nfs网络方式挂载根文件系统相关的知识,希望对你有一定的参考价值。
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)设置 uboot 的 bootcmd 和 bootargs 环境变量 :
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系统
Linux系统网络安装——基于pxe+dhcp+nfs+tftp+kickstart