用debian原生uboot启动starfive_debian后的一些实验

(本帖原名:“用UEFI启动starfive_debian202510”,一边重复再现实验,一边完成文章,实验是有成功的,但实验中发现更简单更好的方法,所以就歪了方向,有些内容就不是UEFI的,我懒得更改内容了)

原生debian13.5 和 starfive_debian202510(利用debian13.5库已同步更新到相同版本)的主要区别有:内核版本、HDMI、GPU、VPU、UEFI。
自从我把原生debian13.5点亮、有HDMI显示后,就开始安装GPU驱动,调试到一半,发现在debian13.5安装旧版本GPU驱动是个大工程,因跨年跨版本较多,软件包的依赖极其复杂,可能有些旧包在debian归档库里都找不到了。所以决定改向,把starfive_debian改成UEFI启动,更简单、更快能使用上,我已经实验成功。

实验记录我不会写成新手指南,有些细节我就不写了,欢迎留帖提问。这个实验记录可能也适合VF2L,因为是同一个系统镜像,只是我没实验过。

实验准备:

1、用U盘烧录1个原生debian13.5 for riscv的安装镜像,下载链接是debian官网。

2、用U盘烧录1个starfive_debian202510镜像(国内下载国际下载),这个U盘是被改造成用于UEFI,镜像用TF或其他存储应该也是可以的,但U盘上启动运行系统,我只在原生debian for VF2上碰到过,所以我选U盘(有代表性),也方便截图自证。

3、可选。用TF卡烧录1个starfive_debian202510镜像,镜像下载同上。这个镜像是用于救援的,因为QSPI会被刷成debian官方提供的uboot,刷完后,如果需要用starfive-debian,可以不刷回starfive的QSPI,把启动开关拨到SD位置,跳过QSPI,强制使用TF卡引导,可以引导starfive-debian,或目前版本的archlinux-cwt25。


4、可选。从VF2连接到另一台电脑的串口通讯线。这个不是必须的,刷QSPI可以不用串口线;如果改造过程顺利,也可以不用另一台电脑加入调试;如果过程不顺利,也可以用原生debian安装盘从USB启动,或者用starfive-debian从TF强制启动,去修复改造中的U盘。当然,如果手边有串口线更好。

更新 U-Boot文档到SPI Flash memory

1、debian官网 wiki文章,更新uboot的。利用原生debian的技术去改造starfive-debian。只需要看下图这个区域,观看并下载完uboot文档后,点击文章中第一个链接去更新。

新页面选 StarFive VisionFive2

新页面文章里比较完整的提供了几种更新flash方法。我推荐用最简单的(不需要串口线),从准备3烧录的TF卡启动到debian os,在系统里更新,方法在文章尾部,如图。注意,如果不确定VF2原有flash是适配那个操作系统的,可以选用启动开关0:1,强制从SD启动。

2、更新完后关机,并把VF2启动开关拨到0:0位,也就是两个开关全部朝向cpu。

3、可选项。如果没有串口线,可以跳过后续,等待改造。如果有串口线,可以把准备1的原生debian13.5安装盘插到usb,然后开机启动试试,原生debian13.5是没有HDMI显示输出的,只能通过串口线从另一台电脑操作。原生debian安装操作,可以返回debian官网 wiki文章查看。

改造1

我最初的实验,就是奔着用UEFI启动starfive-debian, 在第一次改造用UEFI启动成功后,又做了几次复现实验,发现个意外的现象,经多次确认,debian官方的uboot,是可以直接启动starfive-debian202510的,使用非UEFI方式启动,只能是U盘上的202510, TF上不行;原生202510有个启动参数错误,造成不能从U盘启动进入桌面系统,HDMI能显示启动过程。所以改造1不是改成UEFI启动,是如何修复那个错误参数。如果有网友已经把前置准备都做好,可以自己试试这个现象,刷完debian官方uboot,把准备2的U盘202510插入USB, 开机启动就能看见错误信息。修复方法如下(单选):
1、把待改造的U盘挿入另一台llinux电脑,挂载U盘上第三分区,编辑extlinux/extinux.conf 如下图一样,VF2上只插入单个启动U盘,可以确定是/dev/sda。改好存盘,把U盘插回VF2开机,等几秒就能看到绿灯闪烁,屏幕有加载信息。有串口线更好。

2、用准备3的救援TF卡启动到系统里,挂载待改U盘,如上修改启动参数,存盘重启。
3、用准备1的原生debian安装U盘启动,grub菜单界面选救援模式启动,待改U盘在系统启动前不挿入,在安装程序检查存储前挿入。在救援模式菜单选待改U盘的第4分区为救援环境,进入,挂载待改U盘第3分区,如同上面修改启动参数,存盘重启。(补充20260616)之前的文章里提到过,原生debian安装盘在VF2上是没有显示输出的,需要串口线辅助,这里再说一次。
4、(20260616补),如果有串口线又熟悉busybox,可以在启动错误停止时,利用串口线及 vi 编辑修复错误配置。

