ubuntu 20.04 linux6.3.8 qemu arm64 平台 制作ext4根文件系统

news2024/11/18 10:42:39

前言

  • 可以参考 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统

  • 因为需要验证 aarch64 平台下的 glib 库,所以重新搭建了 Linux qemu arm64 的 测试环境

  • 这一篇,开始制作 rootfs 根文件系统,让qemu arm64 平台上的 Linux 系统跑起来

开发环境

  • win10 64位 VMware Workstation Pro 16

  • ubuntu 20.04

  • qemu (虚拟ARM开发板),virt arm64 平台

  • Linux 6.3.8

下载并解压busybox

  • 当前使用 busybox,可以快速制作Linux 根文件系统需要的常用命令,所以这里使用当前最新版本的busybox:busybox-1.36.1.tar.bz2

  • busybox 官方下载地址:https://busybox.net/downloads/busybox-1.36.1.tar.bz2,当前可以直接到官方 https://busybox.net/downloads/ 下载最新的版本

  • 把下载好的 busybox 放在 ubuntu 中,解压缩

$ ls
busybox-1.36.1.tar.bz2

$ tar xjvf busybox-1.36.1.tar.bz2

编译busybox

  • 这里强调一点,如果需要一次性编译通过,需要使用 linux gcc 交叉编译工具链,如:aarch64-linux-gnu-xxx 这样的工具链中,集成了依赖Linux 相关的头文件

  • 编译 busybox-1.36.1,推荐的linux gcc 为: gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu.tar.xz

  • 这里是qemu 的模拟器,直接编译即可,暂时不需要 menuconfig 手动修改配置

  • 编译命令如下:

/* menuconfig 配置,直接保存即可 */
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

/* 创建 busybox 输出的路径 */
$ mkdir /home/zhangsz/linux/rootfs/1016

/* 编译, install,这样就可以把 busybox 的编译产物放在CONFIG_PREFIX的路径下  */
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CONFIG_PREFIX=/home/zhangsz/linux/rootfs/1016/ install

busybox 编译的产物:

$ cd /home/zhangsz/linux/rootfs/1016/

$ ls
bin  linuxrc  sbin  usr
  • 注意 busybox 直接编译的产物,还是缺少很多lib库与命令,需要不断的丰富,Linux 内核启动控制台相关的一些东西,需要再补充

