Linux 發行版不使用 initramfs,直接啟動

KZ25T發表於2024-06-26

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

相關文章