战队动态 / 2026-06-15 06:54:01

8.3. 引导系统从M.2固态启动¶

对于使用rk3566、rk3576、rk3588s主控芯片的鲁班猫系列板卡,没有M.2接口,无法使用M.2固态硬盘,但是有MINI PCIE接口,而MINI PCIE接口信号可复用为sata信号,可接msata固态硬盘。

对于使用rk3568、rk3588主控芯片的鲁班猫系列板卡,有M.2接口,因此不考虑使用msata固态,而使用PCIE协议的M.2固态。

目前已支持从M.2固态启动的板卡:

LubanCat-2

LubanCat-2IO

LubanCat-5

LubanCat-5IO

注意

其中LubanCat-RK3588系列M.2固态启动系统需要使用6.1内核,在5.10内核启动会出现崩溃情况。另外,如需使用Ubuntu22系统,请参考 资料网盘/3-Linux镜像/LubanCat-rk3588/Ubuntu系统镜像/通用系统镜像-适用于所有板卡/Ubuntu22.04/m2固态启动 说明进行操作,Ubuntu22系统不适用本文档。

提示

如果某鲁班猫板卡不在以上列表,但希望添加支持从M.2固态启动系统,请联系淘宝技术支持进行反馈。

8.3.1. 制作固态启动镜像包¶

8.3.1.1. 重新编译uboot¶

由于默认配置文件是没有支持PCIE相关配置的,因此发布的通用镜像默认不能在uboot阶段初始化M.2固态硬盘。

如果需要支持初始化M.2固态硬盘需要使用对应的PCIE配置文件重新编译uboot。

注意

编译uboot源码需要借助SDK源码,请根据前面构建系统镜像章节获取对应板卡的SDK源码。

8.3.1.1.1. 获取uboot源码¶

野火uboot源码地址: https://github.com/LubanCat/u-boot/tree/main

支持PCIE启动的分支为 main 分支,sdk源码中的uboot源码不一定使用该分支,因此需要替换uboot源码。

1

2

3

4

5#进入sdk源码顶层文件夹,重命名原uboot源码

mv u-boot u-boot-old

#获取main分支的uboot源码

git clone --depth=1 -b main https://github.com/LubanCat/u-boot.git

板卡配置文件位于uboot源码/configs目录下,对应的配置文件如下:

rk3568系列:lubancat-rk3568-pcie_defconfig

LubanCat5:lubancat-5-rk3588-pcie_defconfig

LubanCat5IO:lubancat-5io-rk3588-pcie_defconfig

8.3.1.1.2. 编译uboot源码¶

1

2

3

4

5

6

7

8

9#进入uboot源码顶层文件夹

cd u-boot

#清除旧编译输出

make clean

#根据板卡配置文件名称进行编译,配置文件名称为xxx_defconfig,则编译为./make.sh xxx

#以rk3568系列为例

./make.sh lubancat-rk3568-pcie

编译成功后在uboot源码顶层文件夹生成名为 uboot.img 的文件,该文件就是我们需要的支持PCIE的uboot镜像文件。

8.3.1.2. 解包发布镜像并重新打包¶

为了方便我们不重新编译镜像,而是使用野火发布的通用镜像进行解包,解包后替换并修改一些组件,再重新打包成完整镜像,从而得到支持固态启动镜像包。

8.3.1.2.1. 解包镜像¶

注意

解包镜像需要在Linux环境使用Linux_Pack_Firmware根据进行解包,不要在windows解包。

访问资料网盘/6-开发软件/,获取Linux_Pack_Firmware_v2.29.zip

将Linux_Pack_Firmware_v2.29.zip解压到Linux PC或虚拟机中。

1

2#解压

unzip Linux_Pack_Firmware_v2.29.zip

访问资料网盘获取需要的系统镜像,传到Linux_Pack_Firmware/rockdev目录下。

以LubanCat-2的Debian xfce镜像为例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17#进入工具目录

cd Linux_Pack_Firmware/rockdev/

#解压镜像,根据实际压缩包名称而定

7z x lubancat-rk3568-debian10-xfce-20250303_update.7z

#重命名镜像为update.img,根据实际镜像名称而定

mv lubancat-rk3568-debian10-xfce-20250303_update.img update.img

#解包镜像

./unpack.sh

#解包镜像的到output目录

#查看output目录

ls output

#信息输出如下

boot.img MiniLoaderAll.bin package-file parameter.txt rootfs.img uboot.img

