這裡的使用場景是在ubuntu x64上編譯arm程式,需要一個開發環境,而最省心的方式就是自己做一個arm環境的chroot鏡像,然後自由用apt-get安裝依賴,然後編譯程式。所以這裡就以製作arm鏡像為例。 在我們開始之前,我們需要瞭解一下ARM的幾種架構: armel(abi):這個是老架構 ...
這裡的使用場景是在ubuntu x64上編譯arm程式,需要一個開發環境,而最省心的方式就是自己做一個arm環境的chroot鏡像,然後自由用apt-get安裝依賴,然後編譯程式。所以這裡就以製作arm鏡像為例。
在我們開始之前,我們需要瞭解一下ARM的幾種架構:
armel(abi):這個是老架構,之前的arm硬體沒有浮點處理單元,所以採用軟體模擬的方式進行浮點計算,相容新架構
armhf:這個是新架構,有了獨立的硬體浮點處理單元,這個不相容老架構
arm64:這個就直接用了新架構,沒有el和hf之分了
kernel、rootfs和app編譯的時候,指定的必須保持一致才行
1、首先我們需要安裝相關程式來支持chroot環境
sudo apt-get install qemu-user-static
如果你有現成的鏡像,那麼只需要安裝這個就行了,然後你就可以chroot進去了
2、接著我們需要安裝製作鏡像所需要的工具環境
sudo apt-get install binfmt-support debootstrap qemu
這裡最主要是這個debootstrap,另外兩個看著辦
3、然後我們利用debootstrap來製作鏡像
首先我們建立一個文件夾
sudo mkdir /opt/ubuntu-arm-64
然後我們運行debootstrap來聯網下載對應的ubuntu版本基礎鏡像來製作我們的鏡像
debootstrap --arch=arm64 --foreign trusty /opt/ubuntu-arm-64 http://ports.ubuntu.com/
這裡的trusty是ubuntu 14.04的版本代號,關於debootstrap支持的版本代號,可以在debootstrap的腳本目錄下查看,路徑為 /usr/share/debootstrap/scripts/
這下麵有很多以ubuntu代號命名的文件
4、接著我們就等待3的操作完成,然後拷貝qemu-aarch64-static 到我們鏡像的bin目錄
cp /usr/bin/qemu-aarch64-static /opt/ubuntu-arm-64/usr/bin/
這裡要註意了,是aarch64,如果你是armhf環境,那麼請使用【qemu-arm-static】接著我們chroot進去
sudo chroot /opt/ubuntu-arm-64
這一步的時候,你可能會遇到 "i have no name" 的情況,不要急,我們來利用debootstrap對我們的鏡像進行初始化操作
debootstrap/debootstrap --second-stage
如果沒找到debootstrap腳本,那麼請檢查步驟3中遇到的錯誤,可能是mount proc失敗。
然後等待初始化完成,你就會發現一切ok了。
5、接著我們來編輯apt的源,方便我們安裝其他依賴
deb http://ports.ubuntu.com/ trusty main restricted universe multiverse
deb-src http://ports.ubuntu.com/ trusty main restricted universe multiverse
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe
這裡的trusty根據你版本的不同,可以換
6、接著就是關於chroot掛載真實系統設備到我們的虛擬系統,這個需要在chroot之前調用掛載,作用是比如你想多線程編譯 make -j4
那麼你就需要運行下麵的腳本,掛載設備
#!/bin/bash
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/
參考:
http://www.360doc.com/showweb/0/0/804170657.aspx
https://wiki.debian.org/EmDebian/CrossDebootstrap
https://linux.cn/article-4936-1.html