完善 rootfs

  • 首先创建 rootfs 目录,然后把 busybox 的产物,全部复制到 rootfs 下

  • 首先在 rootfs 下新创建一个 lib 目,复制 gcc 交叉编译工具链 libc/lib/ 下的库文件到 rootfs/lib 目录

  • sudo cp -rf ../../tools/gcc-linaro-12.2.1-2023.04-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/* rootfs/lib

  • 在Linux 内核目录执行生成 modules_install 的命令:

  • make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../_install modules_install

  • 然后 把 Linux 的 模块目录 lib 下的所有文件 复制到 rootfs/lib

制作根文件系统

  • 制作Linux 根文件系统目录的过程,各个平台其实都是大同小异的,不同的平台,选择相应的编译器。

  • 这里使用脚本,快速的制作一个根文件系统目录模板,然后再把 busybox 的编译产物、gcc 交叉编译环境下的 lib 拷贝过来,就可以打包成制定的文件系统镜像了

  • create_rootfs.sh 生成 rootfs 的各个目录结构

#!/bin/bash
echo "------Create rootfs start...--------"

rootfs=$1
sudo rm -rfv $rootfs
sudo mkdir -v $rootfs
cd $rootfs

echo "--------Create root,dev....----------"
sudo mkdir root dev etc boot tmp var sys proc lib mnt home usr
sudo mkdir etc/init.d etc/rc.d

echo "make node in dev/console dev/null"
sudo mknod -m 600 dev/console c 5 1
sudo mknod -m 600 dev/null  c 1 3

# create etc config /etc/inittab
echo -e "::sysinit:/etc/init.d/rcS " >etc/inittab
echo -e "::askfirst:-/bin/sh " >>etc/inittab
echo -e "::ctrlaltdel:/sbin/reboot " >>etc/inittab
echo -e "::shutdown:/bin/umount -a -r " >>etc/inittab

# create etc config /etc/init.d/rcs
echo -e "#! /bin/sh " >etc/init.d/rcS
echo -e "mount -t sysfs none /sys " >>etc/init.d/rcS
echo -e "mount -t proc none /proc " >>etc/init.d/rcS
echo -e "mount -t tmpfs tmpfs /tmp" >>etc/init.d/rcS
echo -e "mdev -s " >>etc/init.d/rcS
chmod +x etc/init.d/rcS

# create etc config /etc/fstab
echo -e "proc       /proc       proc        defaults 0 0 " >etc/fstab
echo -e "sysfs      /sys        sysfs       defaults 0 0 " >>etc/fstab
echo -e "devtmpfs   /dev        devtmpfs    defaults 0 0 " >>etc/fstab
echo -e "tmpfs      /tmp        tmpfs       defaults 0 0 " >>etc/fstab
echo -e "tmpfs      /var        tmpfs       defaults 0 0 " >>etc/fstab

cd ..
echo "-------make rootfs done---------"
  • make_boot.sh 脚本:制作 rootfs ext4 镜像
#!/bin/bash

echo "---------- make boot.img ------------"

img_ext=".img"
img_mnt="_mnt"

boot_img=$1${img_ext}
boot_img_mnt=$1${img_mnt}

echo ${boot_img}
echo ${boot_img_mnt}

sudo rm -rf ${boot_img}
sudo rm -rf ${boot_img_mnt}


dd if=/dev/zero of=${boot_img} bs=1M count=1024
mkfs.ext4 ${boot_img}
sudo mkdir ${boot_img_mnt}

sudo mount ${boot_img} ${boot_img_mnt}
sudo cp -rv $1/* ${boot_img_mnt}
sudo cp -rv rootfs/* ${boot_img_mnt}
sudo umount ${boot_img_mnt}

echo "------------ make boot.img end ---------"
  • boot_qemu.sh :通过 qemu-system-aarch64 启动 qemu
#!/bin/bash
echo "---------- boot qemu ----------"
echo $1

sudo qemu-system-aarch64 \
        -M virt \
        -cpu cortex-a57 \
        -smp 4 \
        -m 4G \
        -kernel Image.gz \
        -drive format=raw,file=$1 \
        -nographic \
        -append "noinitrd root=/dev/vda rw console=ttyAMA0 init=/linuxrc ignore_loglevel" \
  • run.sh : 运行 qemu,第一次运行 sudo ./run.sh 即可,后面可以通过 sudo ./boot_qemu.sh rootfs_qemu.img 启动
#!/bin/bash

source create_rootfs.sh rootfs_qemu
source make_boot.sh rootfs_qemu
source boot_qemu.sh rootfs_qemu.img

启动 qemu

  • 把 Linux 内核,当前是 linux-6.3.8 的内核镜像文件: linux-6.3.8/arch/arm64/boot/Image.gz 复制到 qemu 的启动目录下

  • qemu 启动的目录如下:

在这里插入图片描述

  • 上面的制作rootfs 与启动 qemu 的脚本, Linux 内核镜像 Image.gz,以及上面创建的 rootfs,基于这个 rootfs 去生成 qemu 需要的 ext4 镜像
-rwxr-xr-x  1 zhangsz zhangsz        292 618 17:22 boot_qemu.sh
-rwxr-xr-x  1 zhangsz zhangsz       1335 618 12:39 create_rootfs.sh

-rw-r--r--  1 zhangsz zhangsz   13141574 618 12:37 Image.gz
-rwxr-xr-x  1 zhangsz zhangsz        517 618 12:39 make_boot.sh
-rw-r--r--  1 zhangsz zhangsz        463 618 18:05 readme.md
drwxr-xr-x  7 zhangsz zhangsz       4096 618 18:00 rootfs

-rwxr-xr-x  1 zhangsz zhangsz        118 618 12:39 run.sh
  • 第一次运行:会根据 rootfs 制作镜像 rootfs_qemu.img,并调用 qemu 启动脚本 boot_qemu.sh 启动,执行命令为: sudo ./run.sh

  • 启动信息如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 进程 Linux shell 命令行, 基于 qemu arm64 平台的 Linux ext4 根文件系统, 正确运行起来了

小结

  • 以上是 基于 linux6.3.8 qemu arm64 平台 制作ext4根文件系统,Linux 内核的编译,参考 ubuntu 20.04 qemu arm64 linux6.3.8 开发环境搭建

  • qemu 可以用于嵌入式Linux 系统的开发前期的一些技术评估、功能验证,尤其是一些硬件平台无关的软件的功能开发验证,使用 qemu 模拟运行,会大大提高开发的效率

  • 当前 qemu 不仅可以运行 Linux,还可以运行在 rt-smart 等系统上

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

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

相关文章

一个springboot项目的jenkins持续集成配置

目录 1.项目基本情况 2.jenkins的下载 1) 安装jdk 2)下载、启动和配置jenkins 3. 启动Jenkins 4. 安装Jenkins插件 5. 重启jenkins 6.jenkins工具的配置 1) jdk的路径配置 7.创建springboot项目的持续集成任务 1) 新建项目 2)代…

倒闭了

前两天在群里听到有人发消息,说是「有陪」倒闭了,然后我去看了相应的消息,看到了下面的图。 一些老的读者可能知道我之前有一段创业经历,这段创业经历就是有陪,我从恒大的时候就开始给有陪做事,那时候我一个…

stm32 滑膜观测器+PLL 锁相环 FOC 无感无刷电机控制

上一期为大家介绍了滑膜观测器正反切的应用案例,收到不少小伙伴的反馈是否有PLL的案例,大概看了一下网上的资料,讲理论的很多,能转化成源码的几乎没有。前半年工作和家里的事情都比较多,一拖再拖,终于在6月…

Attention U-Net:Learning Where to Look for the Pancreas论文总结和代码实现

论文: https://arxiv.org/abs/1804.03999 中文版:https://blog.csdn.net/hhw999/article/details/110134398 源码: https://github.com/ozan-oktay/Attention-Gated-Networks 目录 一、论文背景和出发点 二、创新点 三、Attention U-Net的…

【5G MAC】5G中传输块(TBS)大小的计算方式

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

【学习日记2023.6.18】之 分布式缓存redis持久化_redis主从_reids哨兵_redis分片集群

文章目录 分布式缓存1. Redis持久化1.1 RDB持久化1.1.1 执行时机1.1.2 RDB原理1.1.3 小结 1.2 AOF持久化1.2.1 AOF原理1.2.2 AOF配置1.2.3 AOF文件重写 1.3 RDB与AOF对比 2 Redis主从2.1 搭建主从架构2.1.1 准备实例和配置2.1.2 启动2.1.3 开启主从关系2.1.4 测试 2.2 主从数据…

计算服务资源调度管理

文章目录 前言总体架构“ULT”和“KLT”抽象“内核”“容器”“虚容器” 内存抽象虚拟存储(容器调用) 多机器调度 前言 今天复习了一下操作系统,系统过了一下,感觉还有点时间,那么顺便来讨论一下,关于我的…

.maloxx勒索病毒数据怎么处理|数据解密恢复,malox/mallox

导语: 随着科技的快速发展,数据成为了企业和个人不可或缺的财富。然而,网络安全威胁也日益增多,其中Mallox勒索病毒家族的最新变种.maloxx勒索病毒的出现给我们带来了巨大的困扰。但不要担心!91数据恢复研究院将为您揭…

一、Docker介绍

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker是什么?二、Docker能干撒?三、容器虚拟化技术 和 虚拟机有啥区别?1.虚拟机2.容器虚拟化技术3.对比 四、Docker组成4.1 镜像…

python自动化办公——定制化将电子签名批量签写到PDF文件

python自动化办公——定制化将电子签名批量签写到PDF文件 文章目录 python自动化办公——定制化将电子签名批量签写到PDF文件1、安装依赖2、需求分析3、代码 1、安装依赖 首先需要下载所需要的库 pip install pdf2image pip install img2pdf pip install opencv-python此外还…

【工作记录】基于可视化爬虫spiderflow实战天气数据爬取@20230618

前言 之前写过一篇关于可视化爬虫spiderflow的文章,介绍了基本语法并实战了某校园新闻数据的爬取。 还有一篇文章介绍了基于docker-compose快速部署spiderflow的过程,需要部署的话可参考该文章。 文章链接如下: 可视化爬虫框架spiderflow入门及实战【…

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 研究背景:…

【通过Data Studio连接openGauss---快速入门】

【通过Data Studio连接openGauss---快速入门】 🔻 一、访问openGauss🔰 1.1 确认连接信息(单节点)🔰 1.2 使用gsql访问openGauss(本地连接数据库)🔰 1.3 使用gsql访问openGauss&…

多道程序设计(操作系统)

目录 1 单道程序设计的缺点 2 多道程序设计的提出 3 多道程序设计的问题 多道程序设计目标: 多道程序设计是操作系统所采用最基本、最重要的技术,其根本目标是提高整个计算机系统的效率。衡量系统效率有一个尺度,那就是吞吐量。 提高系统…

clDice-一种新的分割标准-能够促进管状结构分割的连接性

clDice-a Novel Topology-Preserving Loss Function for Tubular StructureSegmentation论文总结 论文:clDice-A Novel Topology-Preserving Loss Function for Tubular Structure 源码:GitHub - jocpae/clDice 目录 一、论文背景和出发点 二、创新点 …

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

Advanced-C.04.函数

函数 函数的定义 包括两个部分,“函数头"和"函数体” 返回值类型 函数名(形参1,形参2,...)//函数头{}//函数体 函数类型决定返回值类型,执行函数需要调用 函数的返回值和参数可以是任何类型,包括空类型!!函…

Android adb shell命令捕获systemtrace

Android adb shell命令捕获systemtrace (1)抓取trace文件: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory -t 时长,20s&a…

Java学习笔记23——集合进阶

集合进阶 集合进阶CollectionCollection集合常用方法Collection集合的遍历Iterator中的常用方法集合的使用步骤 List集合概述和特点List集合的特点List集合的特有方法并发修改异常ListIterator 列表迭代器常用方法增强for循环 数据结构栈队列数组链表 Set集合Set特点实现类Hash…

Presto(Trino)的逻辑执行计划和Fragment生成过程

文章目录 1. 前言2. 从SQL提交到Fragment计划生成全过程2.1 Statement生成2.2 对结构化的Statement进行分析2.3 生成未优化的逻辑执行计划2.4 基于Visitor模型对逻辑执行计划进行优化2.4.1 Visitor模型介绍2.4.2 Presto中常见的逻辑执行计划优化器常规OptimizerIterativeOptimi…