ubuntu24.04上使用qemu+buildroot+uboot+linux+tftp+nfs模拟搭建vexpress-ca9嵌入式linux开发环境

1 准备工作

1.1 安装依赖工具

sudo apt-get update && sudo apt-get install build-essential git bc flex libncurses5-dev libssl-dev device-tree-compiler

在这里插入图片描述

1.2 安装arm交叉编译工具链

sudo apt install gcc-arm-linux-gnueabihf

在这里插入图片描述

安装之后,在终端输入arm-linux- gnueabihf- 后按TAB键,出现下列命令,表示安装成功。

在这里插入图片描述

1.3 安装qemu-system-arm

sudo apt install qemu-system-arm

在这里插入图片描述

安装完毕后,在终端输入: qemu- 后按TAB键,弹出下列命令证明安装成功。
在这里插入图片描述

2 u-boot配置编译

2.1 下载u-boot

wget http://ftp.denx.de/pub/u-boot/u-boot-2018.03.tar.bz2

2.2 配置u-boot

解压并进入u-boot。

tar -xvf u-boot-2023.10.tar.bz2 && cd u-boot-2023.10

使用vexpress-ca9x4的默认配置进行配置。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig 

在这里插入图片描述

2.3 修改u-boot

qemu模拟开发板,无法将u-boot环境变量固化到flash,所以每次启动需要重新设置环境变量,为了方便可以将相关环境变量写死在源码里,具体为include/configs/vexpress_common.h中的CFG_EXTRA_ENV_SETTINGS宏。

修改define CFG_EXTRA_ENV_SETTINGS 如下。其中10.211.55.10为QEMU模拟的开发板的IP,10.211.55.100为宿主系统ubuntu24.04的IP,需要根据实际环境IP进行修改。

#define CFG_EXTRA_ENV_SETTINGS \"ipaddr=10.211.55.10\0" \"serverip=10.211.55.100\0" \"bootcmd=tftp 0x60003000 uImage; \tftp 0x61000000 vexpress-v2p-ca9.dtb; \bootm 0x60003000 - 0x61000000\0" \"bootargs=root=/dev/nfs rw \nfsroot=10.211.55.100:/nfs/rootfs,nfsvers=4 init=/linuxrc \ip=10.211.55.10 console=ttyAMA0\0"

2.4 编译u-boot

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

在这里插入图片描述

编译成功后,会在当前目录生成u-boot。

在这里插入图片描述

3 linux内核配置编译

3.1 下载linux内核

wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.2.tar.xz

3.2 配置linux内核

解压并进入linux内核主目录。

tar -xvf linux-6.14.2.tar.xz && cd linux-6.14.2

3.2.1 使用vexpress-ca9开发板默认配置。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig

在这里插入图片描述

3.2.2 关键自定义配置

使用menuconfig进行自定义配置。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  • 启用 VirtIO 网络
Device Drivers  ---> Network device support  ---> Virtio network driver

在这里插入图片描述

  • 启用 NFS 客户端
File systems  ---> Network File Systems  ---> NFS client support

把能选的client版本v2、v3、v4等都选了。

在这里插入图片描述

选中Root file system on NFS

在这里插入图片描述

  • 支持自动挂载devtmpfs到/dev
Device Drivers  ---> Generic Driver Options  ---> Automount devtmpfs at /dev, after the kernel mounted the rootfs

在这里插入图片描述

不选中Automount devtmpfs at /dev, after the kernel mounted the rootfs, 后续buildroot制作的根文件系统无法生成/dev/ttyAMA0节点,导致无法进行系统,报下面的错误。

在这里插入图片描述

3.3 编译linux内核

编译u-boot的内核镜像,需要指定LOADADDR=0x60003000(即uboot通过tftp加载uImage的地址),以及生成的镜像格式为uImage.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x60003000 uImage dtbs -j8

在这里插入图片描述

编译完成后,会在下面路径生成zImage内核镜像和dtb设备树文件。

arch/arm/boot/uImage          # 内核镜像
arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb  # 设备树

在这里插入图片描述

将uImage和vexpress-v2p-ca9.dtb拷贝到tfp服务器工作目录/tftpboot下,tftpboot在地5.2章节进行说明。

