每次我在运行GNU/Linux Debian Buster 10. 0 的Dell PowerEdge T20 服务器上更新我的initramfs映像(-s)时update-initramfs,我都会收到这些警告。有解决办法吗?
W: Possible missing firmware /lib/firmware/i915/bxt_dmc_ver1_07.bin for module i915
W: Possible missing firmware /lib/firmware/i915/skl_dmc_ver1_27.bin for module i915
W: Possible missing firmware /lib/firmware/i915/kbl_dmc_ver1_04.bin for module i915
W: Possible missing firmware /lib/firmware/i915/cnl_dmc_ver1_07.bin for module i915
W: Possible missing firmware /lib/firmware/i915/glk_dmc_ver1_04.bin for module i915
W: Possible missing firmware /lib/firmware/i915/kbl_guc_ver9_39.bin for module i915
W: Possible missing firmware /lib/firmware/i915/bxt_guc_ver9_29.bin for module i915
W: Possible missing firmware /lib/firmware/i915/skl_guc_ver9_33.bin for module i915
W: …Run Code Online (Sandbox Code Playgroud) 我想更好地了解 Linux init 进程,以便通过 ceph 而不是 nfs 网络引导系统。
在这个过程中,我遇到了两种形式的切换根。一个称为switch_root,另一个称为pivot_root。这些脚本从使用 pxe 引导过程通过 tftp 获得的内存文件系统 (initramfs) 运行。
你什么时候会使用一个?我已经看到两者都用于放置在 root 中的一些 init 脚本中。
使用专用于单个分区的GPT分区磁盘安装新系统,ext4格式,extlinux(版本 4.05)作为引导加载程序,Ubuntu Core 版本 13.10 amd64 作为 rootfs,以及 Ubuntu linux-image-3.11.0-18-generic 作为内核,和 extlinux-update 生成引导加载程序配置。
重新启动后的结果(仍在基于 KVM 的虚拟机中)是一个 (initramfs) 提示和以下消息:
mount: can't read '/etc/fstab': No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
The filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.
Run Code Online (Sandbox Code Playgroud)
BusyBox …
这是一个常见的场景。无论出于何种原因,initramfs(OpenSUSE,以防万一)未能找到根文件系统,因此它会将您置于救援外壳中。我非常清楚需要安装什么设备。我的问题:
挂载根文件系统并继续引导顺序的正确步骤是什么?
大概这就是救援控制台的全部意义所在。然而,似乎没有人记录你是如何做到这一点的。
显然我可以在某处挂载根文件系统。但是我如何使它成为文件系统树的根?现在我在那之后继续正常的启动过程吗?(我以为只要退出 shell 就可以了……但事实并非如此。)在继续之前,您究竟需要安装什么,以及如何继续?
按照我的理解,initramfs 负责加载“真正的”根文件系统。
现在,我们在两个地方定义了这个根。首先我们在/etc/fstab. 其次,我们将设备放在内核引导命令上,例如root=/dev/sda1.
initramfs 使用哪一个来确定根文件系统在哪里?如果它使用 root 内核参数,为什么我们在 中有一个条目/etc/fstab?第二个选项(它读为/etc/fstab)是非常不合逻辑的,因为该/etc/fstab文件位于 initramfs 最初尝试挂载的根设备上。
很混乱的东西。
我发现如果我选择jffs或sd作为文件系统(而不是initramfs),内核大小将非常小(1.4 MB 与initramfs3.4 MB 相比)。这意味着initramfs需要相当大的空间。所以如果可以的话,我会完全删除它,因此内核会非常小,这正是我想要的。
我脑海中浮现的基本问题是:为什么我需要initramfs?没有任何初始文件系统,Linux 内核不能启动吗?
我的最终应用程序只会进行计算和通信 - 根本没有存储。所以没有文件系统的操作系统是有意义的——至少对我的应用程序来说是这样。
我想检查一下用于构建的钩子initrd.img在我的 debian 中是否正确,但我找不到/etc/mkinitcpio.conf像 Archlinux 中的那个文件,debian 中这个文件的等价物是什么以及我如何重建 initrd.img 一旦我'编辑过那个文件吗?
我通读了这个流行的 IBM 文档(我在网上经常看到它被引用),解释了初始 RAM 磁盘的功能。
不过,我在概念化其工作原理时遇到了障碍。
在文档中它说
引导加载程序(例如 GRUB)识别要加载的内核并将此内核映像和任何关联的 initrd复制到内存中
我已经很困惑了:它是将整个内核复制到内存中还是只是其中的一部分?如果整个内核都在内存中,那么为什么我们甚至需要初始 RAM 磁盘?
我认为 initrd 的目的是能够拥有一个小的通用内核映像,initrd 将在加载内核映像之前在其中安装正确的模块。但是如果整个内核已经在内存中,为什么我们还需要 initrd?
这也带来了另一件让我困惑的事情——加载到内核中的模块在哪里?是否所有内核模块都存储在 initrd 中?
我正在按照Gentoo wiki制作我自己的 initramfs 。而不是熟悉的tarand gzip,页面告诉我使用cpioand gzip。维基百科说cpio2.6 内核的 initramfs 使用了它,但没有解释原因。
这只是一个约定还是cpio对 initramfs 更好?我还可以使用tarandgzip吗?
将根文件系统挂载ro在 initramfs(和 initrd)中的原因是什么。
例如,Gentoo initramfs 指南使用以下命令挂载根文件系统:
mount -o ro /dev/sda1 /mnt/root
Run Code Online (Sandbox Code Playgroud)
为什么不是下面的?
mount -o rw /dev/sda1 /mnt/root
Run Code Online (Sandbox Code Playgroud)
我可以看到可能有一个很好的理由(并且可能涉及switchroot),但是似乎没有任何地方记录。