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 那一項即可。
參考
Linux 核心動手編譯實用指南:https://linux.cn/article-16252-1.html