qemu模拟arm64环境-构建6.1内核以及debian12

news2024/10/6 17:00:08

一、背景

        手头没有合适的arm64开发板,但是需要arm的环境,于是想到qemu模拟一个。除了硬件交互以外,软件层面的开发还是都可以实现的。

        虚拟机还能自定义内存大小和镜像大小,非常适合上板前的验证,合适的话再买也不迟。

        为了提高配置效率与实用性,我直接使用香橙派的构建脚本编译根文件。没有和其他作者一样使用busybox制作根文件系统,我使用debian来提供apt等常用功能。

二、构建流程

       1、qemu

        建议使用git clone 源码进行编译,减少匹配问题。

git clone https://github.com/qemu/qemu.git

        或者官网压缩包下载地址:

Download QEMU - QEMUicon-default.png?t=O83Ahttps://www.qemu.org/download/

        以 git clone 为例编译源码:

cd qemu
./configure --enable-kvm --enable-debug --enable-vnc --enable-user --enable-slirp --target-list="aarch64-softmmu"
make -j8
sudo make install

需要注意配置源码时的configure指令,如果想要了解参数的配置见我另一篇文章。

        qemu-system-aarch64开启user用户模式网络连接-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/plmm__/article/details/142701489?spm=1001.2014.3001.5502

        2、交叉编译工具链

       可以使用apt安装,也可以下载arm官方的压缩包,解压后记得配置PATH环境变量。

sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install libncurses5-dev  build-essential git bison flex libssl-dev

https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xzicon-default.png?t=O83Ahttps://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
 

        3、kernel

        内核源码我使用香橙派提供的6.1版本,使用Linux官方的也是可以的。

git clone --depth=1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi

        设置ARCH和CORSS_COMPILE。

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

        内核config配置文件建议使用defconfig,使用rockchip的默认配置无法通过qemu启动,暂时不知道原因。对于qemu的虚拟机,不需要设备树,只需要镜像即可。

make defconfig
make Image -j8

       

        4、debian根文件

        使用香橙派的 orangepi-build 工具构建,这里只是简单介绍过程,详细流程可以查看任意开发板的使用手册。

        下载工具:

git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next

        下载完成后,执行build脚本:

sudo ./build

        选择构建Rootfs and all deb packages:

        然后需要选择开发板类型,看心情选即可。

        下一步是选择内核版本,由于内核选的6.1,这里需要选current。如果内核选择5.4,这里要选legacy。

        选择rootfs类型,看需要选即可:

        选择服务器版本还是桌面版本,建议服务器版本:

        选择标准:

        这一步回车跳过:

        等待构建完成可以在external/cache/rootfs/目录下找到 lz4 压缩包,需要解压后创建一个可挂载的ext4文件镜像。        

(1)创建一个空的磁盘镜像文件

qemu-img create -f raw rootfs.img 5G

(2)格式化磁盘镜像

sudo mkfs.ext4 rootfs.img

(3)挂载磁盘镜像

sudo mkdir -p /mnt/rootfs
sudo mount -o loop rootfs.img /mnt/rootfs

(4)将解压后的内容直接写入到挂载的目录

压缩包替换为生成的文件名。

sudo lz4 -d --stdout bookworm-cli-arm64.tar.lz4 | sudo tar -x -C /mnt/rootfs/

(5)卸载磁盘镜像

sudo umount /mnt/rootfs

三、启动虚拟机

        创建一个工作目录 qemu_arm64,将生成的内核镜像,根文件系统放到目录。创建一个文件夹share_dir用于共享文件。

        新建启动脚本 start.sh:

#!/bin/bash

sudo qemu-system-aarch64 \
-M virt \
-cpu cortex-a57 \
-nographic \
-smp 4 \
-m 2048 \
-kernel Image \
-drive if=none,file=rootfs.img,format=raw,index=0,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-append "rdinit=/linuxrc root=/dev/vda rw console=ttyAMA0 loglevel=8" \
-virtfs local,path=./share_dir,mount_tag=host0,security_model=passthrough,id=host0 \
-netdev user,id=net0,hostfwd=tcp::10022-:22 \
-device virtio-net-pci,netdev=net0

        加sudo主要是用于隔离环境变量,防止意外。参数的大部分可以通过chatgpt分析,其中用于挂载根文件的指令:

