【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

使用命令:

powershell 复制代码
qemu-system-aarch64 -version
qemu-aarch64-static  -version

即可查看已安装的版本

如果没有的话 需要执行安装:

powershell 复制代码
sudo apt install qemu-system-aarch64

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

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

如:

powershell 复制代码
fdisk -l radxa.img

这里可以看到img文件有三个分区

第三个即为我们要使用的主系统分区(根据实际情况而定)

通过losetup -f命令查看可用的循环设备

那么就可以使用losetup -p 参数挂载img文件到对应的循环设备

powershell 复制代码
sudo losetup -P /dev/loop15 radxa.img

而后使用sudo lsblk查看循环设备列表

那么现在就可以通过mount命令挂载loop15p3到/mnt/目录了

powershell 复制代码
sudo mount /dev/loop15p3 /mnt/

可以在mnt目录下看到所有原本在img分区内的文件(不用担心mnt挂载的其他设备会被覆盖 如共享文件夹等 这些在卸载挂载时会还原)

然后可以建立一个rootfs文件夹,将这些文件都拷贝进去

powershell 复制代码
mkdir ~/rootfs
sudo cp -a /mnt/* ~/rootfs/

拷贝完毕就可以卸载mnt了

powershell 复制代码
sudo umount /mnt

卸载mnt后 mnt下就被还原成最初只有共享文件夹的状态了

同时 使用losetup -d命令即可卸载循环设备

powershell 复制代码
sudo losetup -d /dev/loop15

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

移植qemu-aarch64-static

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

powershell 复制代码
sudo cp /usr/bin/qemu-aarch64-static ./rootfs/usr/bin/

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

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

运行以下指令:

powershell 复制代码
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

成功挂载后 可以在文件系统中看到被挂载的目录

如果是卸载的话 就是:

powershell 复制代码
sudo umount  ./rootfs/proc
sudo umount  ./rootfs/sys
sudo umount  ./rootfs/dev
sudo umount  ./rootfs/dev/pts

(如果运行完虚拟机后要卸载挂载 那么需要扥虚拟机完全关闭才行 最好是延时后卸载 否则会有bug)

当然 重启的话 也会自动卸载了

移植resolv.conf文件

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

powershell 复制代码
sudo cp /etc/resolv.conf ./rootfs/etc/

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

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

powershell 复制代码
sudo chroot ./rootfs /bin/bash

进去以后 就直接是虚拟机的终端

运行后 即可操作虚拟机上的各种文件、程序

但是涉及到需要硬件架构支持的 运行则会报错

写一个shell脚本来运行

powershell 复制代码
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本身的编译器

譬如:

powershell 复制代码
#C++编译环境
sudo apt-get install -y cmake
sudo apt-get install -y g++ build-essential

sudo 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链接如下图:

链接后 配置串口为

c 复制代码
baudrate: 1500000
data bit: 8
stop bit: 1
parity  : none
flow control: none

启动后 用户名和密码都为radxa

外设挂载

根据df命令查询系统挂载点

其做好了的U盘外部存储空间为/config

连接WiFi

使用如下指令链接WiFi:

c 复制代码
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:

powershell 复制代码
sudo apt-get update
sudo apt-get install openssh-server openssh-sftp-server

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

重启ssh服务:

powershell 复制代码
sudo systemctl restart ssh

启动后如下:

Active状态就被设置为了running

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

powershell 复制代码
sudo systemctl enable --now ssh

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

powershell 复制代码
ssh [username]@[IP address] # or ssh [username]@[hostname]

如下图:

SSH的文件交互

若是在PC上作为主机去访问设备

那么就是在PC的cmd中运行shell

有的终端软件配备了ssh的文件管理传输功能

连上以后就可以直接搜素到当前目录下的各类文件 以便于实现文件管理

并且可以直接download

powershell 复制代码
# 复制 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

powershell 复制代码
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文件

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

c 复制代码
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的则是:

c 复制代码
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

将原本的文件进行编辑:

c 复制代码
sudo nano /etc/apt/sources.list

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

c 复制代码
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

如图:

然后再换子目录下的源

c 复制代码
sudo nano /etc/apt/sources.list.d/raspi.list

替换成:

c 复制代码
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

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

c 复制代码
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

换源后 执行

c 复制代码
sudo apt-get upgrade
sudo apt-get update
相关推荐
研究是为了理解1 小时前
Linux 阻塞等待框架
linux
学不动CV了2 小时前
基于按键开源MultiButton框架深入理解代码框架(三)(指针的深入理解与应用)
c语言·arm开发·stm32·单片机·算法·51单片机
时序数据说2 小时前
工业物联网中的时序数据库应用
大数据·数据库·物联网·时序数据库·iotdb
躲着人群2 小时前
马拉车(Manacher)算法
c语言·数据结构·c++·算法
小白的程序空间2 小时前
Anaconda Prompt中删除库虚拟环境【保姆级教程】
linux·开发语言·python
努力自学的小夏2 小时前
RK3568 Linux驱动学习——SDK安装编译
linux·arm开发·笔记·学习
basketball6162 小时前
Linux C 信号操作
linux·c语言·开发语言
GC_June074 小时前
STM32 + 移远EC800 4G通信模块数传
arm开发·stm32·嵌入式硬件
ChuHsiang4 小时前
【C语言学习】基础知识
c语言