搭建imx6ull环境--tftp加载镜像,nfs挂载根文件系统

1.环境介绍

开发板:野火imx6ullPro邮票孔EMMC

主机:Win11

虚拟机:virtualbox

虚拟机版本:Ubuntu20.04

Windows远程连接虚拟机

由于这个板子比较老,野火提供的虚拟机是基于18.04的这个版本不再支持vscode环境,于是就想着开始学习驱动从头到尾先搭建一下环境,中间也是折腾了很久,所以都记录一下

环境:

准备从SD卡加载uboot,通过tftp从Ubuntu中加载内核镜像,设备树,并通过nfs将根文件系统挂载到Ubuntu上

开发板直连电脑,虚拟机通过NAT连接无线网卡,保证虚拟机可以连接外网,桥接有线网卡,让有线网卡、Windows、开发板在同一局域网内

vscode通过SSH远程连接虚拟机,在Windows环境下开发比较舒服

2.虚拟机环境搭建,并配置SSH连接

可以看我这篇博客
创建虚拟机并配置远程环境

3.uboot编译

3.1源码下载

bash 复制代码
#环境下载
sudo apt install make git gcc-arm-none-eabi gcc bison flex libssl-dev dpkg-dev lzop libncurses5-dev
#直接克隆野火提供的仓库
git clone -b ebf_v2020_10_imx https://gitee.com/Embedfire/ebf_linux_uboot --depth 1

3.2编译uboot

  1. 创建编译内核脚本
bash 复制代码
touch build_uboot.sh
chmod 0777 build_uboot.sh
  1. 向文件中写入如下内容
bash 复制代码
make distclean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig
  1. 查看生成的固件
bash 复制代码
ls u-boot-dtb.imx

3.3烧录uboot

  1. sd卡插到读卡器上,挂载到Ubuntu上

设备名称可能不一样,可以插拔读卡器看一下变化的是哪个,哪个就是我们的读卡器

  1. 查看Ubuntu上挂载的分区,输入lsblk

一般不会是sda,根据自己情况确定

  1. 进入uboot源码目录,执行如下命令
bash 复制代码
sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2
  1. 取下设备将SD卡插入开发板就能看到uboot启动了

4.网络环境搭建

开发板,主机和虚拟机可以通过网线通信,需要设置三者有共同的网关和掩码,三者在同一网段的不同ip

操作之前关闭电脑所有电脑管家以及防火墙

4.1Windows网络配置

  1. 打开控制面板->网络和Internet->网络和共享中心->更改适配器设置,找到我们的有线网卡

  2. 右键属性->Internet协议版本4(TCP/IPV4)

可随意配置网段,只要保证三者在同一网段即可,不懂得可以按照我的配置

4.2Ubuntu网络配置

  1. Ubuntu关机,添加网卡选择桥接模式,桥接的网卡一定是上边配置的有线网卡名字

  2. 进入虚拟机网络配置

  3. 配置网络

  4. 验证网络

    虚拟机终端输入ifconfig,查看是否有我们配置的网络

4.3开发板网络配置

开发板进入uboot,输入如下命令

bash 复制代码
setenv ipaddr 192.168.100.30 
setenv ethaddr 00:04:9f:04:d2:35 
setenv gatewayip 192.168.100.1 
setenv netmask 255.255.255.0 
setenv serverip 192.168.100.30  
saveenv 

分别是ip地址,mac地址,网关,掩码,虚拟机ip,保存环境变量

验证能与虚拟机跑通

bash 复制代码
ping 192.168.100.30

显示如下即可

5.kernel编译

5.1源码下载

bash 复制代码
#环境下载
sudo apt install  gcc-arm-linux-gnueabihf
#直接克隆野火提供的内核仓库
git clone -b ebf_4.19.35_imx6ul https://github.com/Embedfire/ebf_linux_kernel.git --depth 1

5.2编译内核

  1. 编译脚本
bash 复制代码
#进入内核后执行
touch build_kernel.sh
chmod 0777 build_kernel.sh
  1. 向build_kernel.sh中写入
bash 复制代码
#清除编译
make mrproper
# 编译内核
make ARCH=arm npi_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j3
  1. 查看内核和设备树
bash 复制代码
#应该会出现这两个文件,记住这两个文件位置
ls arch/arm/boot/zImage
ls arch/arm/boot/dts/imx6ull-mmc-npi.dtb

6.tftp加载内核和设备树

  1. 安装环境
bash 复制代码
sudo apt-get install tftp-hpa tftpd-hpa  
sudo apt-get install xinetd
  1. 创建目录
bash 复制代码
cd ~
mkdir tftp
chmod 0777 tftp
  1. 配置TFTP

    sudo vim /etc/xinetd.d/tftp

    输入如下内容,路径根据自己的来,要绝对路径

    server tftp
    {
    socket_type = dgram
    protocol = udp
    wait = yes
    user = root
    server = /usr/sbin/in.tftpd
    server_args = -s /home/wanderpurr/tftp/
    disable = no
    per_source = 11
    cps = 100 2
    flags = IPv4
    }

  2. 重启TFTP服务