-drive if=none,file=rootfs.img,format=raw,index=0,id=hd0 \
-device virtio-blk-device,drive=hd0 \

        用于挂载共享文件的指令:

-virtfs local,path=./share_dir,mount_tag=host0,security_model=passthrough,id=host0 \

        网络我没有使用桥接的方式,而是使用qemu自带的user方式联网,缺点是不能和宿主机通信。用于连接网络的指令:

-netdev user,id=net0,hostfwd=tcp::10022-:22 \
-device virtio-net-pci,netdev=net0

执行start.sh脚本即可启动虚拟机:

四、挂载和联网

        启动虚拟机后,需要挂载共享文件夹,并根据模拟的网卡进行dhcp。

        1、挂载共享文件夹

#!/bin/bash

mkdir -p /mnt/share
mount -t 9p -o trans=virtio,version=9p2000.L,access=any,rw host0 /mnt/share

        这里的文件夹就是启动指令中的share_dir,宿主机可以将文件放到文件夹内,虚拟机可以读和访问,但是不能写,提示没有权限,暂时还未解决。

        不过在网络设置成功后,可以使用scp命令传输文件到宿主机,形成数据回环。

        2、dhcp

#!/bin/bash

INTERFACE=$(ls /sys/class/net/ | grep -v lo)

sudo ip link set dev $INTERFACE up
sudo dhclient $INTERFACE

        这个脚本我采用临时设置的方式,原因是虚拟机有时候网卡名字会变,直接写入网络配置文件可能会失效。执行后会查询当前的网卡名,然后执行dhcp。

        获取到ip后就可以apt更新了。

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

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

相关文章

深度学习:5种经典神经网络模型介绍

目录 1. LeNet:CNN的鼻祖 2. AlexNet:深度学习的开山之作 3. VGGNet:深度与简洁的结合 4. GoogLeNet:Inception模块的创新 5. ResNet:残差学习的革命 卷积神经网络(CNN)已经发展为图像识别…

张雪峰谈人工智能技术应用专业的就业前景!

一、张雪峰谈人工智能技术应用专业 在教育咨询领域,张雪峰老师以其深入浅出的讲解和前瞻性的视角,为广大学子提供了宝贵的专业选择建议。对于人工智能技术应用专业,张雪峰老师通常给予高度评价,认为这是一个充满无限可能且就业前…

DELL SC compellent存储的四种访问方式

DELL SC存储(国内翻译为 康贝存储,英文是compellent), compellent存储是dell在大概10多年前收购的一家存储,原来这个公司就叫做compellent。 本文的阅读对象是第一次接触SC存储的技术朋友们,如何访问和管理SC存储。总…

陀螺仪LSM6DSV16X与AI集成(13)----中断获取SFLP四元数

陀螺仪LSM6DSV16X与AI集成.13--中断获取SFLP四元数 概述视频教学样品申请源码下载硬件准备SFLP开启INT中断中断读取传感器数据主程序演示 概述 本文将介绍如何通过中断机制获取 LSM6DSV16X 传感器的 SFLP(Sensor Fusion Low Power)四元数数据。LSM6DSV1…

深入剖析 Golang 的错误处理机制:让你的代码更加健壮与优雅

在 Go 语言中,错误处理是程序健壮性的重要组成部分。不同于许多其他编程语言使用的 try-catch 异常处理机制,Go 采用了一种更加简洁的方式,通过函数返回值处理错误。这种设计使得错误处理逻辑更加显式,代码也更容易理解和维护。 文…

Python 工具库每日推荐 【markdown2】

文章目录 引言Python文本处理库的重要性今日推荐:markdown2工具库主要功能:使用场景:安装与配置快速上手示例代码转换为HTML代码解释实际应用案例案例:博客文章处理案例分析高级特性自定义扩展安全模式命令行使用性能优化技巧扩展阅读与资源优缺点分析优点:缺点:总结【 已…

Byzantine setting 拜占庭环境