8.3.1.2.2. 替换和修改镜像组件¶

8.3.1.2.2.1. 替换uboot.img¶

将前面编译uboot源码生成的uboot.img替换解包生成uboot.img

1

2#替换uboot.img,根据自己的实际路径确定

cp -f ~/LubanCat_Linux_rk356x_SDK/u-boot/uboot.img ~/Linux_Pack_Firmware/rockdev/output/

8.3.1.2.2.2. 修改boot.img¶

由于通用镜像默认没有支持引导启动PCIE配置,因此需要进行修改,引导配置位于boot.img中的boot.scr,

又因为boot.scr是由boot.cmd生成的,所以我们要修改的是boot.img中的boot.cmd,然后生成boot.scr。

1

2

3

4

5

6

7

8#进入解包输出目录

cd Linux_Pack_Firmware/rockdev/output/

#挂载boot.img

sudo mount boot.img /mnt

#修改boot.cmd

sudo vi /mnt/boot.cmd

在boot.cmd的中添加或修改为以下高亮部分:

boot.cmd¶

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

48

49

50

51

52

53

54

55

56

57

58

59

60

61echo [boot.cmd] run boot.cmd scripts ...;

pcie_boot=1

if test "$pcie_boot" = "1"; then

pci enum

nvme scan

nvme device 0

if test $? -eq 0; then

setenv devtype nvme

setenv devnum 0

setenv rootfspart /dev/nvme0n1p3

if test ! -e ${devtype} ${devnum}:${distro_bootpart} /rk-kernel.dtb; then

rockusb 0 nvme 0

fi

else

setenv rootfspart /dev/mmcblk${devnum}p3

fi

else

setenv rootfspart /dev/mmcblk${devnum}p3

fi

if test -e ${devtype} ${devnum}:${distro_bootpart} /uEnv/uEnv.txt; then

echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt ...;

load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt;

echo [boot.cmd] Importing environment from ${devtype} ...

env import -t ${env_addr_r} 0x8000

setenv bootargs ${bootargs} root=${rootfspart} boot_part=${distro_bootpart} ${cmdline}

printenv bootargs

echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r} ...

load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r}

echo [boot.cmd] loading ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r} ...

load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r}

echo [boot.cmd] loading default rk-kernel.dtb

load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /rk-kernel.dtb

fdt addr ${fdt_addr_r}

fdt set /chosen bootargs

echo [boot.cmd] dtoverlay from /uEnv/uEnv.txt

setenv dev_bootpart ${devnum}:${distro_bootpart}

dtfile ${fdt_addr_r} ${fdt_over_addr} /uEnv/uEnv.txt ${env_addr_r}

echo [boot.cmd] [${devtype} ${devnum}:${distro_bootpart}] ...

echo [boot.cmd] [booti] ...

booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

fi

echo [boot.cmd] run boot.cmd scripts failed ...;

# Recompile with:

# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr

以上修改的意思是:

第3-5行,判断pcie_boot变量是否为1,如果为1,则支持从pcie启动,如果为0则恢复默认启动方式从eMMC/SD启动。

第6-8行,扫描pcie设备。

第10-13行,如果扫描到pcie设备则设置启动类型为nvme,设备号为0,文件系统分区为/dev/nvme0n1p3

第15-17行,判断pcie硬盘boot分区是否存在rk-kernel.dtb,如果不存在则说明pcie固态中没有镜像,引导进入烧录模式,可将镜像直接烧录到pcie固态。

修改完成boot.cmd和保存退出,然后执行以下命令生成boot.scr

1sudo mkimage -C none -A arm -T script -d /mnt/boot.cmd /mnt/boot.scr

由于uboot启动读取的内核设备树是boot.img的 rk-kernel.dtb ,默认是通用设备树(可能没有开启PCIE接口),系统第一次启动后会软连接到dtb目录下实际的设备树。

因此,需要将dtb目录下实际的设备树替换 rk-kernel.dtb 从而使第一次启动时启用PCIE接口,以下以rk3568-lubancat-2-v3为例:

1

2

3

4

5

6

7#前面已经将boot.img挂载到/mnt

#替换rk-kernel.dtb,根据板卡实际设备树而定

sudo cp -f /mnt/dtb/rk3568-lubancat-2-v3.dtb /mnt/rk-kernel.dtb

#替换完成后卸载/mnt即可

sudo umount /mnt/

8.3.1.2.2.3. 修改rootfs.img¶

