【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