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源码下载

#环境下载
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. 创建编译内核脚本
touch build_uboot.sh
chmod 0777 build_uboot.sh
  1. 向文件中写入如下内容
make distclean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig
  1. 查看生成的固件
ls u-boot-dtb.imx

3.3烧录uboot

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

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

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

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

  1. 进入uboot源码目录,执行如下命令
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,输入如下命令

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,保存环境变量

验证能与虚拟机跑通

ping 192.168.100.30

显示如下即可

5.kernel编译

5.1源码下载

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

6.tftp加载内核和设备树

  1. 安装环境
sudo apt-get install tftp-hpa tftpd-hpa
sudo apt-get install xinetd
  1. 创建目录
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
}
  1. 重启TFTP服务
sudo service tftpd-hpa start
  1. 重置服务器
sudo vim /etc/default/tftpd-hpa

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

重启后会看到如下

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

7.根文件系统编译

  1. 下载源码安装环境

    源码可以去官网下载即可busybox官网,根文件系统不向内核和uboot有很多板级配置需要向供应商所要指定版本

    安装环境
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. 配置根文件系统
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. 编译
make  ARCH=arm  CROSS_COMPILE=arm-linux-gnueabihf-
#指定安装路径为家目录下rootfs
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=/home/wanderpurr/rootfs install
  1. 补全缺失文件
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. 安装环境
sudo apt-get install nfs-kernel-server rpcbind
  1. 添加根文件系统
sudo echo "/home/wanderpurr/rootfs *(rw,sync,no_root_squash,no_subtree_check)"  >> /etc/exports
  1. 重启nfs
sudo /etc/init.d/nfs-kernel-server restart
  1. 修改uboot参数
#板子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开发板 文档

有问题欢迎留言

搭建imx6ull环境--tftp加载镜像,nfs挂载根文件系统的更多相关文章

  1. 嵌入式linux加载引导内核和根文件系统的方法

    总体来说,嵌入式Linux内核和根文件的引导与PC机差不多.嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NAN ...

  2. 用Qemu模拟vexpress-a9 (四) --- u-boot引导kernel,用nfs挂载根文件系统

    环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 32 u-boot 版本:u-boot-2015-04 Linux kernel版本:linux-3.16.y busyb ...

  3. 目标板通过nfs挂载根文件系统

    目标板挂载根文件系统的方法有两种(这里所说的服务端就是ubuntu,Ubuntu已经成功安装了nfs服务,并且保证服务端与目标板ping 通) 第一种:等待开发板启动之后去挂载,此时文件系统从Flas ...

  4. 根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统

    最近打算从头开始制作根文件系统,下面是开发过程. 一.根文件系统的制作 0.FHS(Filesystem Hierarchy Standard)标准介绍 该标准规定了根目录下各个子目录的名称及其存放的 ...

  5. NFS挂载根文件系统

    当NFS跟文件系统挂载不上的时候原因很多,但有一个原因不可忽略,那就是目标板内核支持的NFS版本以及默认版本,我吃过亏,特意做个笔记: setenv bootargs console=ttySAC0  ...

  6. ARM9通过NFS挂载根文件系统

    当开发板启动以后可以通过在超级终端发送命令来配置NFS. 首先得给开发板一个IP地址,用下面的命令配置即可: #ifconfig 192.168.0.10 经过上面的配置以后在各自的终端中应该都能PI ...

  7. 配置uboot指定nfs挂载根文件系统

    背景: 文件系统的调试也建议在 网络中进行. 概念: NFS是Network File System的缩写及网络文件系统. 要功能是通过局域网络让不同的主机系统之间可以共享文件或目录. NFS系统和W ...

  8. 无网络环境下使用docker加载镜像

    无网络环境下使用docker加载镜像 你需要做的主要有3步骤:   先从一个有网络的电脑下载docker镜像 [root@localhost ~]# docker pull hub.c.163.com ...

  9. Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

    Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...

  10. maven在windows环境下加载settings.xml文件

    今天发现maven在windows环境下加载的settings.xml文件是c:下的,就算修改conf下的settings.xml里的<localRepository>给他明确指向也没用.

随机推荐

  1. SQL 月同环比 日期 T+1 自动计算

    对于离线数据的分析, 数据通常是 T+1 的, 即所有数据更新都是到 "昨天". 对于这样的同环比能自动计算是很需要的. -- 以Mysql为例: -- 今天: 2022/3/1 ...

  2. 京东首页html+css1.0

    小菜鸟的学习记录,还望各位猿兄不吝赐教 文章目录 效果图 源码 HTML文件 css文件 效果图 源码 HTML文件 <!DOCTYPE html> <html> <he ...

  3. WindowsPE文件格式入门06.手写最小PE

    https://bpsend.net/thread-346-1-1.html 实现目标 实现目标:手写实现不大于 200 Byte大小的PE文件(又名:畸形PE/变形PE),要求MessageBox弹 ...

  4. 我的Vue之旅(4)

    2020-10-26 使用v-bind来绑定class属性主要是分成了两类,即对象语法与数组语法,其实在数组中也是可以混用对象语法的,但在Demo3中我没有 写出来,有兴趣的话可以自己试试.在HTML ...

  5. 乌班图源码编译安装nginx

    第一步:下载 wget http://nginx.org/download/nginx-1.16.0.tar.gz 第二步:解压 tar -xzf Nginx-1.16.0.tar.gz 第三步:编译 ...

  6. 最炫酷的企业 AI 助手来啦(含前端源码)!

    最近越来越多的企业开始将 MaxKB 在他们企业当中的应用场景官宣了.有时候我们会疑问,这真的是 MaxKB 做的吗? MaxKB 你怎么还能动的? 案例一:医疗资源小助手开场白 效果展示: 源码: ...

  7. 面试题-Thread.sleep(0)的作用是什么

      就是线程等待的意思.由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep( ...

  8. 如何给Git设置ssh代理

    由于不可描述的原因,在某些情况下Github不可用(git push和git pull都显示远程服务器不可用或无权限),于是就想到上代理. 首先网上搜索一通,发现如下方法: git config -- ...

  9. ImportError: lxml.html.clean module is now a separate project lxml_html_clean

    导包报错 from lxml_html_clean import Cleaner 解决报错:"ImportError: lxml.html.clean module is now a sep ...

  10. 电脑上多个git账户并且为不同仓库设置不同的用户名

    说明 生成多个公钥命令 我这里以Gitee和我公司内网Gitlab举例,打开git bash (右键,Git Bash Here) 首先生成Gitee的 依次执行以下命令 git config --g ...