利用 QEMU 安裝 Ubuntu ARM64 與 miniconda

在以往的文章裡,已經有介紹過使用 QEMU + Buildroot 來建立 ARM64 的環境來加速開發。這個方式可以順利的建立一個小環境,來測試開發的程式。但畢竟不是一個完整的 Linux 發行版,比起一般的 Ubuntu 還是缺了不少東西,例如 gcc。

之所以要在 ARM64 編譯東西, 是想要把 python3 移植到產品上。但 python 的一大優點就是已經有很多人已經編譯好或整理好的套件,不用再一個一個重編。單用buildroot的環境來做這些事,我一時也是手足無措。於是就想到在 ARM64 Linux 裡,用 pip 把東西裝好,再一整個打包放到 target 上不就好了!

而且還真的可行~

本文是以 QEMU 來運行 Ubuntu 20.04 ARM64,再搭配 miniconda 使用 python3.7 (配合target的python版),將環境建立起來並安裝套件。

QEMU 安裝 Ubuntu ARM64

下載 ISO 檔案

首先要下載 Ubuntu 的 ARM64 ISO 檔,上網找 “ubuntu arm64 iso download” 應該就可以找到相關的訊息。可能會有樹莓派版, server-live 版…之類的。 http://old-releases.ubuntu.com/releases/ 有比較齊全的整理,列出所有的版本,和不同平台的檔案。

不過上面網站下載到的,上面網站下載的是有 “live-server” 字樣的,聽起來不太舒服,所以我就沒下載了。下面是 legacy 的版本所在,https://cdimage.ubuntu.com/ubuntu-legacy-server/releases/20.04/release/。最後我下載的檔案是 ubuntu-20.04.1-legacy-server-arm64.iso

安裝套件與產生 image 檔案

因為一般QEMU ARM64 都是直接指定 kernel 的,並不懂 ARM64 PC 是怎麼安裝系統的,下面的內容是參考了這篇文章

首先安裝套件

接著下達以下面命令,來建立2個當做flash的區塊。其中第一個 (flash0.img),寫入了剛安裝套件裡含的 QEMU_EFI image。

然後用 qemu-img 來建立系統磁碟。這邊我們用的是 raw 格式,而非 qcow2。這樣方便把建立好的環境搬到 windows 上使用。

開始安裝

最後用下面命令啟動 QEMU 並指定 flash, 硬碟與ISO檔位置,來進行安裝。

接下來的流程就跟一般 x86 的 Linux 相同差不多了。由於是跨平台模擬,速度是蠻慢的,請大家要有耐心等待~

安裝完後, 將第4行刪除,以免從 ISO 開機又進入安裝流程.

進到 ARM64 Linux 後,需要安裝 gcc 套件,才能在pip時編譯原始碼。

 

安裝 miniconda

前頭有講到,會使用 ARM64 Linux 是為了直接把 binary files 移到 target 上執行。這邊我用的是 miniconda python3.7 4.9.2 , 其它版本都可以在這邊找到 https://repo.anaconda.com/miniconda/.

由於 python 各版本間的相容性是依照版號的前2位決定的,所以若要進行類似的動作,記得要挑對版本。例如 3.7.5 跟 3.7 是相容的,但跟 3.6 or 3.8 就不行。

conda 內安裝套件

由於 Ubuntu ARM64 並不在官方的支援項目內,所以是一種有bug也不一定會解的狀態,但一般操作似忽還好。只是在用 conda 時會碰到程式當掉的問題 (像是 illegal instruction),這可能是因為不同 ARM64 CPU 的指令集關係或其它不明的問題。

這版的 miniconda 安裝後的 base 環境是操作正常的,可以用 pip 正常安裝套件。但若是新 create 出來的環境,則一執行 pip 就會掛掉。我記得試過其它版本也有類似的問題,是上網找到說這版勉強可以用。剛好我也只是要搜集套件,所以符合需求。所以就用 base 安裝就好了.

收集套件

趁著這次的機會,也才知道 .whl 檔的安裝行為,大致就是解壓後的東西放進 $CONDA/lib/python3.x/site-packages/,如果你有一些套件想強迫安裝可以這樣做。$CONDA/lib/python3.x/lib-dynload/ 也會包含安裝時的一些檔案,但不確定是否跟直接解壓縮有所不同。這邊的目錄是指直接用 base 環境安裝,若是有 create env,就是在 $CONDA/envs 裡。

在新建環境或重安裝 conda 後,安裝你想要的套件。最後把 $CONDA/lib/python3.x 這目錄打包起來,覆概target上相對目錄的 python 3.7 環境,就可以了。

我安裝了 streamlit 的套件,會額外下載很多東西,大概會佔用 355M。可以再進行一些 strip, 刪除 test/ 檔案之類的減肥,但效果不是很顯著。用 squashfs xz 打包後大概是 80MB.

 

其它

由於有些套件也需要重新編譯,所以在挑選安裝的 ARM64 Linux 版本時,最好裡面的 gcc 也是低於 target gcc 的版號,這樣可以避免 library 不相容的問題。至於要怎麼知道裡面是哪一版的 gcc, 還是要裝裝看才知道了。

 

Leave a Reply(Name請以user_開頭,否則會被判定會垃圾息)

請輸入答案 + 7 = 17