大家好,我是 Linux 内核编译的新手,所以我有一些问题:通过编译 Linux 内核,我们是否构建了一个完全独立的、不依赖于任何 Linux 发行版的操作系统?
如果是...那么当我想使用 initramfs 命令创建 initrd 文件时,为什么它会添加一些有关我正在运行的 linux 结构的信息(我正在运行 Ubuntu 10.4)?
我应该如何编译并向我已编译的 Linux 添加模块以及将它们放在哪里?
这是我一直在做的事情的总结:
1.获取内核源代码(3.4.1)并使用“make all”命令进行编译(我使用我当前的linux .config)
在我的记忆棒上安装 grub
将编译好的 bzImage 放到我的记忆棒的 /boot 目录中
使用“initramfs”命令创建initrd文件并将其也放入/boot中。
使用记忆棒启动我的电脑并进入 grub> 终端
使用“root (hd0,0)”;“kernel /boot/bzImage”;“initrd /boot/initrd.img”然后“boot”命令进行启动。
进入(initramfs)终端后出现错误,提示无法找到“/lib/modules/3.4.1/modules.dep”文件!!!
我究竟做错了什么 ?
答案1
通过编译 Linux 内核,我们是否可以构建一个完全独立的、不依赖于任何 Linux 发行版的操作系统?
不是。Linux 本身不是一个操作系统。它只是一个内核。用户空间,包括一系列系统库和基本软件,对于促进您与计算机的交互必不可少。当我们提到“Linux”时,我们通常指的是一个称为 GNU 项目的独立项目。从技术上讲,我们应该(有些人确实)称之为“GNU/Linux”。
好吧,当我想使用 initramfs 命令创建 initrd 文件时,为什么它会添加一些有关我正在运行的 linux 结构的信息(我正在运行 Ubuntu 10.4)?
因为您的 initrd 包含一组程序,这些程序会在启动时初始设置您的系统、加载必要的驱动程序和守护程序、查找和挂载硬盘上的必要分区等。它实际上不仅针对您的发行版进行了定制,还针对您的特定安装、配置和计算机进行了定制。它通常不能与任何其他人的 initrd 互换。这就是为什么它必须由您的系统生成的原因。
我应该如何编译并向我已编译的 Linux 添加模块以及将它们放在哪里?
如果您正在编译自己的内核,那么大概您make menuconfig
在编译之前就在内核源目录中进行操作,这允许您选择要编译哪些功能,以及是否将它们集成到内核二进制文件中或作为模块提供。
这是我一直在做的事情的总结:
有多种原因会导致它无法按照您希望的方式进行。
获取内核源代码(3.4.1)并使用“make all”命令进行编译(我使用我当前的 linux .config)
如果您运行的是 Ubuntu 10.04,它比 Linux 内核的 3.x 分支早很多,更不用说 3.4 了。它很可能无法正常工作,至少在没有大量额外工作的情况下无法正常工作。配置文件也发生了很大变化,老实说,我很惊讶它没有抛出关于您的配置文件(大概是针对 Linux 2.6)中的内容与 3.4 中的内容不匹配的错误。此外,您可能希望下载 Ubuntu 的内核源代码包,而不是来自 kernel.org 的普通内核源代码,因为 Ubuntu 修补了内核以包含所需的功能并使其与系统中的所有其他内容兼容。最后,您缺少一些步骤,我稍后会介绍。
将编译好的 bzImage 放到我的记忆棒的 /boot 目录中
我不确定你这样做的目的是什么,但如果是想在你的记忆棒上安装一个完全可启动的 Linux,那就需要做更多的事情了——例如,你的记忆棒上根本没有任何用户空间的东西。如果设置正确,它实际上会(尝试)在你的硬盘上运行 Ubuntu 安装,而内核则在你的记忆棒上。我相信这应该可行,但为什么要这样做,而不是直接在硬盘上安装内核呢?你可以将它与现有的内核并排安装,这样你就可以自由地在它们之间切换。
进入(initramfs)终端后出现错误,提示无法找到“/lib/modules/3.4.1/modules.dep”文件!!!
这又回到我之前提到的遗漏步骤。您需要将make modules_install
新内核的模块放入 中/lib/modules
。
然而...
这些都不重要,因为理想情况下,除非您有非常特殊的需求,否则您根本不应该以“传统”方式编译内核。如今,如果您确实需要编译自己的内核,大多数发行版都有一种方法可以做到这一点,即使用其自定义内核版本(如果适用),自动执行构建过程,将内核安装为软件包,以便您可以根据需要干净地安装和删除它,并配置您的引导加载程序以让您选择新内核或旧内核。在 Ubuntu 中,您应该遵循以下说明:内核/编译 - Ubuntu Wiki
这并不是说你不能以“老式”的方式编译内核,只是为了好玩或为了教育目的——我就是那样编译了我的第一个内核,但那是在有更好的方法之前。如果你的系统不被破坏对你来说很重要,请使用你发行版的推荐方法,使用他们的源代码,并使用他们的包管理。
答案2
当您重新编译或编译 Linux 内核时,您不会创建新的发行版。您只是制作了内核的更新版本或不同版本。内核是一个单独的文件,在您的 PC 完成 POST 过程后,引导加载程序会加载并执行该文件。
发行版由很多其他文件组成,包括标准 UNIX 实用程序(通常是包管理器)和其他文件。如果您(重新)编译自己的内核,则不会影响上述任何内容。
我已经有一段时间没有编译自己的内核了,但是我认为您需要在命令depmod -a
后运行make
。