某些因素阻止在 Fedora 36(内核 5.19.6-200.fc36.x86_64)中的 Firewire (IEEE1394) 上启动。
Fedora 在这里挂起很长时间:
Dracut Emergency Shell 的最终输出:
我有日志/run/initramfs/rdsosreport.txt
(1843行)。摘录:
mac2011-linux% cat '/media/alba/sauve/rdsosreport.txt' |grep -E "fw|firewire"
[ 2.786192] fedora kernel: firewire_ohci 0000:04:00.0: added OHCI v1.10 device as card 0, 8 IR + 8 IT contexts, quirks 0x0, physUB
[ 3.290214] fedora kernel: firewire_core 0000:04:00.0: created device fw0: GUID a4b197fffe435f8e, S800
[ 3.291200] fedora kernel: firewire_core 0000:04:00.0: phy config: new root=ffc1, gap_count=5
[ 8.368893] fedora kernel: firewire_core 0000:04:00.0: created device fw1: GUID 0030e002e0011462, S800
ls /lib/modules/5.19.6-200.fc36.x86_64/kernel/drivers/firewire
返回firewire-core.ko.xz firewire-ohci.ko.xz
。
modprobe -c|grep fw
返回诸如 之类的行的分数alias symbol:fw_bus_type firewire_core
。
我尝试过四个 SATA 设备(3 个 SSD 和一个旋转设备)、三台 Macbook pro(2009 年、2010 年、2011 年)、两个不同的 Firewire 接口和两根不同的电缆。
当设备内部连接到 SATA 或用于启动 Mac OS X El Capitan 或 Sierra 时,没有问题。它也适用于 Ubuntu(内核 5.15),尽管我观察到偶尔会出现故障。
该问题适用于 Firewire 和 Fedora。
它可以整齐地复制如下:
- 全新安装 Fedora,其中一个 HFS+ 分区用于 EFI 文件系统,一个 Ext4 分区用于根文件系统。
- 在内部启动这个新安装。
- 要证明 Firewire 驱动程序已安装,请检查您是否可以在 Firewire 上安装其他设备,或者,如果您没有其他设备,请观看
modprobe -c|grep firewire
。 - 尝试在 Firewire 上重新启动。在 Plymouth 阶段之后它将失败(当您看到 Fedora 徽标时按 Esc 键以查看日志)。
有人可以重现或帮助修复吗?
答案1
因此,您处于启动过程 initramfs 阶段的紧急 shell 中。这意味着:固件已加载GRUB,然后GRUB已加载内核和initramfs并启动内核。此时,系统基本上有一个目标:安装真正的根文件系统。为此,initramfs 文件可以包含支持任何必要硬件的内核模块以及执行任何必要设置的脚本。一旦安装了根文件系统,真正的进程#1二进制文件将被执行,并将替换 initramfs 中提供的临时进程,并且该进程将决定引导过程将如何继续。
图片中的消息表明内核已成功加载firewire-core
模块,并检测到 Firewire 设备的存在。然而,核心模块需要另一个模块,firewire-sbp2
以支持基于Firewire的贮存设备。
在您的情况下, initramfs 显然不包含该firewire-sbp2
模块(假设您firewire-spb2
在注释中只是注释中的拼写错误,并且您正确地输入了 modprobe 命令)。该模块需要支持基于 Firewire 的存储设备。因此,缺少模块是基于 Firewire 的启动失败的最可能原因:如果没有该模块,内核将无法访问位于 Firewire 存储上的根文件系统,并且由于尚未安装其他文件系统, initramfs 是内核在引导过程的早期阶段能够访问的唯一位置。
每当安装新的内核版本时,都会首先创建 Initramfs 文件(假设特定内核配置为需要/使用一个)。 initramfs 文件特定于它所构建的内核版本,并且可能会或可能不会在某种程度上针对它所构建的系统进行定制,具体取决于您的发行版使用的 initramfs 生成器进程:一些 initramfs 生成器标识访问所需的驱动程序模块创建 initramfs 时的根文件系统,并且仅包含必要的模块以保持 initramfs 文件的大小较小。
因此,如果您的 initramfs 文件是在磁盘通过 SATA 连接时创建的,则 Fedora initramfs 创建者 ( dracut
) 可能省略了 Firewire 存储支持模块:“由于根文件系统不在 Firewire 磁盘上,因此我认为无需添加此模块如果以后需要,它可以在/lib/modules
安装根文件系统后自动加载。”
如果您习惯在 SATA 和 Firewire 之间移动系统磁盘,您可能需要告诉 initramfs 创建者始终将firewire-sbp2
模块包含到 initramfs,即使当时看起来没有必要。
对于dracut
,您可以通过*.conf
在 中创建文件来持久地执行此操作/etc/dracut.conf.d/
。例如,您可以将其命名为/etc/dracut.conf.d/01-always-include-firewire-storage.conf
.它需要包含以下行:
add-drivers+="firewire-sbp2"
(由于 中的文件/etc/dracut.conf.d/
是根据其名称的字母数字顺序进行处理的,因此有一个约定,即在文件名中添加两位数前缀以使顺序明确。)
添加此文件后,您需要重建 initramfs 文件。要为当前内核执行此操作,您可能只需要键入
dracut --force
要针对不同的内核版本执行此操作,命令为:
dracut --kver <kernel version> --force
--force
需要该选项来覆盖已经存在的 initramfs 文件。