是否可以单独安装Linux内核?

ces*_*sar 55 linux-kernel

我只是好奇是否可以单独安装 Linux 内核,或者您是否需要使用其中一种风格。如果可能,你会怎么做?我不需要详细的教程。我只是想知道它在概念上是如何完成的。我不擅长底层的东西,想知道你是如何将操作系统安装到计算机中的。我想这与MBR有关。

哦,我注意到很多答案都暗示了一些最小 Linux 的某个发行版。我可能应该说我不打算安装一个最小的或裸机的 Linux。这个问题纯粹是理论上的。不过,我真的很感激所有的答案,如果我想安装一个真正个性化的 Linux,我会立即参考它们。

Sha*_*off 59

从技术上讲,您可以仅安装引导加载程序和内核,但是一旦内核启动,它就会抱怨无法启动“init”,然后它就坐在那里,您无法使用它做任何事情。

顺便说一句,它是 MBR 中引导加载程序的一部分。内核位于磁盘常规区域的某处。引导加载程序被配置为知道它在哪里,因此它可以加载内核并执行它。

  • @ ps06756 如果您有 initramfs,那不是问题所问的“单独”内核。如果 initramfs 有一个 init,内核就不会抱怨。 (4认同)

Sha*_*dur 21

我不认为你完全理解你在问什么,但你可能想看看Linux From Scratch项目。


Law*_*ceC 16

如果您问是否可以只在现有系统上安装或升级内核而不安装一堆其他程序?

Linux 内核是一个二进制文件,通常vmlinuz-x.x.x-x-nameboot目录(通常是硬盘驱动器开头的单独小分区)中命名,其中 x 是版本号。“名称”只是内核的一个选定名称,可以在编译时设置,您可以使用它来识别内核用于哪种类型的机器或架构或任何其他原因。

它在引导时由引导加载程序加载,通常GRUB由 BIOS ROM 调用的 MBR 中的引导代码调用。一旦加载,它就不会“保持打开状态”或受到特殊保护。所以你可以用另一个工作内核替换那个文件。但是,GRUB有一个很酷的功能,可以让您选择多个内核来引导。因此,将您的附加内核添加到该列表中是非常明智的,但请保留原来的已知工作内核,以防万一出现问题。

我相信几乎所有的发行版都会制作一个“模块化”内核,其中设备驱动程序位于单独的文件中。因此,大多数内核需要一个包含启动时可用的驱动程序的文件系统,这就是“initrd”(初始 RAM 磁盘)或“initramfs”的用途。 GRUB将在内存中的某个位置加载内核,在不同位置加载 initrd,然后跳转到内核,告诉它 initrd 在哪里,启动 Linux。

驱动程序也可以“内置”到内核中,因此在引导加载程序加载vmlinuz映像时会自动加载并可用。旨在在不同系统上工作的内核(例如大多数发行版的内核)通常会最小化内核中的内置内容,因为可用硬件将在引导过程稍后扫描,并且只会加载代表当前硬件的模块。

有一些工具可以修改和创建 initrd。Debian 有很好的工具,我想其他发行版也有。

因此,如果您从 kernel.org 下载更新的内核并编译它以创建新的内核二进制映像,则需要使用与该内核一起工作的驱动程序制作或更新 initrd。旧的 initrd 将无法工作,因为驱动程序必须与正在运行的内核版本相匹配。

initrd 文件的命名initrd.img-x.x.x.x-name与内核相似,并且可以像内核一样在启动后被替换,最佳实践表明您在知道可以成功启动到新内核 + initrd 之前不要删除已知的工作 initrd。

我希望这提供了一些背景。

如果您正在寻找一个“准系统”Linux 安装,它几乎没有安装其他程序,我最喜欢的选择一直是安装 Debiannetinst映像。您几乎只有运行命令行文本控制台和nano作为文本编辑器所需的最基本工具。


Cir*_*郝海东 8

单个可执行 rootfs

/init正如我在Single Application Linux | 中解释的那样,绝对最小系统运行单个程序。超级用户

最小的 Linux Live

https://github.com/ivandavidov/minimal

对于更有趣的交互系统,这是一个(主要是教育性的)小脚本:

  • 下载内核和busybox的源代码
  • 编译它们
  • 用它们生成可引导的 8Mb ISO

然后 ISO 将您留在一个带有 busybox 的最小外壳中。

使用 QEMU,您可以轻松引导到系统。

我已经修改它以允许从内核源目录运行它:https : //github.com/cirosantilli/runlinux

用法:

git clone https://github.com/ivandavidov/minimal
cd minimal/src
./build_minimal_linux_live.sh
# Wait.
# Install QEMU.
# minimal_linux_live.iso was generated
./qemu64.sh
Run Code Online (Sandbox Code Playgroud)

您将被留在 QEMU 窗口中,并带有新的最小系统。惊人的。

由于它很小,这是阅读源代码并了解正在发生的事情的好选择。

在 Ubuntu 16.04 上测试。

构建根

https://buildroot.org/

管理以下内容的大量 Makefile 脚本:

  • GCC 交叉编译工具链
  • 内核编译
  • 引导加载程序编译
  • rootfs的生成
  • 在源代码树中有大量的包下载/构建配方,包括像 GTK 这样的复杂内容。有一个依赖系统。

最小的例子:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2016.05
make qemu_x86_defconfig
# Can't use -jN, use `BR2_JLEVEL=2` instead.
BR2_JLEVEL=2 make
# Wait.
# cat board/qemu/x86_64/readme.txt
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
# You are now in a shell with BusyBox utilities.
Run Code Online (Sandbox Code Playgroud)

它甚至有从头开始构建 X11 的方法:如何在我自己的 Linux Buildroot 系统上安装 X11?

专业的东西。

阿尔卑斯Linux

https://github.com/gliderlabs/docker-alpine

带有包管理器的嵌入式发行版,提供来自网站的预编译二进制文件。

也可以看看


Tob*_*ght 5

无需常用的用户空间工具即可安装 Linux 内核。这通常在路由器等嵌入式系统中完成。通常,内核是从 ROM 或闪存加载的,并且已针对相关设备进行了定制(通常将所需的驱动程序编译到内核中,而不是作为模块加载)。

至少需要存在一个用户空间程序,以成为“init”进程(不一定被调用init,而是由内核作为进程 1 启动,并且是任何孤立进程的自动父进程) - 除非内核已被修改(而不是而不是简单的定制)而不需要这个。

当然,没有必要有一个可用的 shell 来拥有一个可运行的基于 Linux 的设备,尽管它可以使开发变得更加容易!