【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文件能够在ARM平台直接运行
原理就是将img文件的系统内容拷贝到Linux平台上 然后对
文章目录
- 安装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