bash 复制代码
sudo service tftpd-hpa start
  1. 重置服务器
bash 复制代码
sudo vim /etc/default/tftpd-hpa

# 修改成如下内容,路径还是按自己的来
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/wanderpurr/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
  1. 重启TFTP服务
bash 复制代码
sudo service tftpd-hpa restart
  1. 将上边我们编译生成的内核镜像和设备树拷贝到我们的tftp目录
  2. 修改内核和设备树权限为777
  3. 测试加载镜像,在uboot中输入如下内容重启
bash 复制代码
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-mmc-npi.dtb; bootz 80800000 - 83000000'
saveenv

重启后会看到如下

后面会启动内核,但缺少根文件系统会启动失败

7.根文件系统编译

  1. 下载源码安装环境
    源码可以去官网下载即可busybox官网,根文件系统不向内核和uboot有很多板级配置需要向供应商所要指定版本
    安装环境
bash 复制代码
sudo apt-get install zlib1g-dev unzip gcc g++ aptitude lib32stdc++6-4.8-dbg build-essential libncurses5 libncurses5-dev u-boot-tools traceroute  gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y
  1. 配置根文件系统
bash 复制代码
make  ARCH=arm  CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

配置如下操作

  1. Settings -> Build static binary (no shared libs) 勾选上
  2. Linux System Utilities->mdev 勾选上
  3. Settings -> vi-style line editing commands 勾选上
  4. Linux Module Utilities -> Simplified modutils 取消勾选
  1. 编译
bash 复制代码
make  ARCH=arm  CROSS_COMPILE=arm-linux-gnueabihf-
#指定安装路径为家目录下rootfs
make  ARCH=arm  CROSS_COMPILE=arm-linux-gnueabihf-  CONFIG_PREFIX=/home/wanderpurr/rootfs  install 
  1. 补全缺失文件
bash 复制代码
cd ~/rootfs
mkdir dev etc lib var proc tmp home root mnt sys
cd ./dev
sudo mknod console c 5 1
sudo mknod null c 1 3
cd ../etc
echo console::askfirst:-/bin/sh > inittab

8.nfs挂载根文件系统

上边已经将根文件系统制作好了,下面来通过网线挂载起来

  1. 安装环境
bash 复制代码
sudo apt-get install nfs-kernel-server rpcbind
  1. 添加根文件系统
bash 复制代码
sudo echo "/home/wanderpurr/rootfs *(rw,sync,no_root_squash,no_subtree_check)"  >> /etc/exports
  1. 重启nfs
bash 复制代码
sudo /etc/init.d/nfs-kernel-server restart
  1. 修改uboot参数
bash 复制代码
#板子IP,虚拟机IP以及根文件系统路径根据自己的配置好
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.100.30:/home/wanderpurr/rootfs,proto=tcp,nfsvers=4 rw ip=192.168.100.50:192.168.100.30:192.168.100.1:255.255.255.0::eth0:off'
saveenv
  1. 重启开发板

这里就配置结束了,我们开发板的根目录就是虚拟机的rootfs目录,这样传输文件就非常方便了

结语

配置过程中可能出现很多问题,我断断续续搞了一周,但每填一个坑都是对自己的一种成长

参考:

这个写的非常全,有需要从头自己配置的可以参考一下这个,但注意他bootargs最后网口挖了坑,让我找了好几天
i.MX6ULL开发板uboot/kernel/rootfs移植傻瓜教程【建议收藏】-电子工程专辑

以及野火官方文档
[野火]嵌入式Linux镜像构建与部署------基于LubanCat-IMX8MMini开发板 --- [野火]嵌入式Linux镜像构建与部署------基于LubanCat-i.MX8MMini开发板 文档

有问题欢迎留言

相关推荐
对你无可奈何43 分钟前
关于Ubuntu的 update造成的内核升级
运维·服务器·ubuntu
夜无霄3 小时前
安卓逆向(一)Ubuntu环境配置
linux·运维·爬虫·ubuntu
抠脚学代码14 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
Ribou15 小时前
Ubuntu 24.04.2安装k8s 1.33.4 配置cilium
linux·ubuntu·kubernetes
Mr. Cao code17 小时前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
理智的煎蛋21 小时前
CentOS/Ubuntu安装显卡驱动与GPU压力测试
大数据·人工智能·ubuntu·centos·gpu算力
XingYuyu_Coder1 天前
通过PXE的方式实现Ubuntu 24.04 自动安装
ubuntu·pxe
IOT-Power1 天前
树莓派 Ubuntu 24.04 开机换源总结
linux·数据库·ubuntu
蓝纹绿茶1 天前
Python程序使用了Ffmpeg,结束程序后,文件夹中仍然生成音频、视频文件
python·ubuntu·ffmpeg·音视频
quqi991 天前
Enable FIPS in ubuntu (by quqi99)
linux·运维·ubuntu