在这里插入图片描述

4 配置编译buildroot

4.1 下载buildroot

wget https://buildroot.org/downloads/buildroot-2024.02.tar.gz

4.2 配置buildroot

解压并进入buildroot主目录。

tar -xvf buildroot-2024.02.tar.gz && cd buildroot-2024.02

4.2.1 使用vexpress-ca9默认配置

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- qemu_arm_vexpress_defconfig

在这里插入图片描述

4.2.2 关键自定义配置

使用menuconfig进行自定义配置。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  • 文件系统
Filesystem images  ---> ext2/3/4 root filesystem---> ext2/3/4 variant

在这里插入图片描述

  • mdev支持
System configuration  ---> dev management ---> Dynamic using devtmpfs + mdev

在这里插入图片描述

  • nfs-utils
Target packages  ---> Filesystem and flash utilities  ---> nfs-utils---> NFSv4/NFSv4.1

在这里插入图片描述

4.3 编译根文件系统

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

编译完成后,会生成根文件镜像

output/images/rootfs.ext4  # ext4格式镜像

在这里插入图片描述

5 宿主机上配置tftp服务器

5.1 安装tftp服务器

sudo apt-get install tftpd-hpa

在这里插入图片描述

5.2 设置tftp服务器工作目录

sudo mkdir -p /tftpboot && sudo chmod -R 777 /tftpboot

在这里插入图片描述

5.3 配置tftp服务

sudo vi /etc/default/tftpd-hpa

修改配置如下:

TFTP_DIRECTORY="/tftpboot"
TFTP_OPTIONS="-l -c -s"

在这里插入图片描述

修改保存配置文件后,重启tftp服务使配置生效。

sudo systemctl restart tftpd-hpa

5.4 验证tftp服务

在tftp服务器目录创建一个测试文件,在其他文件夹下通过tftp get这个问题,get成功则说明tftp服务配置成功。

在这里插入图片描述

6 宿主机上配置NFS服务器

6.1 安装nfs服务

sudo apt-get install nfs-kernel-server

在这里插入图片描述

6.2 配置nfs服务

6.2.1 配置nfs根文件系统

  • 创建rootfs文件夹
sudo mkdir -p /nfs/rootfs
  • 拷贝根文件系统到rootfs文件夹

讲buildroot制作的rootfs拷贝到/nfs/rootfs文件夹。