哈哈,就是这么简单。不想再弄UEFI的,可以跳到后面看改后须知。
我很郁闷,折腾UEFI费力。当然,折腾UEFI还是有用的,至少在TF、eMMC、NVME外,又多了USB系统运行存储,还能单盘多重系统。而且我猜测,starfive大概率不会再开发新的VF2/VF2L镜像,毕竟starfive是硬件商不是系统开发商,starfive应该不会对系统开发投入太多,starfive现在方向是推JH-8100(B100);中国的系统开发商对VF2/VF2L又是出工不出力,以后的新系统就指望原生debian,debian又是主推UEFI的,把starfive-debian改UEFI就是向标准靠拢。这篇文章大体完成,随后真正的改UEFI,我会继续写完,毕竟实验都完成并成功,标题留着,我会把坑填上,而且还有延伸试验待做。

改造2

再次实验,发现准备3中那个原用于救援的TF卡(starfive-deian202510), 用debian原生uboot引导,也会出现与改造1中相同引导错误,参照改造1的方法修改就行了,区别就是把/dev/sda4替换成/dev/mmcblk1p4。

改造3

实验复现中,实验纪录文章编写中。。。。。。

改造后须知

1、在第一次启动后,修改debian库源之前,需要按starfive官方提供的方法,对升级进行第一级保护。
sudo nano /etc/apt/preferences.d/sf-debian.pref

Package: *
Pin: origin “debianrepo-t.starfivetech.com
Pin-Priority: 1001

2、在长期使用中发现,有官方提供的一级保护是不够的。例如原生202510版本里可以安装支持VPU解码的mpv 0.35.1,在vf2上mpv比vlc更易用,upgrade后,不能保证mpv版本;再有,一级保护只能保证新版本不能覆盖旧版本,但它不能保证被自动卸载,所以需要二级保护hold,hold mesa*、mpv、vlc*、ffmpeg。

3、安装timeshift做第三级保护。

4、警告:因starfive-debian202510,到现在已经存在有8个月,vf2 GPU驱动需要的mesa22.3.6已经跨越多年,如果把starfive_debian直接升级到debian13.5,又为了保证GPU VPU运行正常,需要要放弃gdm3和gnome,upgrade会卸载它们,因为某些依赖不能满足(半年前是可以的)。labwc、sway、wayfire能正常运行,weston gnome kde不能。

5、202510的内核,有可能在升级后,需要重新配置sudo dpkg-reconfigure linux-image-6.12.5-starfive ,特别是在 ls /dev/dri 输出没显示renderD128的时候。重新配置时会修改extlinux.conf为错误,需注意。ps:/boot平时不挂载更好,需要升级内核/改变grub.cfg时才挂载。

6、linux-image-6.12.5-starfive的内核是有严重漏洞的,内网用户不需要担心,公网用户目前可以考虑升级第三方内核。第三方内核之前我在原生202510测试,是可以支持GPU VPU的。但在改造后的202510还没做测试。






新实验计划:

1、用UEFI启动nvme上的starfive-debian, 理论上大概率可行,待有空做实验验证,时间未定。
2、用UEFI启动上eMMC上的starfive-debian, 理论上大概率可行,待有空做实验验证,时间遥远,我无闲置eMMC,Rpi4B在用。
3、用UEFI启动U盘上的archlinux-cwt25, 理论不确定,万一又有惊喜呢,时间待定。(实验完成,用debian原生uboot可以启动U盘和TF卡上的archlinux-cwt25,完美启动,没有错误信息)
4、用UEFI启动NVME上的archlinux-cwt25, 理论不确定,万一又有惊喜呢,时间待定.

2026.6.15 16:00 完成第一次编写,留改造2、3两个坑。
2026.6.16 19:30 把改造2写了。然后archlinux-cwt25的实验也完成2个。现在有些不想写改造3了。

Hey,我已经在Archlinux中实现了UEFI启动,uboot和opensbi都用的主线,具体如下。

项目 分支 当前提交 版本
OpenSBI master 79e63bc v1.8
U-Boot master 5732bd0 v2026.07-rc2

uboot开启了以下选项。

CONFIG_BOOTSTD_FULL=y
CONFIG_BOOTDEV_SPI_FLASH=y
CONFIG_CMD_BOOTDEV=y
CONFIG_CMD_BOOTMETH=y

内核使用CWT维护的linux-cwt-starfive-vf2,我使用systemd-boot直接启动,内核开启了以下选项开启EFI_STUB支持。

CONFIG_EFI=y
CONFIG_EFI_STUB=y
CONFIG_EFI_ZBOOT=y

这样uboot能启动systemd-boot,然后再引导内核,不需要设备树文件。

补一个bootctl输出与uname输出。

