ubuntu-base(arm64与riscv64) 根文件系统, 并用qemu启动

ubuntu-base(arm64与riscv64) 根文件系统

有个小需求,是在 arm64riscv64 上都跑起来 speccpu 2017

首先在 Qemu 上跑起来,需要考虑需要的【Linux 内核、根文件系统、Bootloader】,其中 Bootloader 在 Qemu 中可以很简化,对于内核可以使用kernel参数加载,对于根文件系统则要费一些功夫

提前结论:我使用过程中在 qemuapt 从网上下载包是有问题的(上网对目前的我还是有点困难,还得学习,后续学会网络再写一份博客),但是本地挂载文件系统,然后 chrootapt 是可以正常下载的,所以暂时折衷了以下,需要的包通过本地 chroot 来进行安装依赖的包,然后进入 qemu 中使用

以下两篇博客是我记录的在 x86 物理机上执行 speccpu 2017 以及 qemu 运行 (aarch64 & riscv64)Linux 的过程,有兴趣可以参考:

Qemu 启动 Linux(aarch64 与 riscv64):https://blog.csdn.net/jingyu_1/article/details/135746098

SPEC CPU 2017 quick start:https://blog.csdn.net/jingyu_1/article/details/135695701

零、需求分析

不需要很复杂的文件系统,不需要像 Ubuntu 发行版那样包含各种各样的功能,也不需要桌面,只需要精简的文件系统并且支持 apt 等包管理,因为可能需要安装一些

  • ubuntu-server(x 支持 apt,但是有点太大,包含了很多其他的内容)

  • ubuntu-base(y 支持 apt,可以安装 gcc fortran 等)

  • busybox(x )

  • buildroot (x 不支持)

  • yocto(x 配置太复杂)

一、qemu安装、交叉编译工具链、内核编译

这些内容可以参考我的其他博客:

  • Qemu 之安装(源码安装):https://blog.csdn.net/jingyu_1/article/details/135625477?spm=1001.2014.3001.5502

  • 构建 aarch64 以及 riscv64 交叉编译工具链(裸机):https://blog.csdn.net/jingyu_1/article/details/135631512?spm=1001.2014.3001.5502

  • Qemu 启动 Linux(aarch64 与 riscv64):https://blog.csdn.net/jingyu_1/article/details/135746098?spm=1001.2014.3001.5502

其中对于内核的编译,有一点要说明

