【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)

【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)

qemu提供了运行ARM虚拟机的方法
具体的操作方式就是建立一个硬盘img 然后通过iso安装到img 最后再运行img即可
这种方式教程很多 很简单
但由于各种配置不一致,这种方式不太适用于直接运行已经制作好了的img(即直接烧录到开发板上就能运行的img)
并且直接烧录到开发板的img,最初也是由iso文件逐步安装上去的,安装的环境不一样,运行的环境也不一样。
所以这里不使用qemu工具直接操作虚拟机,而是使用类似docker的方式来运行虚拟机,不过会用到qemu依赖。

这里介绍的是对已有img文件的运行
该img文件能够在ARM平台直接运行
原理就是将img文件的系统内容拷贝到Linux平台上 然后对其使用chroot命令即可

文章目录

  • 安装qemu-aarch64-static
  • 查看并挂载img文件分区(将img分区文件完整拷贝)
  • 移植qemu-aarch64-static
  • 挂载系统目录到制作的rootfs目录
  • 移植resolv.conf文件
  • 使用chroot命令运行虚拟机系统
  • 写一个shell脚本来运行
  • ARM环境下“交叉编译”
  • 附录:开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)
    • ZERO 3烧录
    • ZERO 3串口shell
    • 外设挂载
    • 连接WiFi
    • SSH连接
    • SSH的文件交互
    • 换源

安装qemu-aarch64-static

使用命令:

qemu-system-aarch64 -version
qemu-aarch64-static  -version

即可查看已安装的版本
如果没有的话 需要执行安装:

sudo apt install qemu-system-aarch64

查看并挂载img文件分区(将img分区文件完整拷贝)

通过fdisk -l命令可以查看img文件相关
如:

fdisk -l radxa.img

在这里插入图片描述
这里可以看到img文件有三个分区
第三个即为我们要使用的主系统分区(根据实际情况而定)

通过losetup -f命令查看可用的循环设备
在这里插入图片描述
那么就可以使用losetup -p 参数挂载img文件到对应的循环设备

sudo losetup -P /dev/loop15 radxa.img

而后使用sudo lsblk查看循环设备列表
在这里插入图片描述
那么现在就可以通过mount命令挂载loop15p3到/mnt/目录了

sudo mount /dev/loop15p3 /mnt/

在这里插入图片描述
可以在mnt目录下看到所有原本在img分区内的文件(不用担心mnt挂载的其他设备会被覆盖 如共享文件夹等 这些在卸载挂载时会还原)
在这里插入图片描述
然后可以建立一个rootfs文件夹,将这些文件都拷贝进去

