如何安裝 Ubuntu Generic ISO 到 Raspberry Pi 3 上
就是官網上那個 ubuntu-18.04.3-server-arm64.iso 啦!
先強調一下 Pi4 的 BootLoader 不一樣,不適用本教學
啟用隨身碟開機
官方說明:https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md
我們要用的工具是 vcgencmd
,Raspbian 預設就有安裝,如果你使用 Ubuntu,請自己補裝一下
sudo add-apt-repository ppa:ubuntu-raspi2/ppa
sudo apt update
sudo apt install libraspberrypi-bin
檢查一下是否已經啟用了,如果已經啟用了,應該會顯示 3020000a
ubuntu@ubuntu:~$ vcgencmd otp_dump | grep 17
17:3020000a
要更改設定的話,請編輯 /boot/config.txt
,在最後一行加入 program_usb_boot_mode=1
注:這麼最會修改 OTP 記憶體,因為其特性,一經修改變無法回覆
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
Ps. 這一步建議使用 Raspbian 完成,其他 OS 的掛載方式可能不同。建議直接在電腦上編輯隨身碟第一個分割區裡面的 config.txt
。
製作安裝隨身碟
首先準備一個隨身碟,容量大約 2 GB 左右就可,要注意分割表必須要是 msdos
(也叫做 MBR
)
然後切一個分割區:
- 必須是
fat32
,標籤設為installer
,直接把 SD 卡的空間用完就好
確定一下剛才的分割區都已經確實掛載(應該會在關閉 GParted
之後自動掛載,如果沒有的話請重新插入一次隨身碟):
~ » ls /media/$(whoami)
INSTALLER
下載樹梅派基金會提供的 BootLoader
檔案
wget https://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/raspberrypi-bootloader_1.20200114-1_armhf.deb
dpkg-deb -x raspberrypi-bootloader_1.20200114-1_armhf.deb /tmp/pi-bootloader
rm raspberrypi-bootloader_1.20200114-1_armhf.deb
sudo cp -r /tmp/pi-bootloader/boot/* /media/play_pc/INSTALLER
接下來要編譯新版的 u-boot
sudo apt install build-essential bison flex git make gcc gcc-aarch64-linux-gnu
git clone --progress http://git.denx.de/u-boot.git
cd u-boot
make rpi_3_defconfig
make CROSS_COMPILE=aarch64-linux-gnu-
sudo cp u-boot.bin /media/play_pc/INSTALLER/kernel8.img
cd ..
設定使用 64bit 模式
echo 'arm_64bit=1' | sudo tee -a /media/play_pc/INSTALLER/config.txt
echo 'kernel=kernel8.img' | sudo tee -a /media/play_pc/INSTALLER/config.txt
複製 Device Tree
wget http://ports.ubuntu.com/dists/bionic/main/installer-arm64/current/images/device-tree/bcm2837-rpi-3-b.dtb
sudo mkdir -p /media/play_pc/INSTALLER/dtb/broadcom/
sudo cp bcm2837-rpi-3-b.dtb /media/play_pc/INSTALLER/dtb/broadcom
下載 Ubuntu 安裝映像檔,並複製安裝映像檔到隨身碟 Ps. 這個步驟可能會看到無法建立連結檔的訊息,不會影響之後的使用,可以忽略
wget http://cdimage.ubuntu.com/releases/18.04/release/ubuntu-18.04.3-server-arm64.iso
mkdir /tmp/arm64-iso
sudo mount -o loop ubuntu-18.04.3-server-arm64.iso /tmp/arm64-iso
sudo cp -rT /tmp/arm64-iso /media/play_pc/INSTALLER
sync
我們還需要手動複製 efi 的檔案到隨身碟
mkdir /tmp/efi-img
sudo mount -o loop /tmp/arm64-iso/boot/grub/efi.img /tmp/efi-img
sudo cp -rT /tmp/efi-img /media/play_pc/INSTALLER
確保所有檔案都寫入到隨身碟之後,解除掛載(umount
)
sync
sudo umount /tmp/efi-img
sudo umount /tmp/arm64-iso
開機
把剛才製作完成的安裝隨身碟插入 Raspberry Pi,並確認記憶卡已經清空(或格式化)就可以插入電源,準備開機了!(Ps. 有指示燈的隨身碟會比較好用)
▲ 若是你的隨身碟不被 u-boot 支援,可能會出現這樣的訊息:0 Storage Device(s) found
這時候請直接換一隻隨身碟,然後把檔案全部複製過去
▲ 然後指示燈這時候會暗掉,變成沒有通電的狀態(Ps. 圖中是 pqi U176L)
▲ 如果在 Hit any key to stop autostart
倒數完之前按任意鍵的話就可以進入 u-boot shell,這時候可以試試 usb tree
之類的指令,列出所有的 USB 裝置
▲ 若是成功的話,應該會顯示偵測到儲存裝置,並且從裡面的 efi
資料夾尋找 EFI 執行檔(本例是 GRUB2)
▲ 鏘鏘!成功載入 GRUB 了喔!
接下來請使用方向鍵上下移動,選擇 Install Ubuntu Server
並按下 <kbd>e</kbd> 編輯開機選項,調整預設的分割區設定,使用 MBR/msdos。使用 Kernel Parameter 的方式,把這個參數傳遞給安裝工具。
partman-partitioning/default_label=msdos
▲ 改完之後大概像這樣,完成之後,按下 <kbd>Ctrl</kbd>+<kbd>x</kbd> 開機
安裝
▲ 安裝過程請依自己的需求設定
▲ 然後你應該會看到這個錯誤訊息,先按 Continue
跳過不管它
▲ 繼續按 Continue
跳過不管它
▲ 選擇 Continue without boot loader
跳過 GRUB 安裝,這個我們晚一點再來處理
▲ 提醒你 GRUB 沒有裝,還有開機時的 Kernel 參數
▲ 安裝精靈完成!
設定 GRUB 開機
因為安裝 GRUB 的步驟被跳過了,剛才安裝完的系統是沒辦法開機的,接下來我們要手動設定 GRUB
▲ 請不要移除你的安裝隨身碟
▲ 重新開機之後就會進入 GRUB 的指令界面,使用以下的指令開機
# 列出裝置
ls
# 選擇根目錄 (OS 在的檔案系統)
# hd0 是隨身碟,因為只有一個分割區
# 剛才在 Kernel 參數的地方有提示 root 在 mmcblk0p5(第五個分割區)
set root=(hd1,msdos5)
# 確認一下根目錄有哪些東西
ls /
# 設定 Kernel 路徑,和 Kernel 參數
linux /boot/vmlinuz root=/dev/mmcblk0p5 ro
# 設定 initrd 路徑
initrd /boot/initrd.img
# 開機
boot
▲ 然後應該就能登入了
▲ 安裝 GRUB,請參考以下指令
# 使用 --no-nvram 模式安裝 GRUB
sudo grub-install --no-nvram
# 套用預設的 GRUB 選項
sudo update-grub
# 關機
sudo poweroff
▲ 使用 GParted
編輯記憶卡,對第一個分割區按右鍵,選擇 管理旗標
▲ 取消選取 esp
標籤,按下 關閉
▲ 記得從安裝隨身碟把 BootLoader 複製進記憶卡的第一個分割區
最後,進入系統之後記得移除 flash-kernel
套件,他是用來管理 Raspberry Pi 專用映像檔的 boot
分割區的工具
# 移除 flash-kernel
sudo apt remove flash-kernel
# 避免更新時自動安裝
sudo apt-mark hold flash-kernel
收工!!
原理解釋
首先是為什麼沒辦法用官方的 iso
檔來開機的原因。這是因為一般完整的主機,都是使用 BIOS
或 UEFI
來完成開機時初始化的工作,這麼做有一個好處,就是可以讓作業系統跟硬體之間多一些相容性。試想,如果每種主流硬體都需要客製化一組 OS 設定,那可能會像 Android 手機一樣永遠不能更新最新版(注:Android 不能更新是因為其他原因)… Anyway,BIOS
和 UEFI
雖然作法不盡相同,但都提供一個通用的界面,讓 OS 可以更加容易的找到所需的資源。
BIOS
– 中斷向量表(Interrupt Vector Table)UEFI
– EFI driver
但是,在嵌入式系統的環境下,這種奢侈的功能經常是不存在的… 好在,目前常見的作法是先用 SoC 提供的方式開機,然後再交給 u-boot
來負責接下來的開機流程。
好消息是,在大約 2017 年的時候,一組 SUSE 的開發者提出了一個新的實做,可以讓 u-boot 模擬 EFI 的功能。
也就是說,如果你手上的硬體有被 Linux 支援的話,透過這個新功能,是可以直接安裝一般的 Linux 的。於是我們手上的 Raspberry Pi 就這麼得到了 Ubuntu Server 版的支援了(灑花)