我们在下面会在u-boot下面所有tftp服务从服务器下载linux内核和根文件,并且使用NFS挂载内核的根文件系统,所有下面需要做以下准备:
准备阶段
linux根文件编译
buildroot编译根文件流程:https://www.cnblogs.com/Hlc-/p/17647373.html
u-boot编译
u-boot编译和启动流程:https://www.cnblogs.com/Hlc-/p/17697588.html#5261724
u-boot网络移植流程:https://www.cnblogs.com/Hlc-/p/18192177
u-boot LCD移植流程(这个步骤不是必要的):https://www.cnblogs.com/Hlc-/p/18192242
linux编译构建
linux内核构建流程:https://www.cnblogs.com/Hlc-/p/18192576
nfs文件服务搭建
nfs服务器搭建流程:https://www.cnblogs.com/Hlc-/p/18190402
tftp服务器搭建
tftp服务器构建流程:https://www.cnblogs.com/Hlc-/p/18190380
准备启动菜单
linux的启动就和煮菜一样,上面的准备工作是准备工具,下面我们将准备启动的调料。
复制根文件到上面nfs服务器的目录下面
buildroot编译的根文件系统位于buildroot目录下面的output/images
我的上面的nfs的目录为/home/q123/nfs/rootfs目录(具体看上面的nfs搭建相关的流程)
把root.tar复制到/home/q123/nfs/rootfs目录
cp root.tar /home/q123/nfs/rootfs
#进入/home/q123/nfs/rootfs目录
cd /home/q123/nfs/rootfs
#解压.tar文件
tar -xvf root.tar
复制linux内核和设备树到tftp服务的目录下面
我的TFTP服务的目录位于 /home/q123/tftp (具体看上面的TFTP服务搭建)
在编译的内核arch/arm/boot目录下面有以下文件
zImage:Linux内核文件
dts:这个目录下面有我们需要的设备树文件
arch/arm/boot/dts目录下面有很多设备树文件,.dts后缀结尾的是我们编写的设备树描述代码,.dtb结尾的编译器用.dts编译生成的二进制代码,所以我们需要的是.dtb文件,我们选择选择的是imx6ull-14x14-evk.dtb
把zImage和imx6ull-14x14-evk.dtb文件复制到tftp服务的目录下面
cp arch/arm/boot/zImage /home/q123/tftp/
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/q123/tftp/
开始启动linux
在开始启动Linux之前我已经默认你已经准备好了u-boot,已经做好了u-boot的网络修改,并且已经能在板子上面启动u-boot。
获取服务器IP
虚拟机的ubuntu需要设置网络适配器为桥接模式,使虚拟机与板子能在同一个网段,并且尽量设置自己的IP为静态IP(静态IP设置方法:https://www.cnblogs.com/Hlc-/p/17629806.html);
在自己的ubuntu上面执行以下代码
ifconfig
输出的信息为:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.227 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::250:56ff:fe3f:9efd prefixlen 64 scopeid 0x20<link>
ether 00:50:56:3f:9e:fd txqueuelen 1000 (Ethernet)
RX packets 600427 bytes 255935146 (255.9 MB)
RX errors 34 dropped 21196 overruns 0 frame 0
TX packets 543879 bytes 62517248 (62.5 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 base 0x2000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 19069 bytes 15158348 (15.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19069 bytes 15158348 (15.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
zt6ntmzn2q: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 2800
inet 172.22.183.227 netmask 255.255.0.0 broadcast 172.22.255.255
inet6 fe80::8b8:76ff:fe69:b41f prefixlen 64 scopeid 0x20<link>
ether 0a:b8:76:69:b4:1f txqueuelen 1000 (Ethernet)
RX packets 1408 bytes 152540 (152.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 382 bytes 44839 (44.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我ubuntu服务器的IP为192.168.2.227。
设置u-boot的网络信息
setenv ipaddr 192.168.2.230
setenv ethaddr 00:04:9f:04:d2:35
setenv eth1addr 00:04:9f:04:d2:36
setenv gatewayip 192.168.2.1
setenv netmask 255.255.255.0
setenv serverip 192.168.2.227
saveenv
参数含义:
ipaddr:为板子的IP要保证没有被占用。
ethaddr和eth1addr分别是两个网口的MAC地址。
gatewayip:网关地址
netmask:遮掩码
serverip:服务器IP也就是我们上面获取的ubuntu的IP
执行结果
从TFTP下载内核和根文件
tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
执行结果
设置启动参数并且启动内核
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.2.227:/home/q123/nfs/rootfs,nfsvers=3,proto=tcp rw ip=192.168.2.230:192.168.2.227:192.168.2.1:255.255.255.0::eth1:off'
saveenv
参数含义:
console=ttymxc0,115200:使用ttymxc0串口设备输出信息,波特率为115200
root=/dev/nfs:根文件挂载nfs文件
nfsroot=192.168.2.227:/home/q123/nfs/rootfs,nfsvers=3,proto=tcp:这个是nfs文件的相关信息。
- 192.168.2.227:/home/q123/nfs/rootfs是根文件的服务器地址和目录
- nfsvers=3表示使用的NFS版本为V3
- proto=tcp表示接口使用TCP。
rw:表示根文件可读可写
ip=192.168.2.230:192.168.2.227:192.168.2.1:255.255.255.0::eth0:off为启动IP设置。
ip=<板子IP>:<服务器IP>:<网关地址>:<遮掩码>::<使用的网口设备(eth0是网口2)>:off
启动设备
bootz 80800000 - 83000000
80800000是上面使用tftp下载内核到的内存地址
83000000是上面使用tftp下载设备树到内存的地址