自己编译的linux内核无法识别分区

自己编译的linux内核无法识别分区

我已经编译了一个 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

必须激活以下驱动程序:

  1. SCSI 硬件驱动程序(依赖于硬件,此处更正)
  2. SCSI 磁盘驱动程序(CONFIG_BLK_DEV_SD=y,缺失)
  3. 分区表驱动程序(CONFIG_MSDOS_PARTITION=y)
  4. 文件系统驱动程序(CONFIG_EXT4_FS=y)

重新编译并重新安装 Linux 内核。

相关内容