2018/07/11

跨平台編譯樹莓派的作業系統

摘要

本文概要介紹在Windows 10上的VMware Workstation 12 Player上跨平台編譯樹莓派2代單板電腦的Linux作業系統核心、並將映像檔寫入SD卡的步驟。

本文


欲編譯樹莓派單板電腦的Linux作業系統核心存在2種選擇,一個在是樹莓派上直接編譯核心(或稱本地編譯)、而另一個是在另外一台Linux作業系統上編譯樹莓派的核心(或稱跨平台編譯)。本文將介紹後者的作法。
留意,之所以稱為跨平台,是因為將會在個人電腦x86/x64機器上編譯樹莓派arm機器的程式碼。
這裡將使用Windows 10宿主作業系統,安裝VMware Workstation 12 Player虛擬化程式、並於VMware上執行Ubuntu MATE 16.04作業系統。當Ubuntu虛擬機啟動後,便於其上安裝編譯樹莓派核心所需的工具鏈,接著再下載樹莓派的Linux核心的原始碼,執行跨平台編譯完後,便將編譯的成果寫入SD卡,最後再將該SD卡插入樹莓派進行測試與確認。主要步驟可以參考這裡
於Ubuntu上安裝工具鏈的指令如下。
git clone https://github.com/raspberrypi/tools ~/tools
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin >> ~/.bashrc
source ~/.bashrc

於Ubuntu上下載樹莓派原始碼的指令如下。
git clone --depth=1 https://github.com/raspberrypi/linux
於Ubuntu上執行跨平台編譯的指令如下。
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

編譯完畢的範例如下所示。
在將編譯的成果寫入SD卡前,必須把宿主作業系統的SD讀卡機掛載至Ubuntu虛擬機上,可以參考這裡,在宿主機Windows的命令提示字元上查詢磁碟名稱、接著在VMware上添加一個SCSC(或IDE)的磁碟、並將前述的VMware磁碟指定至剛剛查詢到的SD讀卡機的名稱。
於Ubuntu上需先確認SD卡的分割區狀態,指令和範例如下。留意,從分割區的狀態可以推知該SD卡被分割過了,例如令sdb預先寫入2018-04-18-raspbian-stretch-lite.img映像檔。
lsblk
於Ubuntu上掛載SD卡的指令如下。
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4

於Ubuntu上安裝模組至SD卡的指令如下。
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
於Ubuntu上複製核心至SD卡、並且卸載SD卡的指令如下。
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

最後,將插入樹莓派2代的開機執行範例如下;版本是最值得留意的部份。
  

附錄

一個以2018-04-18-raspbian-stretch-lite.img開機的執行範例如下。

沒有留言:

張貼留言