配置、编译都要指定架构 ARCH 和交叉编译工具链 CROSS_COMPILE,一般情况下选择 defconfig 够用,但是可能有时候要添加一些模块,这时候 menuconfig 可能更方便,例如在我的需求中,需要挂载 speccpu2017.iso,需要添加 iso9600 的模块,但是 linux 内核默认是没有添加这个模块的,对于我的需要要补充,按如下操作:(这一步你不一定需要)

  • menuconfig 界面中,使用箭头键导航到 File systems 部分

  • 进入 CD-ROM/DVD Filesystems 子菜单

  • 找到 ISO 9660 CDROM file system support 选项(通常标记为 CONFIG_ISO9660_FS

  • 使用空格键选择该选项以编译为模块(通常会显示为 M),这个更加常用

  • 如果希望直接编译进内核,而不是作为模块,选择它为内核(通常显示为 *

模块大多数情况下表示为驱动,并且大多数情况下不会直接编入内核,而是配置为模块,在后续过程中启用模块

二、构建根文件系统

主要参考:https://www.cnblogs.com/phoebus-ma/p/17436089.html,并根据需求作了一定修改

Ubuntu-base 镜像: https://cdimage.ubuntu.com/ubuntu-base/releases/jammy/release/,你也可以选择你需要的版本进行安装

(包含了 arm64 以及 riscv 的版本,这点还是很友好的)

1、安装依赖:
sudo apt install binfmt-support qemu-user-static 
# 如果没安装 qemu 以及交叉编译工具链,也可以使用 apt 安装 qemu-system-aarch64 gcc-aarch64-linux-gnu

我使用的是 ubuntu-base 22.04.3(arm64):ubuntu-base-22.04.3-base-arm64.tar.gz

关于 riscv 的版本可以从上面的官方 ubuntu-base 镜像中下载

2、编译内核:

如果未编译内核,则参考上面文档中的方式,执行

# 对于 arm64
make defconfig ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-
# make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-
make -j8 ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-# 对于 riscv
make defconfig ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-
# make menuconfig ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-
make -j8 ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu-

当需要调整时,使用 menuconfig 配置,比如遇到我上面所说的情况,或者后续内核缺少某个模块的时候再来修改配置,重新编译,(以及后续提到的安装内核模块)

3、创建空磁盘:

我们这里依赖的是 ubuntu-base 的根文件系统,所以只需要创建一个空的虚拟磁盘镜像即可

一种是使用 qemu-img 命令

另一种是使用 dd 命令

下面举例创建名为 arm64.imageext4 格式的虚拟磁盘

也可以是其他名字,我这里只是为了区分 arm 和 riscv 使用的磁盘,它们的文件系统不能共享

这里推荐 qemu-img 更加便捷(比如扩容十分方便)

# 使用 qemu-img 创建20G的虚拟磁盘
qemu-img create -f raw arm64.image 20G
# 将虚拟磁盘格式化成 ext4 格式
sudo mkfs.ext4 arm64.image

使用 dd 也可以

# arm64.ext4 为 1G 大小, 下面的内容根据需要进行配置
dd if=/dev/zero of=arm64.ext4 bs=1M count=1024
# 将其格式化成为 ext4 格式
mkfs.ext4 arm64.ext4
4、构建文件系统
# 将其挂载在本地的 /mnt 目录, (这里不一定必须 /mnt 目录)
sudo mount -t ext4 arm64.ext4 /mnt/
# 将 ubuntu-base 解压到 文件系统中
sudo tar -xf ubuntu-base-22.04.3-base-arm64.tar.gz -C /mnt/
# sudo tar -xf ubuntu-base-22.04.3-base-riscv64.tar.gz -C /mnt/# apt 下载安装 qemu-user-static, 包含了 qemu-aarch64-static
sudo cp /usr/bin/qemu-aarch64-static /mnt/usr/bin/
# sudo cp /usr/bin/qemu-riscv64-static /mnt/usr/bin/
# 拷贝主机中的网络信息到镜像中,方便后续用 apt 安装软件(参考的博客里说的,暂未进一步验证)
sudo cp /etc/resolv.conf /mnt/etc/# 安装内核模块
# 进入 linux 的配置编译路径
# INSTALL_MOD_PATH 指定内核模块安装的目标路径
# 模块将被安装到挂载点 `/mnt` 下, 这通常用于当您正在为一个不同于当前运行的系统(如嵌入式系统或不同的根文件系统)构建模块
cd ~/linux-6.7
sudo make modules_install ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- INSTALL_MOD_PATH=/mnt
# sudo make modules_install ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- INSTALL_MOD_PATH=/mnt

注意:qemu-user-static 建议使用 apt 安装的

当我使用从 github 上下载的 qemu-aarch64-static,会存在问题,当时用 sudo apt install qemu-user-static 下载的 qemu-aarch64-static 就没有问题(暂时不清楚原因)

5、chroot

chroot(change root)命令在 Unix 和类 Unix 系统中用于改变当前运行进程及其子进程的根目录。

为了使 chroot 环境正常工作,您可能需要复制或挂载一些必要的文件和目录(如 /dev, /proc, /sys 等)到新的根目录下。

如果您的主系统和 chroot 环境的架构不同(例如,主系统是 x86_64,而 chroot 环境是针对 ARM 构建的),则会出现执行格式错误。二进制文件需要与宿主系统的处理器架构相匹配。

上面的 qemu-aarch64-static 就是为了在 x86 上模拟 arm,如果不添加这个执行文件,chroot 则会失败

# 执行 chroot 需要挂载一些必要的目录(也是参考的博客里说明的)
# 其中 proc、sys 可以让 lscpu 命令查看到当前 cpu 的信息
sudo mount -t proc /proc /mnt/proc
sudo mount -t sysfs /sys /mnt/sys
sudo mount -o bind /dev /mnt/dev
sudo mount -o bind /dev/pts /mnt/dev/pts# 执行 chroot, 进入 ubuntu-base(arm64) 的根文件系统
sudo chroot /mnt

这里进入的终端,可以使用你使用的物理机的网络,使用 apt 安装一些包

apt update
# 可能碰到证书等问题, 这就需要:
apt install ca-certificates
apt install systemd vim
# 根据需要安装一些包
# apt install gcc g++ gfortran flex bison

由于我的需求不需要设置用户密码这些,所以并未配置

需要的话 -> 可以参考我前面提到的文档

除此之外,参考文档中的 serial-getty\@.service 不存在,怀疑是本地 ubuntu 系统里的那一个文件

我并未配置,不影响使用

# 当要退出时, 回到原本的终端中, 执行 exit
exit
# 然后卸载磁盘
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt/dev/pts
sudo umount /mnt/dev
sudo umount /mnt
5、Qemu 运行 Ubuntu base

执行时注意路径即可(aarch64)

sudo qemu-system-aarch64 \-M virt \-cpu cortex-a72 \-nographic \-smp 8 \-m 16G \-kernel ../linux-6.7/arch/arm64/boot/Image \-append "root=/dev/vda rw console=ttyAMA0" \-netdev tap,id=eth0 \-device virtio-net-device,netdev=eth0 \-drive file=arm64.image,if=none,format=raw,id=hd0 \-device virtio-blk-device,drive=hd0# 切换到 bash 使用体验更好
bash
# 挂载这两个文件系统, 可以让 ubuntu 探测到处理器的信息, lscpu 可以查到相关信息
mount -t proc proc /proc
mount -t sysfs sysfs /sys# 下面是我的需求, 在前面添加了 iso 的模块之后, 可以挂载, 并且安装
mount -t iso9660 -o ro,exec,loop cpu2017-1_0_2.iso /mnt

启动 riscv 版本

sudo qemu-system-riscv64 \-M virt \-nographic \-smp 8 \-m 16G \-kernel ../linux-6.7/arch/riscv/boot/Image \-append "root=/dev/vda rw console=ttyS0" \-netdev tap,id=eth0 \-device virtio-net-device,netdev=eth0 \-drive file=riscv64.image,if=none,format=raw,id=hd0 \-device virtio-blk-device,drive=hd0# 切换到 bash 使用体验更好
bash
# 挂载这两个文件系统, 可以让 ubuntu 探测到处理器的信息, lscpu 可以查到相关信息
mount -t proc proc /proc
mount -t sysfs sysfs /sys# 下面是我的需求, 在前面添加了 iso 的模块之后, 可以挂载, 并且安装我使用过程中在 `qemu` 中 `apt` 从网上下载包是有问题的(上网还是有点困难),但是本地挂载文件系统,然后 `chroot` 再 `apt` 是可以正常下载的,所以折衷了以下,**需要的包通过本地 chroot 来进行安装依赖的包,然后进入 qemu 中使用**
mount -t iso9660 -o ro,exec,loop cpu2017-1_0_2.iso /mnt

注:我使用过程中在 qemuapt 从网上下载包是有问题的(上网还是有点困难),但是本地挂载文件系统,然后 chrootapt 是可以正常下载的,所以折衷了以下,需要的包通过本地 chroot 来进行安装依赖的包,然后进入 qemu 中使用

Spec cpu2017 可以正常跑起来了

基本可以满足我的需求,但是还是有点取巧了

关于 qemu ubuntu-base 配置联网,还在学习中,有熟悉的大佬可以评论

附录:Qemu 运行 (ARM64、RISC-V)Ubuntu

关于这部分,正好有 Ubuntu 官方的示例:

https://wiki.ubuntu.com/ARM64/QEMU

https://wiki.ubuntu.com/RISC-V/QEMU

参考官方的示例,可以在 qemu 中执行 arm64 以及 riscv 版本的 ubuntu server

有一点比较隔应,arm64 的版本的 user 以及 password 不知道,也没在官网上找到,这个不敢保证

riscv 版本可以在上述文档中找到关于 user 以及 password 的描述

总体来说,这种方式很快并且便捷,但是体量比 ubuntu-base 大很多,所以也会慢很多,在 qemu 或嵌入式中还是推荐 ubuntu-base 制作根文件系统

其中 -m 指定内存、-smp 指定核心数量,可以给大一点,如下:

# 其中的mac地址根据官方的脚本随机生成
sudo qemu-system-aarch64 \-m 8G -smp 8 -cpu cortex-a57 -M virt -nographic \-pflash /usr/share/AAVMF/AAVMF_CODE.fd \-pflash flash1.img \-drive if=none,file=jammy-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 \-netdev type=tap,id=net0 -device virtio-net-device,netdev=net0,mac=00:16:3e:3d:74:0f
qemu-system-riscv64 \-machine virt -nographic -m 2048 -smp 4 \-bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.bin \-kernel /usr/lib/u-boot/qemu-riscv64_smode/uboot.elf \-device virtio-net-device,netdev=eth0 -netdev user,id=eth0 \-device virtio-rng-pci \-drive file=ubuntu-22.04.3-preinstalled-server-riscv64+unmatched.img,format=raw,if=virtio

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

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

相关文章

Kong: Services and Routes 等基本属性

Services 在Kong Gateway中,服务是现有上游应用程序的抽象。服务可以存储插件配置和策略等对象的集合,并且可以与路由相关联。 定义服务时,管理员会提供名称和上游应用程序连接信息。连接详细信息可以在 url 字段中以单个字符串的形式提供…

RCC——使用HSE/HSI配置时钟

RCC 文章目录 前言一、背景二、仿真计算周期 2.1 2.2 三、MCO引脚输出时钟总结 前言 前期疑问:1、RCC是什么意思。 2、最终配好的72M是系统时钟吗? 3、一共有哪些时钟 本文目标:将PLL时钟配置成72M 疑问解答:最终配好的时钟是…

用Flask打造一个大模型智能问答WEB网站

目前已经有很多类似GPT的大模型开源,可以提供类似ChatGPT的智能问答功能。我也基于这些开源模型,用Flask来建立一个智能问答网站,可以方便用户建立自己的ChatGPT系统。 这个网站需要提供用户登录功能,对已登录的用户,可以在网站上提出问题,并由大模型处理后返回答案。演…

C++ 实现多线程的生产者(producer) - 消费者(consumer) 模型

1. 模型介绍: 生产者消费者模型是操作系统中的一种并发编程模型,用于解决生产者和消费者之间的数据共享和同步问题。 在该模型中,生产者负责生成数据,并将数据放入一个有限的缓冲区中,而消费者则从缓冲区中取出数据进…

网上零食销售系统

技术架构: Servlet MySQL JSP 功能描述: 1.浏览商品 (1) 商品详细资料 (2) 商品编号 2.订购商品 3.购物车 4.用户信息维护 (1) 用户注册 (2) 用户…

04-Seata修改通信端口

基于docker环境部署下,可以翻看专栏之前的文章 配置文件 /home/server/seata/resources/application.yml 默认${server.port} 1000 1、修改服务端(TC)配置 seata:server:service-port: 7090 2、修改映射端口 在启动脚本中修改映射端口 docker run -id --nam…

嵌入式——实时时钟(RTC)

目录 一、初识RTC 1.简介 2.特性 3.后备寄存器和RTC寄存器特性 二、RTC组成 1.相关寄存器 (1)控制寄存器高位(RTC_CRH) (2)控制寄存器低位(RTC_CRL) (3&#xf…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长,要求简短回复;如果输出过于简单…

Redis客户端之Redisson(二)Redisson组件

Redisson的几个常用客户端 一、RedissonClient 1、创建 通过Config对象配置RedissonClient所需要的参数,然后获取RedissonClient对象即可。 Config config new Config(); config.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonC…

【python】argparse解析参数的过程

python基础知识 python文件解析if __name__ __main__的作用import到底导入了什么?argparse解析命令行参数的过程 python文件解析 Python和C语言的编译、执行过程有很大区别。我们先回顾一下c语言的执行过程,首先代码文件要编译,编译通过&am…

【C++杂货铺】详解类和对象 [上]

博主:代码菌-CSDN博客 专栏:C杂货铺_代码菌的博客-CSDN博客 目录 🌈前言🌈 📁 面向对象语言的特性 📁 类 📂 概念 📂 定义 📁 访问限定符 📂分类 &#x…

《WebKit 技术内幕》学习之十五(1):Web前端的未来学习

1 趋势 说到Web方面的趋势,特别是HTML5获得的巨大发展,W3C和WHATWG等组织正在不停地推动规范的演进和引入新的规范,这一举动必将极大地推动Web前端的发展。就目前Web前端来说,各种类型的技术非常多,极容易引起大家的误…

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的,虽然刚开始会花费时间用来学习,但是实践证明,虽然学习新东西可能会花费一些时间,但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的,也是很有乐趣的。 网络上…

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别: 二、实验 1、安装部署 2、给集群添加监控: 3、创建命名空间: 4、创建deployment: 5、创建service: 6、创建ingress: 7、创建hpa 8…

基于高精度YOLOv8开发构建公共场景下行人人员姿态估计分析识别系统

姿态估计(PoseEstimation)在我们前面的相关项目中涉及到的并不多,CV数据场景下主要还是以目标检测、图像识别和分割居多,最近正好项目中在使用YOLO系列最新的模型开发项目,就想着抽时间基于YOLOv8也开发构建实现人体姿…

知识笔记(九十七)———什么是实体符???

在HTML中&#xff0c;有些字符无法直接在文本中输入&#xff0c;因为它们是HTML语言的保留字符&#xff0c;如小于号&#xff08;<&#xff09;、大于号&#xff08;>&#xff09;、&符号&#xff08;&&#xff09;等。为了将这些字符显示在网页上&#xff0c;需…

[UI5 常用控件] 02.Title,Link,Label

文章目录 前言1. Title1.1 结合Panel1.2 结合Table1.3 Title里嵌套Link 2. Link3. Label3.1 普通用法3.2 在Form里使用 前言 本章节记录常用控件Title,Link,Label。 其路径分别是&#xff1a; sap.m.Titlesap.m.Linksap.m.Label 1. Title Title可以结合其他控件一起使用 1.…

总结红包雨项目的所有代码,包括添加图片,分享按钮,红包雨,用户是否有抽奖逻辑判断

整体实现效果: 需要用的图片: html: <body><div id"app"><!-- <div class"share-box"><img src"./share_box.png" alt"share-button"></div> --><!-- img图片 --><div class"gif-…

DNS解析记录类型

在数字化时代&#xff0c;理解DNS&#xff08;域名系统&#xff09;解析的各种记录类型对于任何网络专业人士来说都是至关重要的。DNS作为互联网的基石&#xff0c;其记录类型的多样性和复杂性使得网络通信既高效又安全。以下是对DNS记录类型的详细解读。 A记录&#xff08;Ad…

axios结合ts使用,取消请求,全局统一获取数据,抛出错误信息

通常在开发时&#xff0c;后端向前端返回的数据可以如下&#xff1a; 1 使用restful api充分利用http状态码&#xff0c;然后在data中追加code字段&#xff0c;请求成功返回200,请求失败返回404,401,500等状态码&#xff0c;并且在code字段中给出详细的字符串信息2 再包一层&a…