混合部署的從核啟停依賴 UEFI 第三方固件支持 PSCI 標準實現(xiàn),本文介紹如何使樹莓派 4B 支持 UEFI,并可通過 SD 卡或網(wǎng)絡(luò)啟動 openEuler Embedded。
使用 openEuler Embedded UEFI+GRUB 的樹莓派鏡像
openEuler Embedded 的樹莓派鏡像集成了基于樹梅派 4B 的混合部署環(huán)境依賴,因此建議直接使用 openEuler Embedded UEFI+GRUB 的樹莓派鏡像,該鏡像對齊 tiny 鏡像的軟件包配置,并集成 openssh 支持網(wǎng)絡(luò)登錄、混合部署 mcs 依賴庫及混合部署 mcs 預留內(nèi)存 mcsmem dtoverlay。
構(gòu)建樹梅派 openeuler-image-uefi 鏡像和燒錄
分支支持要求:openEuler-22.09 及之后的主線 master 分支。
環(huán)境準備流程參考前期發(fā)布的《openEuler Embedded 對樹莓派 4B 的支持》內(nèi)構(gòu)建指導部分。
構(gòu)建命令示例:
su openeulersource /usr1/openeuler/src/yocto-meta-openeuler/scripts/compile.sh raspberrypi4-64 /usr1/openeuler/src/build/build-raspberrypi4-64/bitbake openeuler-image-uefi
構(gòu)建鏡像生成示例:
openeuler-image-uefi-raspberrypi4-64-*.rootfs.rpi-sdimg
將 openeuler-image-uefi-raspberrypi4-64-*.rpi-sdimg 燒錄到 SD 卡。
openEuler 燒錄參考《openEuler Embedded 對樹莓派 4B 的支持》內(nèi)鏡像使用方法部分。
openeuler-image-uefi 啟動使用指導
「步驟 1」:燒錄后首次啟動需修改 UEFI 配置,啟動階段按 ESC 進入 UEFI,按下圖操作解鎖 3G 內(nèi)存限制并關(guān)閉 ACPI 選用 DEVICETREE,保存重啟后再操作步驟 2。
「步驟 2」:更改 boot order 或手動選擇 SD 卡啟動,如下,最后選擇 Commit Changes and Exit。
「步驟 3」:啟動
「注意:」
此 UEFI 版本的固件默認使用 3G 內(nèi)存 limit,可以在 UEFI 菜單中關(guān)閉 3G limit,否則系統(tǒng)啟動后你看到的內(nèi)存只有 3G(參考官方配置說明:https://github.com/pftf/RPi4/ )。
該版本 UEFI+ACPI 部署方法有缺陷(HDMI 驅(qū)動異常),首次使用必須進入 UEFI 菜單,使用 DEVICETREE 模式。
手動刷新固件使樹莓派 4B 支持 UEFI 引導
環(huán)境/工具準備
編譯工具鏈:可用 openEuler Embedded 的交叉編譯工具鏈,參考https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Embedded/SDK 應(yīng)用開發(fā).html。
設(shè)備:建議樹莓派 4B 的出廠配置,包括樹莓派 4B 基礎(chǔ)套件和 SD 卡。
openEuler Embedded 標準鏡像 + UEFI 固件下載和刷新方法
1 將 openEuler Embedded 樹莓派鏡像燒錄到 SD 卡
如何獲得 openEuler Embedded 樹莓派鏡像,參考前期發(fā)布的《openEuler Embedded 對樹莓派 4B 的支持》。
# 假設(shè)鏡像名 openeuler-image-raspberrypi4-64.rootfs.rpi-sdimg,SD卡識別為/dev/sda (linux環(huán)境)sudo dd bs=4M if=openeuler-image-raspberrypi4-64.rootfs.rpi-sdimg of=/dev/sda
燒錄完成后,將 SD 卡(boot 盤)根目錄的 kernel8.img 文件壓縮成 Image.gz:
# boot分區(qū)可能已經(jīng)滿了,移出kernel8.img再操作mv SDbootVolumes/kernel8.img /tmp/Imagegzip -c /tmp/Image > SDbootVolumes/Image.gz
2 下載樹莓派 UEFI 固件
以 v1.33 版本為例,通過https://github.com/pftf/RPi4/releases/download/v1.33/RPi4_UEFI_Firmware_v1.33.zip下載樹莓派 UEFI 固件,下載固件后解壓,將除了bcm2711-rpi-4-b.dtb之外的所有文件拷貝到 SD 卡(boot 盤)根目錄(覆蓋之前的文件):
# 備份bcm2711-rpi-4-b.dtbcp SDbootVolumes/bcm2711-rpi-4-b.dtb /bakdir/bcm2711-rpi-4-b.dtbcp -rf /xxx/RPi4_UEFI_Firmware_v1.33/* SDbootVolumes/# 恢復使用備份的openEuler Embedded的dtbcp /bakdir/bcm2711-rpi-4-b.dtb SDbootVolumes/
「注意:」
3G 內(nèi)存解鎖和關(guān)閉 ACPI 使能 DEVICETREE 請參考上述“openeuler-image-uefi 啟動使用指導”章節(jié)
kernel8.img 不再需要,請務(wù)必刪除,否則將影響啟動。
3 制作 grub 并選擇啟動方式
SD 卡啟動參考本文章節(jié):樹莓派 UEFI 之手動制作 grub 并通過 SD 卡啟動 openEuler Embedded
網(wǎng)絡(luò)卡啟動參考本文章節(jié):樹莓派 UEFI 之手動制作 grub 并通過網(wǎng)絡(luò)啟動 openEuler Embedded
樹莓派 UEFI 之手動制作 grub 并通過 SD 卡啟動 openEuler Embedded
grub 準備(編譯+制作 grub 啟動組件)
「grub 源碼獲取」
下載地址:https://github.com/coreos/grub/releases/tag/grub-2.02
「grub 組件編譯」
解壓源碼包并進入根目錄,準備開始構(gòu)建 arm64-efi(交叉編譯)的 grub 庫,注意此時交叉編譯工具已經(jīng)配置完畢,按如下步驟執(zhí)行:
./autogen.sh./configure --prefix=/xxx/grub-2.02/build --with-platform=efi --disable-werror --target=aarch64-openeuler-linux-gnumake
構(gòu)建成功后,在當前目錄會生成對應(yīng)的二進制和 grub 組件依賴庫,其中 grub-core 即制作 grub-efi 需要的工具庫,grub-mkimage 即制作板子 grub.efi 引導的 host-tool。
「制作引導程序」
接下來制作板子引導 grub 程序,下例輸出名為 bootaa64.efi,生成后請放置到 SD 卡 boot 分區(qū)的對應(yīng)目錄(/EFI/BOOT/bootaa64.efi):
./grub-mkimage -d ./grub-core -O arm64-efi -o bootaa64.efi -p '' ls grub-core/*.mod | cut -d "." -f 1mkdir -p SDbootVolumes/EFI/BOOTcp ./bootaa64.efi SDbootVolumes/EFI/BOOT/
「說明:」
xxxxx 目錄中請不要帶“.”,否則請適配上述語法。
「制作引導配置文件」
最后,編輯 grub.cfg 配置文件,grub.cfg 配置文件同 bootaa64.efi 放在一起(/EFI/BOOT/grub.cfg),就緒后在 UEFI 菜單中選擇 SD 卡啟動即可。grub.cfg 示例內(nèi)容如下(后面是 cmdline 內(nèi)容,linux gz 壓縮的內(nèi)核,使用 SD 卡分區(qū),不需要 initrd):
insmod gzioset timeout=0 menuentry 'Start OpenEuler' {echo "openEuler test."linux /Image.gz coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=1824 bcm2708_fb.fbheight=984 bcm2708_fb.fbswap=1 smsc95xx.macaddr=E401E2:E2 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 console=tty1 console=ttyS0,115200 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait}
「說明:」
上述內(nèi)容需配合 openEuler Embedded 構(gòu)建的樹莓派鏡像,并在 UEFI 非 ACPI(DEVICETREE)下使用,dtb 使用 openEuler Embedded 鏡像中的內(nèi)容。其中 Image.gz 即內(nèi)核 Image 的 gzip 壓縮,可通過gzip -c kernel8.img > Image.gz獲得(若使用 openEuler Embedded 鏡像),kernel8.img 不再需要,請務(wù)必刪除,否則將影響啟動。
樹莓派 UEFI 之手動制作 grub 并通過網(wǎng)絡(luò)啟動 openEuler Embedded
1 準備 PXE 部署服務(wù)器
以 ubunutu 14.04 為例,dhcp 中指定的 filename 就是 grub 的 efi 引導文件名。
假設(shè)服務(wù)器網(wǎng)段為 192.168.10.x,服務(wù)器 IP 為 192.168.10.1,網(wǎng)卡 eth0 用于 dhcp 服務(wù),初始化服務(wù)器 IP 示例:
sudo ifconfig eth0 192.168.10.1 up
2 使能 DHCP 服務(wù)
安裝 DHCP 軟件:
sudo apt-get install isc-dhcp-server
編輯/etc/dhcp/dhcpd.conf 文件,例如:
allow booting;allow bootp;option domain-name "example.org";default-lease-time 600;max-lease-time 7200;ddns-update-style none; subnet 192.168.10.0 netmask 255.255.255.0 {range 192.168.10.100 192.168.10.200;filename "mygrub.efi"; #默認下載的grub文件名,和3中制作的efi引導程序名字需匹配option routers 192.168.10.1;next-server 192.168.10.1; #tftp服務(wù)器IP,PXE必須,HTTPBOOT可選option broadcast-address 192.168.10.255;}
配置 DHCP 服務(wù)網(wǎng)絡(luò)接口,編輯文件/etc/default/isc-dhcp-server增加/修改字段:
INTERFACES=”eth0” #dhcp使用的網(wǎng)卡
啟動 DHCP 服務(wù):
sudo /etc/init.d/isc-dhcp-server restart
3 使能 TFTP 服務(wù)
安裝 TFTP 服務(wù)器軟件:
sudo apt-get install tftpd-hpa
配置 TFTP 服務(wù),編輯/etc/default/tftpd-hpa文件,例如:
TFTP_USERNAME="tftp"TFTP_ADDRESS=":69"TFTP_DIRECTORY="/var/lib/tftpboot/"TFTP_OPTIONS="--secure -l -c -s"
啟動 TFTP 服務(wù):
sudo /etc/init.d/tftpd-hpa restart
4 grub 準備(編譯+制作 grub 啟動組件)
「grub 源碼獲取」
下載地址:https://github.com/coreos/grub/releases/tag/grub-2.02
「grub 組件編譯」
解壓源碼包并進入根目錄,準備開始構(gòu)建 arm64-efi(交叉編譯)的 grub 庫,注意此時交叉編譯工具已經(jīng)配置完畢,按如下步驟執(zhí)行:
./autogen.sh./configure --prefix=/xxx/grub-2.02/build --with-platform=efi --disable-werror --target=aarch64-openeuler-linux-gnumake
構(gòu)建成功后,在當前目錄會生成對應(yīng)的二進制和 grub 組件依賴庫,其中,grub-core 即制作 grub-efi 需要的工具庫,grub-mkimage 即制作板子 grub.efi 引導的 host-tool。
「制作引導程序」
接下來制作板子引導 grub 程序,下例輸出名為 mygrub.efi:
./grub-mkimage -d ./grub-core -O arm64-efi -o mygrub.efi -p '' ls grub-core/*.mod | cut -d "." -f 1
「說明:」
xxxxx 目錄中請不要帶“.“,否則請適配上述語法。
「制作引導配置文件」
最后,編輯 grub.cfg 配置文件,grub.cfg 配置文件放在 tftp 的根目錄(/var/lib/tftpboot/grub.cfg),就緒后在 UEFI 菜單中選擇 IPV4 網(wǎng)絡(luò)啟動即可,grub.cfg 示例內(nèi)容如下(Image.gz 后面是 cmdline 內(nèi)容,linux gz 壓縮的內(nèi)核,initrd 文件系統(tǒng)):
insmod gzioset timeout=0 menuentry 'Start OpenEuler' {echo "openEuler test."linux /Image.gz coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=1824 bcm2708_fb.fbheight=984 bcm2708_fb.fbswap=1 smsc95xx.macaddr=E401E2:E2 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 dwc_otg.lpm_enable=0 console=tty1 console=ttyS0,115200 console=ttyAMA0,115200initrd /initrd.cpio.gz}
附:網(wǎng)絡(luò)啟動時內(nèi)核 Image.gz 和文件系統(tǒng) initrd 的來源說明
文件系統(tǒng)例子
若使用網(wǎng)絡(luò)啟動,可使用 openEuler Embedded 構(gòu)建的標準樹梅派鏡像構(gòu)建過程中的 rootfs 并手動打包,也可使用 openEuler Embedded 發(fā)布的 qemu-aarch64 參考文件系統(tǒng) (https://repo.openeuler.org/openEuler-22.03-LTS/embedded_img/arm64/aarch64-std/openeuler-image-qemu-aarch64-20220331025547.rootfs.cpio.gz)
手動打包 rootfs 例子(預先需準備 openEuler Embedded 樹梅派已構(gòu)建完成的環(huán)境):
# 假設(shè)已經(jīng)處于構(gòu)建build目錄cd tmp/work/raspberrypi4_64-openeuler-linux/openeuler-image/1.0-r0/rootfs/find . | cpio -H newc -o | gzip -n9c > ../initrd.cpio.gz# 生成在上層目錄的initrd.cpio.gz即為所需文件系統(tǒng)
「說明:」
配置文件系統(tǒng)/etc/inittab 時注意 getty 登錄時串口重定向要配置正確,否則可能沒有打印。(樹莓派 4B 硬件串口 PL011 對應(yīng),引腳 14TXD 和 15RXD)
內(nèi)核例子
若使用網(wǎng)絡(luò)啟動,可使用 openEuler Embedded 構(gòu)建的標準樹梅派鏡像中的 kernel8.img,格式即 Image,然后通過 gzip 壓縮為 Image.gz 格式。
內(nèi)核單獨編譯例子(openEuler)
參考 openEuler 樹莓派交叉編譯內(nèi)核 :https://gitee.com/openeuler/raspberrypi/blob/master/documents/交叉編譯內(nèi)核.md
「注意:」
若使用上述 UEFI+ACPI 部署方法,必須在 config 中開啟 ACPI 系列功能支持。在make menuconfig ARCH=arm64菜單中,選中 ACPI 默認系列支持。建議在 UEFI 中關(guān)閉 ACPI 選用 DEVICETREE(參考 openeuler-image-uefi 啟動使用指導相關(guān)配置)。
編譯生成的 Image,在上述 efi 配置下,grub.cfg 的 Linux 格式需使用 gz 命令壓縮成 Image.gz。
操作說明
將上述內(nèi)核和文件系統(tǒng),放在 tftp 服務(wù)目錄(/var/lib/tftpboot)下即可進行網(wǎng)絡(luò)啟動。
網(wǎng)絡(luò)啟動基本流程如下:
DHCP 服務(wù)器給單板分配 IP
單板啟動 UEFI 選擇 PXE 啟動
PXE 根據(jù) DHCP 的 filename 和 tftp 服務(wù)器地址,從 tftp 服務(wù)器下載 mygrub.efi
進入 grub 引導程序,根據(jù) grub.cfg 配置,從對應(yīng) tftp 目錄下載文件系統(tǒng)和內(nèi)核并加載啟動
其中,使用的 ACPI 資源表/DTB 是 UEFI 固件初始化好的(引導內(nèi)核前已放在對應(yīng)內(nèi)存),不過 cmdline/bootargs 可通過 grub.cfg 進行配置,在加載內(nèi)核時,grub 會傳遞給 UEFI 并上報給系統(tǒng)。
-
軟件
+關(guān)注
關(guān)注
69文章
4944瀏覽量
87488 -
ACPI
+關(guān)注
關(guān)注
1文章
11瀏覽量
8955 -
鏡像
+關(guān)注
關(guān)注
0文章
164瀏覽量
10723 -
樹莓派
+關(guān)注
關(guān)注
116文章
1707瀏覽量
105632
原文標題:Embedded SIG | 樹莓派的UEFI支持和網(wǎng)絡(luò)啟動
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論