我已经编译了一个 linux 内核 5.4.81 作为单解内核。我添加了驱动程序来访问磁盘,还添加了驱动程序来访问 msdos 分区和 ext4 文件系统。我通过将其复制到 /dev/sdb6/boot 将其安装在 /dev/sdb6 上,并使用以下命令配置 grub:
menuentry "Teddix" {
echo 'Loading Teddix'
insmod gzio
insmod part_msdos
insmod ext2
set root=(hd1,msdos6)
search --no-floppy --fs-uuid --set=root 5312030c-4457-4ad0-88cb-bf3488886e90
linux (hd1,msdos6)/boot/linux-5.4.81 root=UUID=5312030c-4457-4ad0-88cb-bf3488886e90 ro
}
我可以启动该内核但是出现以下错误:
ata5.00: supports DRM functions and may not be fully accessible
ata1.00: supports DRM functions and may not be fully accessible
ata5.00: configured for UDMA/133
ata1.00: configured for UDMA/133
scsi 0:0:0:0: Direct-Access ATA Samsung SSD 860 3B6Q PQ: 0 ANSI: 5
scsi 4:0:0:0: Direct-Access ATA Samsung SSD 860 3B6Q PQ: 0 ANSI: 5
VFS: Cannot open root device "UUID=5312030c-4457-4ad0-88cb-bf3488886e90" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
Kernel Offset: disabled
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
我也尝试使用 /dev/sdb6 作为根分区,但没有任何区别。我是否遗漏了一些驱动程序或模块?
编辑:我也不明白的是:为什么这个内核没有列出所有可能的根分区?我希望在内核崩溃之前有一个列表。
答案1
UUID=
如果您想使用、LABEL=
或/dev/disk/by-*
设备名称,则需要一个 initramfs 。
Linux 内核原生支持只有三种类型的根设备名称:(PARTUUID=
使用 GPT 分区 GUID,不是文件系统 UUID)、PARTLABEL=
(再次使用 GPT 分区标签,而不是文件系统标签)和传统的/dev/sdX
。其他任何事情都必须由 initramfs 处理。
(对于 msdos 磁盘,只要它们具有非空的“NT 磁盘签名”,您仍然可以使用可以从lsblk -o +partuuid
或中找到的伪 PARTUUID blkid
。如果磁盘标识符当前为空,则可以使用 fdisk 专家模式命令i
将磁盘标识符设置为某个随机数。)
答案2
必须激活以下驱动程序:
- SCSI 硬件驱动程序(依赖于硬件,此处更正)
- SCSI 磁盘驱动程序(CONFIG_BLK_DEV_SD=y,缺失)
- 分区表驱动程序(CONFIG_MSDOS_PARTITION=y)
- 文件系统驱动程序(CONFIG_EXT4_FS=y)
重新编译并重新安装 Linux 内核。