sudo mount -t ext4 /home/cat/work/drv/buildroot-2024.02/output/images/rootfs.ext4 /mnt
sudo cp -rp /mnt/* /nfs/rootfs
sudo umount  /mnt

在这里插入图片描述

6.2.2 修改nfs服务配置文件

sudo vi /etc/exports  # 配置内容:
/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check,insecure)

在这里插入图片描述

注意,一定要加上no_root_squash,否则后面使用nfs加载根文件系统后,重复弹出让输用户名和密码,进不去系统,如下:在这里插入图片描述

修改好exports文件后,执行

source /exports

使配置生效,然后重启nfs服务。

sudo systemctl restart nfs-kernel-server

6.3 验证nfs服务是否生效

使用如下命令将/nfs/rootfs挂载到/mnt,如果挂载成功则表示生效。

sudo mount -t nfs 127.0.0.1:/nfs/rootfs /mnt/

在这里插入图片描述

7 使用qemu模拟vexpress-ca9开发板

7.1 创建网桥

创建网桥用于开发板和ubuntu宿主机通信。

创建 /etc/netplan/01-netcfg.yaml配置文件,内容如下:

network:version: 2renderer: networkdethernets:enp0s5:  #替换为你的物理网卡名(用 `ip a` 查看)dhcp4: nobridges:br0:interfaces: [enp0s5]dhcp4: no# 如果使用静态 IP:addresses: 10.211.55.100/24 #u-boot指定的serverip# gateway4: 192.168.1.1# nameservers:#   addresses: [8.8.8.8, 1.1.1.1]

然后执行下面的命令,执行上面的配置

sudo netplan apply

然后执行

ip addr show br0

确认网桥是否生效。

在这里插入图片描述

7.2 使用qemu启动脚本启动开发板

#!/bin/bash# 随机生成 TAP 接口名(格式:tap-<随机4位16进制>)
TAP_IF="tap-$(openssl rand -hex 2 | cut -c1-4)"
BRIDGE_IF="br0"  # 宿主机桥接接口名
USER=$(whoami)# 创建 TAP 接口并加入桥接
echo "Creating TAP interface: $TAP_IF"
sudo ip tuntap add dev $TAP_IF mode tap user $USER
sudo ip link set $TAP_IF up
sudo ip link set $TAP_IF master $BRIDGE_IF# 启动 QEMU(传递 TAP 接口名给 U-Boot)
echo "Starting QEMU with U-Boot..."
sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot -net nic -net tap,ifname=$TAP_IF,script=no,downscript=no -nographic# QEMU 退出后自动清理 TAP 接口
echo "Cleaning up TAP interface: $TAP_IF"
sudo ip link set $TAP_IF down
sudo ip tuntap del dev $TAP_IF mode tap

保存为qemu.sh脚本,该脚本用于启动模拟开发板,其中u-boot第2节的u-boot镜像。该脚本动态创建TAP设备,可以实现启动多个开发板。

7.3 启动过程

启动过程如下图。

  • 通过tftp下载uImage

在这里插入图片描述

  • 通过tftp下载dtb

在这里插入图片描述

  • 内核启动
    在这里插入图片描述
  • 使用nfs挂载根文件系统
    在这里插入图片描述
  • 成功进入系统
    在这里插入图片描述

到此本文完毕,由于本人水平有限,难免有误,请各位大佬不吝指正,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 22.04 使用ssh-keygen创建ssh互信账户

现有两台ubuntu 22.04服务器&#xff0c;ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码&#xff0c;直接一直回车就行&#xff0c;创建的用户是没法使用用户密码进行登陆的 su - …

【PCIE配置空间】

1 PCIE配置空间 1.1 软件如何知道PCIE设备是Swith&#xff0c;RC还是EP&#xff1f; –软件通过读取寄存器信息。 PCIE配置空间• PCIE寄存器&#xff1b;--PCIE配置协议规定必须实现的空间。--PCIE存在两种配置空间Type0/Type1;--Type0配置空间EP设备必须实现&#xff1b;-…

Android 热点二维码简单示例

Android 热点二维码简单示例 一、前言 Android 原生设置有热点二维码分享功能&#xff0c;有些系统应用也会有这个需求。 下面看看是如何实现的。 本文是一个比较简单的内容。 二、热点二维码生成实现 1、效果 整个应用就一个普通的Activity&#xff0c;显示一个按钮和二维…

uv:重新定义Python开发效率的下一代工具链

在Python生态系统中&#xff0c;包管理和项目工具链的复杂性一直是开发者面临的一大挑战。从依赖管理、虚拟环境创建到多版本Python切换&#xff0c;传统的工具链&#xff08;如pip、virtualenv、poetry等&#xff09;虽然功能强大&#xff0c;但操作繁琐、性能不足的问题长期存…

T101D加固平板电脑:无人机地面站的高效智能控制核心

随着无人机技术在应急救援、农业监测、军事侦察等领域的广泛应用&#xff0c;对地面控制设备的要求也日益提高。鲁成伟业推出的T101D加固平板电脑凭借其高性能、强防护和专业化设计&#xff0c;成为无人机地面站的核心控制终端&#xff0c;为复杂环境下的作业提供了可靠支持。 …

Datawhale AI春训营】AI + 新能源(发电功率预测)Task1

赛题链接 官网 新能源发电功率预测赛题进阶方案 下面是ai给的一些建议 新能源发电功率预测赛题进阶方案 一、时序特性深度挖掘 1. 多尺度周期特征 # 分钟级周期编码 train[15min_index] (train[hour]*4 train[minute]//15)# 周周期特征 train[weekday] pd.to_datetime…

山东科技大学深度学习考试回忆

目录 一、填空&#xff08;五个空&#xff0c;十分&#xff09; 二、选择题(五个&#xff0c;十分&#xff09; 三、判断题&#xff08;五个&#xff0c;五分&#xff09; 四、论述题&#xff08;四个&#xff0c;四十分&#xff09; 五、计算题&#xff08;二个&#xff…

Redis线上操作最佳实践有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【Redis线上操作最佳实践有哪些?】面试题。希望对大家有帮助&#xff1b; Redis线上操作最佳实践有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在使用 Redis 时&#xff0c;尤其是在生产环境中&#xff0c;合理…

mac中的zip文件压缩与压缩文件中指定目录删除

问题 在使用mac的图形界面压缩文件后&#xff0c;往往那个压缩文件中带有__MACOSX文件&#xff0c;但是&#xff0c;这个文件夹又是我们不需要的目录&#xff0c;所有&#xff0c;需要对mac图形化界面压缩后的文件目录进行删除&#xff0c;改如何做&#xff1f; 检查压缩文件…

【记录】服务器用命令开启端口号

这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su &#xff0c;命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…

深度学习-torch,全连接神经网路

3. 数据集加载案例 通过一些数据集的加载案例&#xff0c;真正了解数据类及数据加载器。 3.1 加载csv数据集 代码参考如下 import torch from torch.utils.data import Dataset, DataLoader import pandas as pd ​ ​ class MyCsvDataset(Dataset):def __init__(self, fil…

C++/Python实现RGB和HSI相互转换

1--C版本 #include <opencv2/opencv.hpp> #include <iostream> #include <cmath>// RGB to HSI cv::Vec3f RGBtoHSI(cv::Vec3b rgb) {float B rgb[0] / 255.0f;float G rgb[1] / 255.0f;float R rgb[2] / 255.0f;float num 0.5f * ((R - G) (R - B));f…

【Linux我做主】make和makefile自动化构建

make和makefile自动化构建 make和makefile自动化构建github地址前言背景介绍为什么需要make和makefile&#xff1f; make和makefile解析什么是make和makefile依赖关系和依赖方法核心语法结构简单演示编译清理 多阶段编译示例 make时执行的顺序场景1&#xff1a;clean目标在前(特…

Qt 入门 5 之其他窗口部件

Qt 入门 5 之其他窗口部件 本文介绍的窗口部件直接或间接继承自 QWidget 类详细介绍其他部件的功能与使用方法 1. QFrame 类 QFrame类是带有边框的部件的基类。它的子类包括最常用的标签部件QLabel另外还有 QLCDNumber、QSplitter,QStackedWidget,QToolBox 和 QAbstractScrol…

JAVA学习-多线程

线程 线程(Thread)是一个程序内部的一条执行流程。 程序中如果只有一条执行流程&#xff0c;那这个程序就是单线程的程序。 线程的常用方法及构造器&#xff1a; Thread提供的常用方法public void run() 线程的任务方法public void start() 启动线程public String getName() …

Github 2025-04-19Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2025-04-19统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Rust: 构建可靠高效软件的开源项目 创建周期:5064 天开发语言:Rust协议类型:OtherStar数量:92978 个Fork数量:12000…

OpenLayers:视图变换的方法

一、什么是视图变换&#xff1f; 视图变换就是指视图的 extent&#xff08;范围&#xff09;、center&#xff08;中心点&#xff09;、zoom&#xff08;缩放级别&#xff09;、 resolution&#xff08;分辨率&#xff09;、rotation&#xff08;旋转角&#xff09;等参数发生…

数字孪生火星探测车,星际探索可视化

运用图扑构建数字孪生火星探测车&#xff0c;高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态&#xff0c;助力科研人员远程监测、分析数据&#xff0c;为火星探索任务提供可视化决策支持。

【NLP 66、实践 ⑰ 基于Agent + Prompt Engineering文章阅读】

你用什么擦干我的眼泪 莎士比亚全集 工业纸巾 还是你同样泛红的眼睛 —— 4.19 一、⭐【核心函数】定义大模型调用函数 call_large_model prompt&#xff1a;用户传入的提示词&#xff08;如 “请分析这篇作文的主题”&#xff09;&#xff0c;指导模型执行任务 client&…

黑马Java基础笔记-1

JVM&#xff0c;JDK和JRE JDK是java的开发环境 JVM虚拟机&#xff1a;Java程序运行的地方 核心类库&#xff1a;Java已经写好的东西&#xff0c;我们可以直接用。 System.out.print中的这些方法就是核心库中的所包含的 开发工具: javac&#xff08;编译工具&#xff09;、java&…