mkdir ~/rootfs
sudo cp -a /mnt/* ~/rootfs/

在这里插入图片描述
拷贝完毕就可以卸载mnt了

sudo umount /mnt

卸载mnt后 mnt下就被还原成最初只有共享文件夹的状态了
同时 使用losetup -d命令即可卸载循环设备

sudo losetup -d /dev/loop15

如此一来 我们就把img文件下对应的分区文件全部拷贝到了rootfs文件夹下

移植qemu-aarch64-static

通过命令来实现移植(默认安装路径/usr/bin/

sudo cp /usr/bin/qemu-aarch64-static ./rootfs/usr/bin/

在这里插入图片描述

挂载系统目录到制作的rootfs目录

(这一步可以不操作 不会影响后续的执行 甚至挂载以后再卸载也可以 但是建议每次运行时操作一下 确保安全)

运行以下指令:

sudo mount -t proc /proc ./rootfs/proc
sudo mount -t sysfs /sys ./rootfs/sys
sudo mount -o bind /dev ./rootfs/dev
sudo mount -o bind /dev/pts ./rootfs/dev/pts

在这里插入图片描述
成功挂载后 可以在文件系统中看到被挂载的目录

如果是卸载的话 就是:

sudo umount  ./rootfs/proc
sudo umount  ./rootfs/sys
sudo umount  ./rootfs/dev
sudo umount  ./rootfs/dev/pts

(如果运行完虚拟机后要卸载挂载 那么需要扥虚拟机完全关闭才行 最好是延时后卸载 否则会有bug)
当然 重启的话 也会自动卸载了

移植resolv.conf文件

为了能够运行以后远程连接、操作虚拟机 同时虚拟机能够上网 需要将相关的dns配置参数等移植过去

sudo cp /etc/resolv.conf ./rootfs/etc/

在这里插入图片描述

使用chroot命令运行虚拟机系统

使用chroot命令进入我们建立好的根目录系统

sudo chroot ./rootfs /bin/bash

进去以后 就直接是虚拟机的终端
在这里插入图片描述
运行后 即可操作虚拟机上的各种文件、程序
在这里插入图片描述
但是涉及到需要硬件架构支持的 运行则会报错

写一个shell脚本来运行

echo "cp /etc/resolv.conf ./rootfs/etc/"
sudo cp /etc/resolv.conf ./rootfs/etc/ #同步文件
echo "start chroot"
sudo chroot ./rootfs /bin/bash
echo "end chroot"

在这里插入图片描述
在虚拟机中输入exit即可退出

ARM环境下“交叉编译”

如果在ARM虚拟机上编译的话 就不要安装原本运行在PC上的交叉编译器了
而是应该安装ARM本身的编译器
譬如:

#C++编译环境
sudo apt-get install -y cmake
sudo apt-get install -y g++ build-essentialsudo apt-get install -y libopencv-dev #OPENCV库 4.5.1
sudo apt-get install -y libpcl-dev #PCL库 1.11.1

在这里插入图片描述
这样一来 其实严格意义上而言都不叫“交叉编译”了

交叉编译实际上是在PC的x86架构上运行支持交叉编译的编译器 然后编译成目标架构
其交叉编译器只能在PC上运行 但编译出来的文件只能在目标架构上运行

所以 在ARM环境上编译出ARM的程序 那么所用的编译器就不是交叉编译器了 所以直接安装g++即可
但如果在PC环境下安装g++ 则只能编译出在PC上运行的程序 如果要编译ARM程序 则需要交叉编译器如aarch64-g+±linux等

附录:开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

ZERO 3烧录

ZERO 3有两种 最本质的就是一个带WiFi一个不带WiFi
在这里插入图片描述

ZERO 3作为一个Linux板 其存储支持从sd卡EFI启动

系统安装则直接通过Balena Etcher来进行
可以使用其Windows版本即可
官方文档:
官方文档快速上手描述

镜像下载则也可以使用官方镜像:
Radxa ZERO 3 Debian Build 6

该镜像是最初的镜像 很多依赖都没有
如果开发的话 可以直接下载第三方镜像 或者自己在原有官方镜像上去安装镜像包等等

烧录很简单 直接用工具选择U盘 选择镜像即可

下图为烧录好了的sd卡
在这里插入图片描述
除了系统分区外 就是一个config分区 其挂载根根目录名称即为config

在这里插入图片描述

ZERO 3串口shell

串口与ZERO 3链接如下图:
在这里插入图片描述
链接后 配置串口为

baudrate: 1500000
data bit: 8
stop bit: 1
parity  : none
flow control: none

启动后 用户名和密码都为radxa
在这里插入图片描述

外设挂载

根据df命令查询系统挂载点
在这里插入图片描述
其做好了的U盘外部存储空间为/config
在这里插入图片描述

连接WiFi

使用如下指令链接WiFi:

nmcli device wifi                                           #扫描WiFi
sudo nmcli device wifi connect <ssid> password <passwd>     #连接WiFi

在这里插入图片描述
连上后 使用ip a命令即可查看连接状态和ip
在这里插入图片描述

SSH连接

使用命令sudo systemctl status ssh查看ssh状态在这里插入图片描述
前提是要安装ssh
如果没有安装 则通过shell安装ssh:

sudo apt-get update
sudo apt-get install openssh-server openssh-sftp-server

根据Active判断是否需要重启ssh服务:
重启ssh服务:

sudo systemctl restart ssh

启动后如下:
在这里插入图片描述
Active状态就被设置为了running

开机自启动ssh则使用命令:

sudo systemctl enable --now ssh

在PC上 支持ssh的设备中 使用以下指令链接到板子:

ssh [username]@[IP address] # or ssh [username]@[hostname]

如下图:
在这里插入图片描述

SSH的文件交互

若是在PC上作为主机去访问设备
那么就是在PC的cmd中运行shell

有的终端软件配备了ssh的文件管理传输功能
在这里插入图片描述
连上以后就可以直接搜素到当前目录下的各类文件 以便于实现文件管理
并且可以直接download
在这里插入图片描述

# 复制 Windows 文件到 Linux
scp D:\data\1.txt root@192.168.88.161:/root/data
# 复制 Windows 目录到 Linux(记得加 -r)
scp -r D:\data root@192.168.88.161:/root/data# 复制 Linux 文件到 Windows
scp root@192.168.88.161:/root/data/1.txt D:\data
# 复制 Linux 目录到 Windows(记得加 -r)
scp -r root@192.168.88.161:/root/data D:\data

前提是设备开启了ssh可以被链接
在这里插入图片描述
发过去后便能在板子上看到:
在这里插入图片描述

回传文件夹:
在这里插入图片描述
在这里插入图片描述

如果是Linux设备去连接Windows设备 则需要在Windows里面设置对应的服务 相关教程很多 这里不过多赘述

如果是Linux设备访问Linux设备 则主设备也要指定IP

scp root@192.168.88.161:/root/1.txt root@192.168.88.162:/root# 如果设置了Linux之间的免密登录,可这样写:
scp 192.168.88.161:///root/1.txt 192.168.88.162:///root

换源

Linux系统的源都在/etc/apt/下 一般有两个文件
一个是sources.list 另外一个是sources.list.d目录下的品牌list文件

如树莓派需要备份原本的源:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

而radxa的则是:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 
sudo cp /etc/apt/sources.list.d/radxa.list /etc/apt/sources.list.d/radxa.list.bak

将原本的文件进行编辑:

sudo nano /etc/apt/sources.list

注释掉最初的源 并添加新的源:

deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware

如图:
在这里插入图片描述
然后再换子目录下的源

sudo nano /etc/apt/sources.list.d/raspi.list

替换成:

deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

不过很可惜 清华源没有radxa 但是可以换debian的源(/etc/apt/sources.list):

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free

换源后 执行

sudo apt-get upgrade
sudo apt-get update

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

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

相关文章

OpenCv实战笔记(1)在win11搭建opencv4.11.1 + qt5.15.2 + vs2019_x64开发环境

一. 准备工作 Visual Studio 2019&#xff08;安装时勾选 C 桌面开发 和 Windows 10 SDK&#xff09; CMake 3.20&#xff08;官网下载&#xff09; Qt 5.15.2&#xff08;下载 Qt Online Installer&#xff09;安装时勾选 MSVC 2019 64-bit 组件。 opencv 4.11.1 源码下载 git…

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…

【算法笔记】动态规划基础(二):背包dp

目录 01背包例题状态表示状态计算初始化AC代码 完全背包例题状态表示状态计算初始化TLE代码 多重背包例题状态表示状态计算初始化AC代码 分组背包例题状态表示状态计算初始化AC代码 二维费用背包例题状态表示状态计算初始化AC代码 混合背包问题例题状态表示状态计算初始化TLE代…

Qt Quick Design 下载社区版

官方地址&#xff1a;Qt Design Studio - UI Development Tool for Applications & Devices 社区版只能用于开源软件的开发 按图所示下载或直接跳转到下载页面&#xff1a;Download Qt OSS: Get Qt Online Installerhttps://www.qt.io/download-qt-installer-oss 选Try …

深入理解CSS盒子模型

一、盒子模型的核心概念 CSS盒子模型&#xff08;Box Model&#xff09;是网页布局的基石&#xff0c;每个HTML元素都可以看作一个矩形盒子&#xff0c;由四个同心区域构成&#xff1a; 内容区&#xff08;Content&#xff09; 内边距&#xff08;Padding&#xff09; 边框&a…

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)

1.智能路径处理&#xff1a;自动识别并修正文件扩展名&#xff0c;根据转换类型自动建议目标路径&#xff0c;实时路径格式验证&#xff0c;自动补全缺失的文件扩展名。 2.增强型预览功能&#xff1a;使用pandastable库实现表格预览&#xff0c;第三方模块自己安装一下&#x…

数据库MySQL学习——day9(聚合函数与分组数据)

文章目录 1. 聚合函数1.1 COUNT() 函数1.2 SUM() 函数1.3 AVG() 函数1.4 MIN() 函数1.5 MAX() 函数 2. GROUP BY 子句2.1 使用 GROUP BY 进行数据分组2.2 结合聚合函数 3. HAVING 子句3.1 使用 HAVING 过滤分组数据3.2 HAVING 和 WHERE 的区别 4. 实践任务4.1 创建一个销售表4.…

数据管理能力成熟度评估模型(DCMM)全面解析:标准深度剖析与实践创新

文章目录 一、DCMM模型的战略价值与理论基础1.1 DCMM的本质与战略定位1.2 DCMM的理论基础与创新点 二、DCMM模型的系统解构与逻辑分析2.1 八大能力域的有机关联与系统架构2.2 五级成熟度模型的内在逻辑与演进规律 三、DCMM八大能力域的深度解析与实践创新3.1 数据战略&#xff…

Docker搜索镜像报错

科学上网最方便。。。。 主要是镜像的问题 尝试一&#xff1a; 报错处理 Error response from daemon: Get https://index.docker.io/v1/search?qmysql&n25: dial tcp 31.13.84.2:443: i/o timeout Error response from daemon: Get https://index.docker.io/v1/se…

ERP系统源码,java版ERP管理系统源码,云端ERP

一套开箱即用的云端ERP系统源代码&#xff0c;小型工厂ERP系统源码 SaaS ERP是一套开箱即用的云端ERP系统&#xff0c;有演示&#xff0c;开发文档&#xff0c;数据库文档齐全&#xff0c;自主版权落地实例&#xff0c;适合项目二开。 SaaS ERP具有高度的灵活性和可扩展性&am…

Sliding Window Attention(Longformer)

最简单的自注意力大家肯定都会啦。 但这种全连接的自注意力&#xff08;即每个 token 需要 attend 到输入序列中的所有其他 token&#xff09;计算与内存开销是 O ( n 2 ) O(n^2) O(n2) 。为了缓解这个问题&#xff0c;研究者们提出了 Sliding Window Attention。 Sliding W…

在Window10 和 Ubuntu 24.04LTS 上 Ollama 在线或离线安装部署

Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;服务框架&#xff0c;旨在通过轻量化、跨平台的设计&#xff0c;简化大模型在本地环境中的部署与应用。其基于 Go 语言开发&#xff0c;通过 Docker 容器化技术封装模型运行环境&#xff0c;提供类似命令行工具的交…

在Ubuntu系统中安装桌面环境

在 Ubuntu 系统中安装桌面环境可以通过包管理器 apt 或工具 tasksel 实现。以下是详细的安装方法和常见桌面环境的选择&#xff1a; --- ### **1. 准备系统更新** 在安装前&#xff0c;建议更新软件源和系统包&#xff1a; bash sudo apt update && sudo apt upgrade…

【云备份】服务端业务处理模块设计与实现

目录 一. 业务处理模块的任务 二. 网络通信接口设计 2.1.文件上传 2.2.展示页面获取 2.3.文件下载 三.业务处理类设计 3.1.业务处理类的代码框架编写 3.2.文件上传代码编写 3.3.展示页面的获取代码编写 3.4.文件下载代码编写——下载篇 3.4.文件下载代码编写——断…

基于SpringBoot的漫画网站设计与实现

1.1项目研究的背景 困扰管理层的许多问题当中,漫画信息管理一定是不敢忽视的一块。但是管理好漫画网站又面临很多麻烦需要解决,如何在工作琐碎,记录繁多的情况下将漫画网站的当前情况反应给相关部门决策等等。在此情况下开发一款漫画网站&#xff0c;于是乎变得非常合乎时宜。…

学习记录:DAY22

假日尾声&#xff1a;技术进阶与自我反思 前言 于是&#xff0c;假日迎来了它的尾声&#xff0c;把快乐和焦躁都留存在昨天。 我只觉情感的自相矛盾在加重&#xff0c;学习让我焦躁&#xff0c;纵欲无法填补空虚&#xff0c;于是我的心被拖入了无止尽的拉扯中。 我还没有找到必…

Oracle OCP认证考试考点详解083系列07

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 31. 第31题&#xff1a; 题目 解析及答案&#xff1a; 从 Oracle 19c 开始&#xff0c;数据库配置助手&#xff08;DBCA&#xff09;在克…

专业课复习笔记 4

前言 实际上对于我的考研来说&#xff0c;最重要的两门就是数学和专业课。所以从今天开始&#xff0c;我尽可能多花时间学习数学和专业课。把里面的知识和逻辑关系理解清楚&#xff0c;把常考的内容练习透彻。就这样。 寻址方式 立即数寻址 操作数在指令里面直接提供了。 …

Go小技巧易错点100例(三十)

本期分享&#xff1a; 1.切片共享底层数组 2.获取Go函数的注释 切片共享底层数组 在Go语言中&#xff0c;切片和数组是两种不同的元素&#xff0c;但是切片的底层是数组&#xff0c;并且还有一个比较重要的机制&#xff1a;切片共享底层数组。 下面这段代码演示了切片&…

反转字符串2

reverse函数的用法(reverse一般是左闭右开区间)&#xff1a; 1.反转数组&#xff1a; int arr[] {1, 2, 3, 4, 5}; int n sizeof(arr) / sizeof(arr[0]); // 反转数组arr的全部元素 reverse(arr, arr n); 2.反转字符串&#xff1a; string str "he…