混合部署的从核启停依赖 uefi 第三方固件支持 psci 标准实现,本文介绍如何使树莓派 4b 支持 uefi,并可通过 sd 卡或网络启动 openeuler embedded。
使用 openeuler embedded uefi+grub 的树莓派镜像
openeuler embedded 的树莓派镜像集成了基于树梅派 4b 的混合部署环境依赖,因此建议直接使用 openeuler embedded uefi+grub 的树莓派镜像,该镜像对齐 tiny 镜像的软件包配置,并集成 openssh 支持网络登录、混合部署 mcs 依赖库及混合部署 mcs 预留内存 mcsmem dtoverlay。
构建树梅派 openeuler-image-uefi 镜像和烧录
分支支持要求:openeuler-22.09 及之后的主线 master 分支。
环境准备流程参考前期发布的《openeuler embedded 对树莓派 4b 的支持》内构建指导部分。
构建命令示例:
su openeulersource /usr1/openeuler/src/yocto-meta-openeuler/scripts/compile.sh raspberrypi4-64 /usr1/openeuler/src/build/build-raspberrypi4-64/bitbake openeuler-image-uefi
构建镜像生成示例:
openeuler-image-uefi-raspberrypi4-64-*.rootfs.rpi-sdimg
将 openeuler-image-uefi-raspberrypi4-64-*.rpi-sdimg 烧录到 sd 卡。
openeuler 烧录参考《openeuler embedded 对树莓派 4b 的支持》内镜像使用方法部分。
openeuler-image-uefi 启动使用指导
「步骤 1」:烧录后首次启动需修改 uefi 配置,启动阶段按 esc 进入 uefi,按下图操作解锁 3g 内存限制并关闭 acpi 选用 devicetree,保存重启后再操作步骤 2。
「步骤 2」:更改 boot order 或手动选择 sd 卡启动,如下,最后选择 commit changes and exit。
「步骤 3」:启动
「注意:」
此 uefi 版本的固件默认使用 3g 内存 limit,可以在 uefi 菜单中关闭 3g limit,否则系统启动后你看到的内存只有 3g(参考官方配置说明:https://github.com/pftf/rpi4/ )。
该版本 uefi+acpi 部署方法有缺陷(hdmi 驱动异常),首次使用必须进入 uefi 菜单,使用 devicetree 模式。
手动刷新固件使树莓派 4b 支持 uefi 引导
环境/工具准备
编译工具链:可用 openeuler embedded 的交叉编译工具链,参考https://docs.openeuler.org/zh/docs/22.03_lts/docs/embedded/sdk 应用开发.html。
设备:建议树莓派 4b 的出厂配置,包括树莓派 4b 基础套件和 sd 卡。
openeuler embedded 标准镜像 + uefi 固件下载和刷新方法
1 将 openeuler embedded 树莓派镜像烧录到 sd 卡
如何获得 openeuler embedded 树莓派镜像,参考前期发布的《openeuler embedded 对树莓派 4b 的支持》。
# 假设镜像名 openeuler-image-raspberrypi4-64.rootfs.rpi-sdimg,sd卡识别为/dev/sda (linux环境)sudo dd bs=4m if=openeuler-image-raspberrypi4-64.rootfs.rpi-sdimg of=/dev/sda
烧录完成后,将 sd 卡(boot 盘)根目录的 kernel8.img 文件压缩成 image.gz:
# boot分区可能已经满了,移出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 内存解锁和关闭 acpi 使能 devicetree 请参考上述“openeuler-image-uefi 启动使用指导”章节
kernel8.img 不再需要,请务必删除,否则将影响启动。
3 制作 grub 并选择启动方式
sd 卡启动参考本文章节:树莓派 uefi 之手动制作 grub 并通过 sd 卡启动 openeuler embedded
网络卡启动参考本文章节:树莓派 uefi 之手动制作 grub 并通过网络启动 openeuler embedded
树莓派 uefi 之手动制作 grub 并通过 sd 卡启动 openeuler embedded
grub 准备(编译+制作 grub 启动组件)
「grub 源码获取」
下载地址:https://github.com/coreos/grub/releases/tag/grub-2.02
「grub 组件编译」
解压源码包并进入根目录,准备开始构建 arm64-efi(交叉编译)的 grub 库,注意此时交叉编译工具已经配置完毕,按如下步骤执行:
./autogen.sh./configure --prefix=/xxx/grub-2.02/build --with-platform=efi --disable-werror --target=aarch64-openeuler-linux-gnumake
构建成功后,在当前目录会生成对应的二进制和 grub 组件依赖库,其中 grub-core 即制作 grub-efi 需要的工具库,grub-mkimage 即制作板子 grub.efi 引导的 host-tool。
「制作引导程序」
接下来制作板子引导 grub 程序,下例输出名为 bootaa64.efi,生成后请放置到 sd 卡 boot 分区的对应目录(/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 示例内容如下(后面是 cmdline 内容,linux gz 压缩的内核,使用 sd 卡分区,不需要 initrd):
insmod gzioset timeout=0menuentry '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}
「说明:」
上述内容需配合 openeuler embedded 构建的树莓派镜像,并在 uefi 非 acpi(devicetree)下使用,dtb 使用 openeuler embedded 镜像中的内容。其中 image.gz 即内核 image 的 gzip 压缩,可通过gzip -c kernel8.img > image.gz获得(若使用 openeuler embedded 镜像),kernel8.img 不再需要,请务必删除,否则将影响启动。
树莓派 uefi 之手动制作 grub 并通过网络启动 openeuler embedded
1 准备 pxe 部署服务器
以 ubunutu 14.04 为例,dhcp 中指定的 filename 就是 grub 的 efi 引导文件名。
假设服务器网段为 192.168.10.x,服务器 ip 为 192.168.10.1,网卡 eth0 用于 dhcp 服务,初始化服务器 ip 示例:
sudo ifconfig eth0 192.168.10.1 up
2 使能 dhcp 服务
安装 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服务器ip,pxe必须,httpboot可选option broadcast-address 192.168.10.255;}
配置 dhcp 服务网络接口,编辑文件/etc/default/isc-dhcp-server增加/修改字段:
interfaces=”eth0” #dhcp使用的网卡
启动 dhcp 服务:
sudo /etc/init.d/isc-dhcp-server restart
3 使能 tftp 服务
安装 tftp 服务器软件:
sudo apt-get install tftpd-hpa
配置 tftp 服务,编辑/etc/default/tftpd-hpa文件,例如:
tftp_username=tftptftp_address=:69tftp_directory=/var/lib/tftpboot/tftp_options=--secure -l -c -s
启动 tftp 服务:
sudo /etc/init.d/tftpd-hpa restart
4 grub 准备(编译+制作 grub 启动组件)
「grub 源码获取」
下载地址:https://github.com/coreos/grub/releases/tag/grub-2.02
「grub 组件编译」
解压源码包并进入根目录,准备开始构建 arm64-efi(交叉编译)的 grub 库,注意此时交叉编译工具已经配置完毕,按如下步骤执行:
./autogen.sh./configure --prefix=/xxx/grub-2.02/build --with-platform=efi --disable-werror --target=aarch64-openeuler-linux-gnumake
构建成功后,在当前目录会生成对应的二进制和 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 网络启动即可,grub.cfg 示例内容如下(image.gz 后面是 cmdline 内容,linux gz 压缩的内核,initrd 文件系统):
insmod gzioset timeout=0menuentry '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}
附:网络启动时内核 image.gz 和文件系统 initrd 的来源说明
文件系统例子
若使用网络启动,可使用 openeuler embedded 构建的标准树梅派镜像构建过程中的 rootfs 并手动打包,也可使用 openeuler embedded 发布的 qemu-aarch64 参考文件系统 (https://repo.openeuler.org/openeuler-22.03-lts/embedded_img/arm64/aarch64-std/openeuler-image-qemu-aarch64-20220331025547.rootfs.cpio.gz)
手动打包 rootfs 例子(预先需准备 openeuler embedded 树梅派已构建完成的环境):
# 假设已经处于构建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即为所需文件系统
「说明:」
配置文件系统/etc/inittab 时注意 getty 登录时串口重定向要配置正确,否则可能没有打印。(树莓派 4b 硬件串口 pl011 对应,引脚 14txd 和 15rxd)
内核例子
若使用网络启动,可使用 openeuler embedded 构建的标准树梅派镜像中的 kernel8.img,格式即 image,然后通过 gzip 压缩为 image.gz 格式。
内核单独编译例子(openeuler)
参考 openeuler 树莓派交叉编译内核 :https://gitee.com/openeuler/raspberrypi/blob/master/documents/交叉编译内核.md
「注意:」
若使用上述 uefi+acpi 部署方法,必须在 config 中开启 acpi 系列功能支持。在make menuconfig arch=arm64菜单中,选中 acpi 默认系列支持。建议在 uefi 中关闭 acpi 选用 devicetree(参考 openeuler-image-uefi 启动使用指导相关配置)。
编译生成的 image,在上述 efi 配置下,grub.cfg 的 linux 格式需使用 gz 命令压缩成 image.gz。
操作说明
将上述内核和文件系统,放在 tftp 服务目录(/var/lib/tftpboot)下即可进行网络启动。
网络启动基本流程如下:
dhcp 服务器给单板分配 ip
单板启动 uefi 选择 pxe 启动
pxe 根据 dhcp 的 filename 和 tftp 服务器地址,从 tftp 服务器下载 mygrub.efi
进入 grub 引导程序,根据 grub.cfg 配置,从对应 tftp 目录下载文件系统和内核并加载启动
其中,使用的 acpi 资源表/dtb 是 uefi 固件初始化好的(引导内核前已放在对应内存),不过 cmdline/bootargs 可通过 grub.cfg 进行配置,在加载内核时,grub 会传递给 uefi 并上报给系统。
沃尔玛正测试无接触配送服务
精谱测控保护薄膜瑕疵检测设备的特点是什么
产品创新 I OMNIS – 如何在汽车领域应对当今和未来的多物理场仿真挑战?
如何在晶心平台上建立Linux基础架构?
万用表的操作方法和安全规程
如何使树莓派 4B 支持 UEFI
国外战术导弹半实物仿真试验验证能力发展分析
SOLIDWORKS Flow Simulation流体分析软件
从iPhone拆解看智能手机的演进史
承拓电子加入深圳市汽车电子行业协会
理工科的你能猜出来霍金的轮椅价值吗?
Arm全新AI技术为物联网终端设备带来了空前智能
理解电池充电器功能与充电拓扑结构
英特尔“热”量子位技术取得进展,量子计算机更近一步
3D打印压感触控板Sensel诞生
TBS1000系列示波器的性能特点及应用范围
使用物联网网关的好处
美国公司表示人脸支付不安全马云和马化腾是怎么回复的
华为三屏双折叠智能手机设计专利曝光
极狐发力,北汽蓝谷2023大提速