[qemu+chroot] & [qemu-user -L]


前情提要:使用qemu仿真固件的二進制文件(httpd)時,如果直接使用 sudo qemu-arm-static ./www/httpd ,肯定會報錯:/lib/ld-uClibc.so.0: No such file or directory.

這是由於仿真需要依賴squashfs-root下的環境,以及依賴其他的庫文件。

可以使用以下兩種方法來解決以上的問題。

注:qemu-arm-static需要拷貝到要仿真固件的squashfs-root目錄下。

 

1. qemu+chroot  chroot的用法

chroot命令用來在指定的根目錄下運行指令。chroot,即 change root directory (更改 root 目錄)。在 linux 系統中,系統默認的目錄結構都是以/,即是以根 (root) 開始的。而在使用 chroot 之后,系統的目錄結構將以指定的位置作為/位置。

但是需要注意以下幾點:

① 在經過 chroot 之后,在新根下將訪問不到舊系統的根目錄結構和文件,限制用戶的訪問范圍 → 增強了系統的安全性

② 使用 chroot 后,系統讀取的是新根下的目錄和文件,這是一個與原系統根下文件不相關的目錄結構,也就是說新目錄與原系統之間是隔離的。→ 方便用戶進行與系統不相關的獨立開發

 

2. qemu-user -L  qemu-user

qemu-user有一個 -L path 選項,可以用來變更動態庫查找路徑(/set the elf interpreter prefix to 'path'/),當使用該選項時,程序啟動后將優先到設定的path中查找所需要的動態庫。

 

3. 實例分析

下面通過一個實例:qemu仿真固件的web服務程序httpd,來分析兩者之間的不同。

(1)使用qemu+chroot方法:

該指令的含義是,

chroot ./,將當前路徑squashfs-root指定為新的根目錄;

./qemu-arm-static ./www/httpd,運行根目錄下的qemu-arm-static程序,參數為./www/httpd,即httpd程序,使用qemu仿真運行httpd程序。

但是它產生了一個報錯:/var/run/httpd.pid找不到。這是什么原因呢?

我們可以在系統的根目錄下的/var/run文件夾中找到目標文件,就是因為chroot命令將新根下的目錄結構與原系統的目錄結構隔離開了,所以導致沒有找到對應的文件。

(2)使用qemu-user -L方法:

此時路徑為/www,並且qemu-arm-static程序也復制到了該路徑下。

該指令的含義是,

-L ../,將上級目錄,即squashfs-root目錄設置為動態庫查找路徑,解決httpd程序的依賴庫的問題。

本次執行就沒有(1)中的錯誤,是因為當沒有在path中找到需要的依賴文件時,會自動去系統的相應路徑中去尋找。(請忽略其他的錯誤)

 

以上就是這兩種方法產生不同結果的原因分析,謝謝大家。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM