整个内核在启动时是否已加载到内存中?


14

我通读了这份流行的IBM文档(我在网络上经常看到该文档),解释了初始RAM磁盘的功能。

我在构想这是如何工作的过程中碰壁了。

在文档中说

引导加载程序(例如GRUB)标识要加载的内核,并将该内核映像和任何相关的initrd复制到内存中

我已经很困惑:它将整个内核复制到内存中还是仅复制其中一部分?如果整个内核都在内存中,那为什么我们还需要初始的RAM磁盘?

我认为initrd的目的是为了拥有一个小的通用内核映像,并且initrd会在加载内核映像之前在其中安装正确的模块。但是,如果整个内核已经在内存中,为什么我们需要initrd?

这也引起了另一件事,使我感到困惑-装入内核的模块在哪里?是否所有内核模块都存储在initrd中?


是。整个内核。和它的第一个rootfs。但是linux内核已经有很多年没有使用initrd了。
mikeserv '16

是的,我正在阅读。它在很大程度上被initramfs取代了吗?而且它与initramfs相似的过程仍然正确吗?
user1028270

1
自2.6系列以来,它已被所有内核完全取代。但是该过程有点类似,除了initramfs从未卸载-它始终存在且始终处于根目录。实际上,您必须在其上挂载root开发人员。也有不需要模拟单独的块dev和类似的好处。
mikeserv '16

很酷,我将阅读您链接到的那篇文章。那么内核模块存储在initramfs rootfs中吗?
user1028270

1
@edwardtorvalds-多数民众赞成udev通常由自动处理,是的。
mikeserv '16

Answers:


17

整个内核通常会在启动时加载到启动时的内存中initramfs。(仍然可以将系统设置为不带引导程序启动,initramfs但这在台式机和服务器上是不常见的。)

initramfs的作用是提供所需要安装的‘真实’的文件系统,并继续引导系统的功能。这涉及内核模块以及各种二进制文件:您至少需要udev,也许需要一些网络连接,并且kmod需要加载模块。

可以在引导之后将模块加载到内核中,因此不需要对内核进行任何特殊的准备initramfs。它们可以存储在任何地方:initramfs/lib/modules如果要开发模块,则在实际文件系统上的开发树中。... initramfs仅需要包含安装根文件系统所需的模块(包含其余文件)。


好的,这对我来说很有意义。我想我正在将内核映像和它使用的文件系统混合在一起,这显然是完全分开的。
user1028270 '16

5

整个内核(而不是其模块)将被加载到内存中。如果在任何文件系统可用之前内核需要一些模块(这通常意味着文件系统及其设备的驱动程序),则这些模块将位于initramfs中(位于内存中),并且内核将从那里加载它们。以后可以从文件系统中加载其他模块。


3

现代Linux设置中的内核高度依赖于模块,即,适当的内核(在启动时加载到RAM中)仅包含最低限度的功能,其余所有功能均编译为模块(可在运行时加载)。为了使该功能即使在引导所需的设备或文件系统是模块的情况下initramfs也能正常运行,内核中已加载了一个内核(顾名思义,这是一个带有简单文件系统的RAM区域,安装在引导中)。该临时文件系统安装在上/,并包含启动程序和所需的模块。一旦启动initramfs完成,Linux将执行pivot_root(8),将实际内容装满/并扔掉initramfs内容。

这种复杂性的意义在于,例如,一个发行版可以编译一个内核(最小内核和完整的模块集),并且在安装内核时创建initramfs针对硬件和目标机器设置的定制程序。由于设备和“个人计算机”的配置种类繁多,所有这些都是必需的。


它没有pivot_root
mikeserv '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.