NanoPi R6C - 如何从 SSD 而不是 eMMC 加载根文件系统? [已关闭]

问题描述 投票:0回答:1

NanoPi R6C 可以从 micro SD 卡启动,也可以从 eMMC 启动。有一个 SSD 插槽,我在那里安装了 SSD,但设备无法从那里启动。下一个最好的办法是从 SSD 加载根文件系统,但我不知道如何。

按照制造商的说明(这里这里),我从源代码编译了图像以启动1)从microSD卡和2)从eMMC。对我来说,实现我想要的目标的一种方法是使用参数重新编译 uBoot 映像以从 SSD 加载根文件系统,但我无法弄清楚如何做到这一点。

为了克隆根分区,我从 microSD 卡启动,以免从 eMMC 加载任何分区。我将根分区从 eMMC (

/dev/mmcblk2p8
) 克隆到 SSD (
/dev/nvme0n1p1
)。我想我做对了。我可以从 SSD 挂载根分区的副本,看起来没问题。

有一点,为什么

/dev/nvme0n1p1
的PARTUUID比
/dev/mmcblk2p8
短?这两个值的长度应该相同吗?

pi@NanoPi-R6C:~$ sudo blkid | grep root
/dev/mmcblk2p8: LABEL="rootfs" UUID="a03eef36-b040-4df8-a1ed-12d04f1950c2" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="rootfs" PARTUUID="b2af085d-a675-48c6-c437-f6d557ff4744"
/dev/nvme0n1p1: LABEL="rootfs" UUID="a03eef36-b040-4df8-a1ed-12d04f1950c2" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="4a4a7129-01"

(我知道两个分区具有相同的 UUID,这可能需要更改。)

我从 eMMC 启动。

cat /proc/cmdline
的输出是:

storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal androidboot.dtbo_idx=0 androidboot.verifiedbootstate=orange earlycon=uart8250,mmio32,0xfeb50000 console=ttyFIQ0 coherent_pool=1m irqchip.gicv3_pseudo_nmi=0 rw root=/dev/mmcblk2p8 rootfstype=ext4 rootflags=discard data=/dev/mmcblk2p9 consoleblank=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1 androidboot.fwver=uboot-a83a7263ef-01/09/2024

我想将

root=/dev/mmcblk2p8
更改为
root=/dev/nvme0n1p1
但我不知道如何更改。

我连接到串行端口并进入 uBoot 命令提示符。我可以在这里调用一个命令来告诉它从 SSD 加载根分区吗?

Hit key to stop autoboot('CTRL+C'):  0 
=> <INTERRUPT>
=> printenv
arch=arm
autoload=no
baudrate=1500000
board=nanopi6
board_name=nanopi6
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}extlinux/extlinux.conf
boot_net_usb_start=usb start
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_targets=mmc1 mmc0 mtd2 mtd1 mtd0 usb0 pxe dhcp 
bootargs=storagemedia=emmc androidboot.storagemedia=emmc androidboot.mode=normal androidboot.dtbo_idx=0
bootcmd=boot_fit;boot_android ${devtype} ${devnum};bootrkp;run distro_bootcmd;
bootcmd_dhcp=run boot_net_usb_start; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;
bootcmd_mmc0=setenv devnum 0; run mmc_boot
bootcmd_mmc1=setenv devnum 1; run mmc_boot
bootcmd_mtd0=setenv devnum 0; run mtd_boot
bootcmd_mtd1=setenv devnum 1; run mtd_boot
bootcmd_mtd2=setenv devnum 2; run mtd_boot
bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi
bootcmd_usb0=setenv devnum 0; run usb_boot
bootdelay=1
cpu=armv8
devnum=0
devtype=mmc
distro_bootcmd=for target in ${boot_targets}; do run bootcmd_${target}; done
dtb_name=rk3588-nanopi6-rev04.dtb
eth1addr=fa:0f:e4:e4:4b:30
ethaddr=f6:0f:e4:e4:4b:30
fdt_addr_r=0x08300000
kernel_addr_c=0x05480000
kernel_addr_r=0x00400000
mmc_boot=if mmc dev ${devnum}; then setenv devtype mmc; run scan_dev_for_boot_part; fi
mtd_boot=if mtd_blk dev ${devnum}; then setenv devtype mtd; run scan_dev_for_boot_part; fi
partitions=uuid_disk=${uuid_gpt_disk};name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};name=trust,size=4M,uuid=${uuid_gpt_atf};name=misc,size=4MB,uuid=${uuid_gpt_misc};name=resource,size=16MB,uuid=${uuid_gpt_resource};name=kernel,size=32M,uuid=${uuid_gpt_kernel};name=boot,size=32M,bootable,uuid=${uuid_gpt_boot};name=recovery,size=32M,uuid=${uuid_gpt_recovery};name=backup,size=112M,uuid=${uuid_gpt_backup};name=cache,size=512M,uuid=${uuid_gpt_cache};name=system,size=2048M,uuid=${uuid_gpt_system};name=metadata,size=16M,uuid=${uuid_gpt_metadata};name=vendor,size=32M,uuid=${uuid_gpt_vendor};name=oem,size=32M,uuid=${uuid_gpt_oem};name=frp,size=512K,uuid=${uuid_gpt_frp};name=security,size=2M,uuid=${uuid_gpt_security};name=userdata,size=-,uuid=${uuid_gpt_userdata};
pxefile_addr_r=0x00600000
ramdisk_addr_r=0x0a200000
rkimg_bootdev=if mmc dev 1 && rkimgtest mmc 1; then setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;elif mmc dev 0; then setenv devtype mmc; setenv devnum 0;elif rksfc dev 1; then setenv devtype spinor; setenv devnum 1;fi; 
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}extlinux/extlinux.conf; then echo Found ${prefix}extlinux/extlinux.conf; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x00500000
serial#=53f6097d62019d33
soc=rockchip
stderr=serial,vidconsole
stdout=serial,vidconsole
usb_boot=usb start; if usb dev ${devnum}; then setenv devtype usb; run scan_dev_for_boot_part; fi
vendor=rockchip

Environment size: 3811/32764 bytes

当我输入

boot
时,它会执行
run bootcmd
。这会运行
boot_fit
boot_android
,两者都失败,然后运行
bootrkp
,通过发出以下信号来启动系统:

setenv bootm-no-reloc y
booti 0x400000 0xa200000:0x7b2bc0 0x8300000

bootrkp
在文件
cmd/bootrkp.c
here)中的uBoot源代码中实现。理论上,可以修改源代码以从不同的分区加载根文件系统 - 但我不确定该任务是否在我的能力范围内。有没有更简单的方法?

u-boot nanopi
1个回答
0
投票

供应商 U-Boot 是使用 nanopi6_defconfig 编译的。这不包括 PCIe 支持,这是使用 NVMe 驱动器的先决条件。

您可以将带有内核和 initrd 的启动分区放在 eMMC 驱动器或 SD 卡上,并将根分区放在 NVMe 驱动器上。

如何从 NVMe 驱动器加载根分区?

内核命令行用于指定根分区。 U-Boot 变量 bootargs 可用于向内核命令行添加参数,例如

setenv bootargs root=/dev/nvme0n1p1
© www.soinside.com 2019 - 2024. All rights reserved.