由于rk356x系列的4.19内核对应的Debian10镜像默认没有支持pcie系统初始化,因此需要进行修改,系统初始化文件位于rootfs.img的 /etc/init.d/boot_init.sh。

1

2

3

4

5

6

7

8#进入解包输出目录

cd Linux_Pack_Firmware/rockdev/output/

#挂载rootfs.img

sudo mount rootfs.img /mnt

#修改boot_init.sh

sudo vi /mnt/etc/init.d/boot_init.sh

修改内容如下:

1

2#Boot_Part="${Root_Part::-2}"p2

Boot_Part="${Root_Part::-1}"2

修改完成如下图所示:

修改完成后卸载rootfs.img

1

2#卸载前面挂载rootfs.img

sudo umount /mnt

8.3.1.2.3. 打包镜像¶

替换uboot.img、修改boot.img和rootfs.img后即可打包成支持固态启动镜像包。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16#进入输出目录

cd Linux_Pack_Firmware/rockdev/output

#打包镜像,根据实际芯片名称而定

#rk356x打包执行

../afptool -pack ./ update_tmp.img || pause

../rkImageMaker -RK3568 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause

#rk3576打包执行

../afptool -pack ./ update_tmp.img || pause

../rkImageMaker -RK3576 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause

#rk3588/rk3588s打包执行

../afptool -pack ./ update_tmp.img || pause

../rkImageMaker -RK3588 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause

打包后在output当前目录生成 update_tmp.img 和 update.img 镜像文件,其中 update.img 就是最终打包生成的支持引导M.2固态启动的镜像。

8.3.2. 烧录镜像¶

制作完成支持引导M.2固态启动的 update.img 镜像后,可将 update.img 烧录至eMMC/SD以及M.2固态。

8.3.2.1. 烧录镜像到eMMC/SD¶

因为需要eMMC/SD作为引导,因此需要先将镜像烧录到eMMC/SD,如何烧录系统到eMMC/SD参考以下文档:

eMMC镜像烧录参考: 完整镜像烧录 以及各板卡的 快速使用手册

SD镜像烧录参考: SD卡启动镜像烧录 ,注意选择功能模式勾选的是 SD启动 。

8.3.2.2. 烧录镜像到M.2固态¶

将镜像烧录到eMMC或SD卡后,再接入M.2固态硬盘,启动时会扫描pcie设备并判断pcie设备中是否存在镜像,如果pcie设备中的boot分区不存在rk-kernel.dtb,则判断为不存在镜像,会引导进入烧录模式。

当M.2硬盘不存在镜像时,usb烧录口接入usb线会识别到 LOADER 设备,如下图所示:

选择 升级固件 界面,固件选择前面生成的 update.img ,最后点击烧录即可,如下图所示:

烧录完成后,会自动重启,系统启动成功后,执行以下命令查看是否成功从M.2固态启动:

1

2#查看系统挂载

lsblk

引导成功效果如下图所示,其中/dev/nvme0n1p2为M.2固态的boot分区,/dev/nvme0n1p3为M.2固态的rootfs分区。

8.3.2.3. 重新烧录镜像到M.2¶

M.2硬盘带镜像时不会进入烧录模式,如果需要重新烧录M.2硬盘,此时需要删除判断文件或者手动引导至烧录模式。

8.3.2.3.1. 通过删除判断文件方式¶

因为启动会判断M.2固态中boot分区是否存在rk-kernel.dtb,如果不存在rk-kernel.dtb,则会引导进入烧录模式。

因此,如果需要重新烧录M.2硬盘,可删除rk-kernel.dtb,M.2启动系统后执行以下命令删除:

1

2

3

4

5#删除判断文件

sudo rm /boot/rk-kernel.dtb

#重启

sudo reboot

USB烧录口连接电脑,识别到 LOADER 设备后即可重新烧录镜像到M.2固态。

8.3.2.3.2. 通过手动引导方式¶

在接入M.2硬盘后,板卡Debug接口接串口模块,然后板卡上电,在上电过程中快速按下 ctrl + c 进入uboot命令行模式,在uboot命令行模式输入以下命令:

1

2

3

4

5

6#扫描设备

pci enum

nvme scan

#进入烧录模式

rockusb 0 nvme 0

USB烧录口连接电脑,识别到 LOADER 设备后即可重新烧录镜像到M.2固态。

阿里健康“收编”集团医药业务,为什么市场还是不买账?
不共戴天的意思