【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.pswp.cn/web/78617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78617.shtml
英文地址,請注明出處:http://en.pswp.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…