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

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

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

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

以下两篇博客是我记录的在 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:ubuntu-base-22.04.3-base-arm64.tar.gz

2、编译内核:

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

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-

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

3、创建空磁盘:

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

一种是使用 qemu-img 命令

另一种是使用 dd 命令

这里推荐 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/# apt 下载安装 qemu-user-static, 包含了 qemu-aarch64-static
sudo cp /usr/bin/qemu-aarch64-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

注意: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

注:我使用过程中在 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/645240.shtml

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

相关文章

关于标准那些事——第十篇 分类标准

最近要赶一个极其重要的CANS认证项目,这会是全中国第一个完全数字化CNAS认证的实验室项目,内容分享进度会比较慢。其实,大多数情况也并不是没有时间,俗话说:时间嘛,挤挤总是有的!其实影响进度更…

imgaug库图像增强指南(38):从入门到精通——图像卷积的全面解析

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

Java- @FunctionalInterface声明一个接口为函数式接口

基本介绍 FunctionalInterface 是 Java 8 中引入的注解,用于声明一个接口是函数式接口。函数式接口是指仅包含一个抽象方法的接口,可以用于支持 Lambda 表达式和方法引用。FunctionalInterface 注解确保该接口只包含一个抽象方法,从而确保其…

VSCode Python调试运行:json编写

对于需要在命令行传参运行的项目,如果想要调试运行,则需要编写对应的launch.json文件这里记录一下json文件的编写格式: {"version": "0.2.0","configurations": [{"python": "/data/xxx/minic…

excel统计分析——Tukey‘s-b法多重比较

参考资料:生物统计学 Tukeys-b多重比较法是对Tukey法和S-N-K法的综合,取两种方法临界值的各1/2合成。临界值表达式为: 其中,m为秩次距,k为样本平均数的个数,df为误差项自由度, Tukey多重比较具…

【IEEE会议征稿通知】2024年算法、软件工程与网络安全国际学术会议(ASENS 2024)

2024年算法、软件工程与网络安全国际学术会议(ASENS 2024) The International Conference on Algorithms, Software Engineering and Network Security 2024年算法、软件工程与网络安全国际学术会议(ASENS 2024)将于2024年3月29…

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

1)通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别 2)OPPO相关机型没法在Unity启用90或120FPS 3)手机输入法中的emoji 4)Unity Application Patching怎么用 这是第369篇UWA技术知识分享的推送,精选了UW…

工程项目管理软件系统

工程项目管理软件系统单机版永久免费使用,无录入数量限制,无打印限制,无时间限制 1、产品概述 专业项目管理软件,业务流程清晰,操作简单,软件速度快; 围绕项目的(任务、进度、出库、入库、借用、人工、合同等)进行管理…

linux Socket 缓存 介绍

重要成员变量 这里介绍的成员是驱动可能需要存取的. 以非特别的顺序列出它们. struct net_device *dev; 接收或发送这个缓存的设备 union { /* ... */ } h; union { /* ... */ } nh; union { /*... */} mac; 指向报文中包含的各级的头的指针. union 中的某个成员都是一个不同数…

牛客NC267071小红构造数组(C++)

题目链接 实现方法 本题分为两步: 质因数分解;数字重排序(相同数字不连续) 质因数分解使用线性筛法,并在求质因数的过程中不断减小原数字。 数字重排序与重排字符串方法相同。 使用有序集合multiset存放各质因数及…

简述Elasticsearch(ES)是什么 全文搜索概念 (倒排索引 管理文档)

今天 我们来说说 NoSql 中的 Elasticsearch 大家基本都叫它 ES 官方介绍 它是一个分布式全文搜索引擎 分布式是一个系统架构的概念 而 全文搜索引擎 全文搜索 可以说基本大家天天都在接触 就比如 我们京东购物 想买什么东西 在全文输入框中搜索 它就会在所有物品中 帮你找出需…

C语言零基础入门第2天《 visual studio下载安装教程和搭建开发环境及踩坑指南》(保姆级图文教程)

visual studio下载安装教程和搭建开发环境 1、 项目实战效果图2、简单了解一下目前主流的开发环境3、 visual studio下载地址4、 visual studio安装教程5、 配置visual studio环境变量 6、如何新建一个C项目7、新建第一个C程序8、用代码测试创建的项目是否可用8、如何成功让代码…

bootstrap编辑回显案例

bootstrap编辑回显案例 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Bootstrap Table Edit</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4…

oracle ADG数据库开启审计

oracle ADG备库的审计只能开启的OS状态。 在把审计开到DB状态的时候&#xff0c;重启备库的时候状态又重新变回OS状态。 Completed: ALTER DATABASE MOUNT Wed Jan 24 01:56:13 2024 ALTER DATABASE OPEN Data Guard Broker initializing... Data Guard Broker initializat…

利用git上传本地文件

1、建立仓库 2.然后刷新网站&#xff0c;获取下载链接&#xff0c;备用。 3、接下来在本地创建一个文件夹&#xff0c; 4、把github上面的仓库克隆到本地 git clone https://github.com/xxxxx&#xff08;https://github.com/xxxxx替换成你之前复制的地址&#xff09; 5、把…

C# 实现 XOR 密码

XOR密码&#xff08;异或密码&#xff09;是一种简单的加密算法&#xff0c;它使用异或&#xff08;XOR&#xff09;操作来对明文和密钥进行加密和解密。 异或操作是一种位运算&#xff0c;它对两个二进制数的对应位进行比较&#xff0c;如果两个位相同&#xff08;都为0或都为…

GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接&#xff1a;GPT4Python近红外光谱数据分析及机器学习与深度学习建模 第一&#xff1a;GPT4 1、ChatGPT&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别&#xff0c;以及与国内大语言模…

postman使用-09发送报告

文章目录 环境部署生成测试报告导出测试集导出环境变量导出全局变量 生成报告演示案例一&#xff1a;单一接口使用环境变量和全局变量案例二&#xff1a;单一接口使用环境变量、全局变量、CSV文件参数案例三&#xff1a;多接口&#xff0c;批量执行 总结 环境部署 1.安装nodej…

CSS文本外观属性(知识点2)

知识引入 1.text-indent&#xff1a;首行缩进 text-indent属性是用于定义首行文本的缩进&#xff0c;其属性值可为不同单位的数值&#xff0c;em字符宽度的倍数或相对于浏览器窗口宽度的百分比%&#xff0c;允许使用负值&#xff0c;建议使用em作为设置单位&#xff0c;下面通…

Docker Image(镜像)

Docker镜像是什么 Docker image 本质上是一个 read-only 只读文件&#xff0c;这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。我们可以把 Docker image 理解成一个模板&#xff0c; 可以通过这个模板实例化出来很多容器。image 里面…