优秀教程 拜占庭将军问题(The Byzantine Generals Problem): 拜占庭将军问题(The Byzantine Generals Problem) Byzantine setting 在联邦学习和分布式计算中,“Byzantine setting”(拜占庭环境)是指一个分布式系统中的部分参与者可能表现出…

SE-Net模型实现猴痘病识别

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

国庆出行怎么能少了这款美食

🎈国庆出游,怎能少了白吉饼!🎉宝子们,国庆假期大家都在哪里玩耍呀?今天我必须给大家强烈安利国庆旅游必带美食 ——食家巷白吉饼。😋白吉饼看似普通,却有着独特的魅力。它的外表金黄…

pip install dlib 失败报错的解决方案

pip install dlib 失败报错: 解决方案: 我是按照下面三条指令按照就能解决问题 pip install cmake -i https://pypi.tuna.tsinghua.edu.cn/simple pip install boost -i https://pypi.tuna.tsinghua.edu.cn/simple pip install dlib -i https://p…

Stm32新建工程

库函数的开发方式。能够了解底层逻辑。 HAL库的开方式。快速上手,理解浅。 库函数的文件目录 Libraries里面就是库函数的文件 project官方实例的工程和模板,可以参考库函数 Utilities,官方在用电路测评STM32时使用的程序。 蓝色为库函数的发…

机器学习课程学习周报十五

机器学习课程学习周报十五 文章目录 机器学习课程学习周报十五摘要Abstract一、机器学习部分1. 统计推断与贝叶斯推断2. GMM和EM算法补充3. 马尔可夫链蒙特卡罗法3.1 蒙特卡罗法3.2 马尔可夫链3.3 Diffusion模型中的马尔可夫链 总结 摘要 本周的学习涵盖了统计推断和贝叶斯推断…

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo

布匹瑕疵检测数据集 4类 2800张 布料缺陷 带标注 voc yolo 对应标注,格式VOC (XML),选配Y0L0(TXT) label| pic_ num| box_ _num hole: (425, 481) suspension_ wire: (1739, 1782) topbasi: (46, 46) dirty: (613&…

近期最佳港片,探讨家庭与希望,结尾让人心碎

在当下的电影环境中,香港电影正在经历一场颇具深意的转变,逐渐将目光投向普通人的生活。这种变化在《但愿人长久》中体现得淋漓尽致,影片通过一个家庭的悲欢离合,让人深刻感受到人性的复杂。吴慷仁在片中扮演的角色,无…

github项目——系统设计入门

今天的github趋势,有几个项目印象感觉很有意思,之后可能会用的上,记录一下 系统设计入门 书籍教程类项目,有中文文档,刚好需要。 https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md…

从零开始讲PCIe(9)——PCIe总线体系结构

一、分层结构 PCIe定义了一个分层架构,如图2-12所示。这些层逻辑上分为两个部分,分别独立运行:一个用于发送侧,另一个用于接收侧。分层方法对硬件设计者是很有好的,因为如果逻辑划分得当,在迁移到新版本的P…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接: 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化,这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输(技术层面)&…

《CUDA编程》5.获得GPU加速的关键

从本章起&#xff0c;将关注CDUA程序的性能&#xff0c;即执行速度 1 用CUDA事件计时 在前几章中&#xff0c;使用的是C的<time.h>库进行程序运行计时&#xff0c;CUDA也提供了一种基于CUDA event的计时方式&#xff0c;用来给一段CUDA代码进行计时&#xff0c;这里只介…

数字化营销:开启商业新征程

在当今数字化时代&#xff0c;数字化营销已成为企业竞争的关键利器。 数字化营销有着完整的体系。首先是目标设定与市场分析&#xff0c;明确如提高品牌知名度、增加销量等目标&#xff0c;并通过市场调研了解消费者需求。接着是客户洞察与定位&#xff0c;收集客户数据构建画像…

安装最新 MySQL 8.0 数据库(教学用)

安装 MySQL 8.0 数据库&#xff08;教学用&#xff09; 文章目录 安装 MySQL 8.0 数据库&#xff08;教学用&#xff09;前言MySQL历史一、第一步二、下载三、安装四、使用五、语法总结 前言 根据 DB-Engines 网站的数据库流行度排名&#xff08;2024年&#xff09;&#xff0…