Linux 发行版不使用 initramfs,直接启动

Linux 不使用 initramfs,直接启动

现在大多数 Linux 发行版在启动时需要使用 initramfs(Gentoo 默认不需要),然后从 initramfs 里 chroot 到硬盘系统。于是我想不使用 initramfs,省掉解压 initramfs、chroot 的步骤,这对于追求完美主义的程序员来说是有必要的。

提示:必须自己编译内核,并且有 linux 启动方面的一些知识,或有内核配置经历。两者都没有的完全小白请勿尝试,小心搞得电脑无法启动。

我的 Linux 是 kali linux,intel i7 8 核 cpu,内核版本为:uname -r:6.6.9-amd64编译时为了加快速度,使用内存盘编译内核。如果担心自己编译失败,应该把编译内容放在自己的硬盘里,否则重启之后就没有了。

下载内核源码

进入内存盘:cd /dev/shm,提醒:如果担心自己编译失败,应该在自己硬盘里找位置编译。

查看内核版本:

$ uname -r
6.6.9-amd64 # 记得把下文的这一部分替换为自己的

Debian 系下载源码:

$ apt source linux-image-amd64
$ ls
linux-6.6.9  linux_6.6.9-1kali1.debian.tar.xz  linux_6.6.9-1kali1.dsc  linux_6.6.9.orig.tar.xz
$ rm *.tar.xz *.dsc
$ cd linux-6.6.9

初始配置

复制配置:

$ cp /boot/config-6.6.9-amd64 .config

关闭模块签名:

$ ./scripts/config --file .config --set-str SYSTEM_TRUSTED_KEYS ''
$ ./scripts/config --file .config --set-str SYSTEM_REVOCATION_KEYS ''

给内核名字设置后缀,就是 uname -r 里那三个数字之后的:

$ ./scripts/config --file .config --set-str LOCALVERSION "-amd64-noinitrd"

进行驱动配置

为完成直接启动,需要把硬盘驱动、文件系统驱动都加进去。

以我的电脑为例,硬盘为 nvme,也就是 lsblk 命令下根目录为 nvme,现在一般不是 nvme 就是 sata;根目录文件系统为 ext4,另外为了方便我也编译了 btrfs,因为我的 home 目录是 btrfs

$ make menuconfig

选择倒数第三行 Device Drivers

对于 NVME 硬盘,进入 NVME Support;对于 SATA 硬盘,进入 SCSI device supportSerial ATA and Parallel ATA drivers (libata),把里面所有能选为 built-in 的都选为 built-in(error reporting 这种可以不选),以 NVME 为例:

按两次 Exit 后进入 File Systems

把 ext4 那一项改成 built-in;对于我来说还编译了 btrfs,也给 btrfs 能选的都选上并 built-in:

Centos 等发行版需要改 xfs;两次 exit 并保存配置。

编译、安装

$ make bzImage -j8 # 8 核 cpu

因为版本一样,所以驱动也可以直接链接:

$ sudo ln -s /usr/lib/modules/6.6.9-amd64 /usr/lib/modules/6.6.9-amd64-noinitrd

安装内核(不建议):

$ sudo make install

安装内核(建议):

$ sudo cp arch/x86/boot/bzImage /boot/vmlinuz-6.6.9-amd64-noinitrd
$ sudoedit /boot/grub/grub.cfg

参考你的第一个 menuentry,复制这一段放到它下面,并且做如下修改:

  • 删除最后 initrd 那两行
  • linux 那一行里把 root 改为设备名,前边的内核文件改为自己编译的内核文件名
  • 第一行的名字改一下

保存,重启,选择 no initrd 那一项即可。

参考

Linux 内核动手编译实用指南https://linux.cn/article-16252-1.html

posted @ 2024-06-26 21:09  KZ25T  阅读(2)  评论(0编辑  收藏  举报