前置作業

準備一 USB 3.0 的存儲設備(建議先上網查詢不同控制器之相容性)

  • 使用 USB 2.0 也可
  • 若使用 SSD 外接盒,支援 TRIM 者爲佳
  • 使用 USB 3.0 之設備,將干擾 2.4 GHz 無線信號(如 b/g/n WiFi)

先於 SD 卡安裝官方之 Raspberry Pi OS,再以常規方式開機並開啟終端機,將系統更新至最新

sh
1
2
sudo apt update
sudo apt full-upgrade

韌體更新

將樹莓派 4 的 eeprom 韌體更新至最新 (雖然目前出廠的應該已經更新過,或許無須此步驟)

sh
1
sudo nano /etc/default/rpi-eeprom-update

FIRMWARE_RELEASE_STATUS 的值從 critical 改爲 stable

nano 文字編輯器退出並保存方式
按下 CTRL+X,再按 Y 保存,按 ENTER 確認檔案名稱

輸入下面指令更新韌體

sh
1
sudo rpi-eeprom-update -d -a

重新開機並開啓終端機,輸入如下指令檢查韌體版本

sh
1
vcgencmd bootloader_version

建立 Ubuntu 安裝裝置並轉移至 USB 存儲裝置

下載 Ubuntu Server 20.04 映像檔,並使用如 Etcher 等軟體寫入至存儲設備中
掛載剛寫入之 system-boot 分割區,並開啓終端機並切換至 system-boot 之目錄下
將 vmlinuz 展開至 vmlinux

sh
1
zcat vmlinuz > vmlinux

開啓 config.txt 並將 [pi4] 部分修改如下

plaintext
1
2
3
4
5
6
[pi4]
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

於目錄下新建一文檔,命名爲 auto_decompress_kernel,內容如下

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/bash -e

#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux

#Check if compression needs to be done.
if [ -e $BTPATH/check.md5 ]; then
if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
exit 0
else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
fi
fi

#Backup the old decompressed kernel
mv $DKPATH $DKPATH.bak

if [ ! $? == 0 ]; then
echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
exit 1
else echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi

#Decompress the new kernel
echo "Decompressing kernel: "$CKPATH".............."

zcat $CKPATH > $DKPATH

if [ ! $? == 0 ]; then
echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
exit 1
else
echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi

#Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5

if [ ! $? == 0 ]; then
echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
else echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi

#Exit
exit 0

於終端機執行如下指令,將 auto_decompress_kernel 之權限設爲可執行檔

sh
1
sudo chmod +x auto_decompress_kernel

前往 https://github.com/raspberrypi/firmware/tree/master/boot 下載 boot 資料夾,將資料夾中所有 .elf.dat 檔案完全拷貝至 system-boot 目錄下,並覆寫原有檔案
將樹莓派關機,移除 SD 卡後以 USB 開機
以 USB 開機後,Ubuntu Server 20.04 將完成首次開機設定,依照提示登入並修改密碼
※ 此時千萬不可進行系統更新!!!

設定 DPKG 後置動作

新增 999_decompress_rpi_kernel 至 apt 設定檔資料夾

sh
1
sudo nano /etc/apt/apt.conf.d/999_decompress_rpi_kernel

於文字編輯器內填入

bash
1
DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };

更新權限

sh
1
sudo chmod +x /etc/apt/apt.conf.d/999_decompress_rpi_kernel

此時即可開始正常使用 Ubuntu Server 進行各項操作

參考資料:

封面圖片來源: