Linux内核学习(3)最小系统制作1 启动initrd

本文详细介绍了在Ubuntu环境下构建Linux内核的过程,包括配置内核、编译内核、构建initrd.img以及设置启动分区的具体步骤。同时,文章对比了不同配置方式下内核的大小,并解释了如何正确修改grub.cfg以确保内核能够成功加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考书籍:《深度探索Linux操作系统 系统构建和原理解析》
参考博文:https://blog.youkuaiyun.com/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系统作为编译环境。

a:安装参考:https://blog.youkuaiyun.com/weixin_44071580/article/details/126815582
b:虚拟机开启共享粘贴参考:https://blog.youkuaiyun.com/OrdinaryMatthew/article/details/124040107
c:linux kernel 镜像下载参考:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/
d:linux kernel下载编译参考:https://blog.youkuaiyun.com/m0_63257288/article/details/129345104

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分区(参考:https://blog.youkuaiyun.com/m0_65274357/article/details/131965463)

在这里插入图片描述
② 挂载在/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一份作为新的菜单项,我简化了里面的内容后依然找不到内核。
例如简化成下面:
在这里插入图片描述
这样还是无法工作,所以使用拷贝进行修改:
在这里插入图片描述
这样就可以正常启动了,启动后显示如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值