Linux內核學習(3)最小系統制作1 啓動initrd

參考書籍:《深度探索Linux操作系統 系統構建和原理解析》
參考博文:https://blog.csdn.net/lixiangminghate/article/details/55224412

(一)配置內核方式介紹
1.按照芯片使用默認配置,代碼中本身內置了支持的多類芯片,可以在/arch/XXX(平臺名,例如arm)/configs/xxx(Soc名,如bcm2835)
(1)make x86_64_defconfig
(2)make bcm2835_defconfig
2.使用最低配置,這種情況下會刪除所有無用配置,只保留最基本的配置,需要什麼功能需要開發人員從零開始添加。
(1)make allnoconfig
3.拷貝配置,一般情況如果已經有一個一個可以工作的系統,可以直接從工作機上拷貝.config文件放到編譯目錄下。

(二)開發環境介紹
1.使用win7_64的筆記本搭建Virtualbox虛擬機,安裝Ubuntu16.04系統作爲編譯環境。
2.由於虛擬機重啓方便,最小系統的運行機也由虛擬機承擔,編譯內核版本選擇4.15.0,使用/xxx作爲工作目錄。
3.Linux的啓動方式一般有兩種,Bios+MBR+Grub的引導機制,這種一般都是搭載Bios的PC機上使用的;另一種啓動方式是使用uboot的引導機制,使用此機制的一般是嵌入式Linux機。
(1)Bios+MBR+Grub引導,簡要說明就是Bios設定啓動磁盤,MBR設置引導分區,Grub設置內核文件位置以及根文件系統位置,三個模塊層層遞進各司其職。
(2)uboot因爲一般用在不那麼複雜的嵌入式設備中,所以有uboot實現上述所有功能。

(三)構建系統
1.當使用最小配置make allnoconfig時,書上的內核版本是3.7.4,而我的版本是4.15.0,但是配置後運行並沒有成功,控制檯上並沒有任何顯示,而且配置項上下文的內容也和書上不一致,猜測內核版本升級後部分內容不能按照書上進行配置,由於剛開始學習,所以很多配置項並不熟悉,於是我採用系統默認配置方式進行,也即x86_64_defconfig,從大小上可以看出區別,最小配置(make allnoconfig)內核大小約1.2M,而x86系統默認配置(make x86_64_defconfig)的內核有7.9M。所以理論上的最小系統制作應該是使用最低配置然後添加系統需要的驅動和應用,我這邊先偷個懶使用默認內核。
2.要測試內核是否生效,可以測試initrd.img是否運行,這裏通過構建initrd.img在啓動initrd的時候打印hello,可以進一步瞭解內核允許方式。
(1)創建initramfs文件夾,編寫hello.c
mkdir initramfs
vim hello.c
在這裏插入圖片描述
(2)編譯成靜態文件hello

gcc hello.c -o hello -static

(3)壓縮成cpio格式的initrd文件

cp hello initramfs/
find . |cpio -o -H newc|gzip ../initrd.img

3.單獨建立分區作爲啓動分區
(1)進入根目錄新建文件夾

cd /
sudo mkdir vita

(2)使用gparted新建分區,並掛載在/vita上
① 新建/dev/sda3分區

在這裏插入圖片描述
② 掛載在/vita下(可以寫到/etc/rc.local作爲啓動命令)

mount /dev/sda3 /vita

4.拷貝內核bzImage和initrd.img到新啓動分區中

cd /vita
sudo mkdir boot
sudo cp /xxx/linux-source-4.15.0/arch/x86/boot/bzImage /vita/boot/
sudo cp /xxx/initrd.img /vita/boot/

5.修改grub.cfg選擇啓動目錄
(1)注意這裏和書上有些不同,書中可以直接指定位置如下:
在這裏插入圖片描述
但是我設置後提示找不到內核設備,顯示如下:
在這裏插入圖片描述
而我參考ubuntu本身的啓動代碼:
在這裏插入圖片描述

可以看到啓動分區使用UUID=xxx來表示的,所以參照這種方式修改UUID的內容即可,要獲得UUID可以在gparted中找到。
在這裏插入圖片描述
還要注意一點,最好直接拷貝原來的menuentry一份作爲新的菜單項,我簡化了裏面的內容後依然找不到內核。
例如簡化成下面:
在這裏插入圖片描述
這樣還是無法工作,所以使用拷貝進行修改:
在這裏插入圖片描述
這樣就可以正常啓動了,啓動後顯示如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章