$ bootctl

      Firmware: UEFI 2.110 (Das U-Boot 8230.1792)
 Firmware Arch: riscv64
   Secure Boot: disabled (setup)
  TPM2 Support: no
  Measured UKI: no
  Boot into FW: not supported

Current Boot Loader:
       Product: systemd-boot 260.2-2-arch
     Features: ✓ Boot counting
               ✓ Menu timeout control
               ✓ One-shot menu timeout control
               ✓ Default entry control
               ✓ One-shot entry control
               ✓ Support for XBOOTLDR partition
               ✓ Support for passing random seed to OS
               ✓ Load drop-in drivers
               ✓ Support Type #1 sort-key field
               ✓ Support @saved pseudo-entry
               ✓ Support Type #1 devicetree field
               ✓ Enroll SecureBoot keys
               ✓ Retain SHIM protocols
               ✓ Menu can be disabled
               ✓ Multi-Profile UKIs are supported
               ✓ Loader reports network boot URL
               ✓ Support Type #1 uki field
               ✓ Support Type #1 uki-url field
               ✓ Loader reports active TPM2 PCR banks
     Partition: /dev/disk/by-partuuid/58624a9b-f45b-4985-a481-04608142b6ac
        Loader: └─/boot///EFI/BOOT/BOOTRISCV64.EFI
 Current Entry: 1713c884664449faa14ec912242ac72d-6.12.18-cwt-6.0.0-2.conf
 Default Entry: 1713c884664449faa14ec912242ac72d-6.12.18-cwt-6.0.0-2.conf

Random Seed:
 System Token: not set
       Exists: yes

Available Boot Loaders on ESP:
          ESP: /boot (/dev/disk/by-partuuid/58624a9b-f45b-4985-a481-04608142b6ac)
         File: ├─/boot//EFI/systemd/systemd-bootriscv64.efi (systemd-boot 260.2-2-arch)
               └─/boot//EFI/BOOT/BOOTRISCV64.EFI (systemd-boot 260.2-2-arch)

No boot loaders listed in EFI Variables.

Boot Loader Entry Locations:
          ESP: /boot (/dev/disk/by-partuuid/58624a9b-f45b-4985-a481-04608142b6ac, $BOOT)
       config: /boot//loader/loader.conf
        token: arch

Default Boot Loader Entry:
         type: Boot Loader Specification Type #1 (.conf)
        title: Arch Linux
           id: 1713c884664449faa14ec912242ac72d-6.12.18-cwt-6.0.0-2.conf
       source: /boot//loader/entries/1713c884664449faa14ec912242ac72d-6.12.18-cwt-6.0.0-2.conf (on the EFI System Partition)
     sort-key: arch
      version: 6.12.18-cwt-6.0.0-2
   machine-id: 1713c884664449faa14ec912242ac72d
        linux: /boot//1713c884664449faa14ec912242ac72d/6.12.18-cwt-6.0.0-2/linux
       initrd: /boot//1713c884664449faa14ec912242ac72d/6.12.18-cwt-6.0.0-2/initrd
      options: console=ttyS0,115200 earlycon=sbi rootwait loglevel=3 root=UUID=4abee84a-214e-4ba7-afe4-30768d4718c3 rw rootflags=subvol=/archlinux rootfstype=btrfs systemd.machine_id=1713c884664449faa14ec912242ac72d
$  uname -a
Linux VF2 6.12.18-cwt-6.0.0-2 #1 SMP PREEMPT_DYNAMIC Wed May 13 21:17:10 CST 2026 riscv64 GNU/Linux

问题

不过之前测试的时候只能正确引导我的NVME中的系统。sd卡中的能正常进入systemd-boot,但是读取配置时出现问题,不能正确从分区中读取文件。

希望和你交流一下。

如果是archlinux,建议你去问问cwt,论坛里应该有很多人在用他的archlinux for VF2/VF2L,你们才是archlinux的高手,我擅长试错,我不会开发,我只是个玩VF2的骨灰级终端用户,我把试错成功的内容纪录在论坛里,方便自己回查,也许能给其他网友提供些野路子思路。
感谢你的回复,期待你的archlinux UEFI能公开,最好是有完整镜像并能符合统一标准,这样方便我做测试,也是我研究debian UEFI的初衷。我曾经在VF2上测试成功过,在同一个EMMC上,用UEFI安装了debian13和ubuntu25(都是无头)。我的VF2 单NVME上安装有starfive-debian和archlinux-ctw,非UEFI方式、交换启动使用。期待不久后,你的archlinux(UEFI)能安装加入到运行了starfive-debian的同一存储中,单存储多重系统。 :heart_eyes:

最后补充:我的uboot文件是debian官方提供的,就在debian库里,debian for VF2/VF2L.

实验完成,用debian原生uboot可以启动U盘和TF卡上的archlinux-cwt25,完美启动,没有错误信息)

1 Like