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 support
和 Serial 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 那一项即可。