《linux系统内核设计与实现》安装linux内核源码

上一篇:《linux系统内核设计与实现》第二章-从内核触发-CSDN博客 一直没有安装成功,笔者又四处学习,终于成功安装linux内核了,记录下来。

1 开发环境

开发环境:ubuntu 22.04

linux源码版本:linux-4.9.229

busybox源码版本:busybox-1.30.0

qemu-system-x86_64版本:7.2.0

这些源码自行下载安装,贴一个linux源码下载链接:Index of /pub/linux/kernel/

建议使用root用户

2 安装linux源码

下载到本地,解压,然后进入linux-4.9.229目录

1.指定硬件体系架构。

为了减少安装编译器的过程,本例中使用的是x86,因为开发环境就是x86。如果要编译arm的内核,则指定ARCH=arm且需要安装交叉编译器。

export ARCH=x86

2.配置board config,此处配置为 x86_64_defconfig。好了,点好菜了,菜单就是x86_64_defconfig

make x86_64_defconfig

3.配置内核

这一步其实是对第2步的菜单进行微调,需要内核支持ramdisk驱动,所以需要选中如下配置:

make menuconfig

然后分别选中

General setup  --->

       ----> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

使用上下键移动,空格键选择M、*;

其中 *表示模块驱动编译到内核中,启动时自动加载;

M表示标识作为内核模块编译;

空格:表示该功能不编译到内核中,即新的内核将不支持该功能。

    Device Drivers  --->

       [*] Block devices  --->

               <*>   RAM block device support

               (65536) Default RAM disk size (kbytes) 

这里选的是*,可能后面再加载的时候会出现:

end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0),

再选成M,重新编译

4.编译内核

make
make -j 10        # 同时运行最多10个编译任务

编译成功后的内核位于:arch/x86_64/boot/bzImage

3 安装buybox

下载buysbox源码,下载地址:

https://busybox.net/downloads/

笔者使用的版本是busybox-1.30.0

也可在线下载

1.解压buysbox源码

wget  https://busybox.net/downloads/busybox-1.30.0.tar.bz2

tar -xjvf busybox-1.30.0.tar.bz2

2.配置buysbox源码

在这里把busybox配置为静态编译,这样busybox在运行的时候就不需要额外的动态链接库了。

make menuconfig

Busybox Settings  --->
      Build Options  --->
            [*] Build BusyBox as a static binary (no shared libs)

3.编译和安装

make -j 10         # 编译

make install       # 安装

这里编译的时候会有一处错误,笔者之前已经修复了,可参考:busybox 编译提示 undefined reference to `stime‘ 解决方法_busybox编译报错undefined reference to `stime-CSDN博客

和 busybox - BusyBox: The Swiss Army Knife of Embedded Linux

4.编译完成后的busybox就安装在源码根目录下的_install目录了;

进入_install目录,补充一些必要的文件或目录,相关的shell命令如下:

# mkdir etc dev mnt
# mkdir -p proc sys tmp mnt
# mkdir -p etc/init.d/
# vim etc/fstab
proc        /proc           proc         defaults        0        0
tmpfs       /tmp            tmpfs        defaults        0        0
sysfs       /sys            sysfs        defaults        0        0

前三行是创建一下文件夹,第四行是创建文件,将后面的内容粘进去

继续

# vim etc/init.d/rcS
echo -e "Welcome to tinyLinux"
/bin/mount -a
echo -e "Remounting the root filesystem"
mount  -o  remount,rw  /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

继续

# chmod 755 etc/init.d/rcS
# vim etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

继续

# chmod 755 etc/inittab
# cd dev
# mknod console c 5 1
# mknod null c 1 3
# mknod tty1 c 4 1

这样一个最小的、完整的可以被内核启动的文件系统就准备好了。

4 打包文件系统并通过qemu启动linux系统

制作根文件系统镜像文件。

思路:

1.先制作一个空的镜像文件;

2.然后把此镜像文件格式化为ext3格式;

3.然后把此镜像文件挂载,并把根文件系统复制到挂载目录;

4.卸载该镜像文件。

5.打成gzip包。

此脚本在_install的父级目录

下面命令可一句一句执行,也可写成bash脚本

rm -rf rootfs.ext3
rm -rf fs
dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
mkdir fs
mount -o loop rootfs.ext3 ./fs
cp -rf ./_install/* ./fs
umount ./fs
gzip --best -c rootfs.ext3 > rootfs.img.gz

结果

最终生成的文件系统镜像名字为:rootfs.img.gz

接下来在ubuntu上执行(根据自己的路径修改)

qemu-system-x86_64 -kernel ./linux-4.9.229/arch/x86_64/boot/bzImage -initrd ./busybox-1.30.0/rootfs.img.gz -append "root=/dev/ram init=/linuxrc" -serial file:output.txt

完成

5 linux内核源码各个目录功能

查看大小

du -sh

1 arch目录:体系相关的代码,不同硬件平台

以arm为例:

boot目录:是arm平台启动的代码

以mach开头的目录:不同的公司基于ARM芯片出的硬件平台。mach-s3c24xx是三星基于arm出的

硬件平台;mach-imx是菲斯克

Documentation:针对内核的说明

3 firmware:固件相关代码

4 init:汇编调到这里。应用层,main函数。内核通用入口:start_kernel(void)

do_mount.c:文件挂载

5 Kconfig:内核编译的一部分

6 security:安全相关代码

7 usr:测试代码

8 block:块设备相关代码

9 driver:驱动代码

​​​​​​​

10 fs:文件系统相关的代码。内核引导的工具+ext3/ext4。以人类容易理解的目录/文件访问存储设备。

11 ipc:进程通信的代码

12 kernel:内核代码。

linux-4.9.229/arch/arm/kernel是arm系统相关的内核通用代码。

13 net:网络相关代码

14 sound:声卡相关代码

15 crypto:加密解密相关代码

17 include:内核头文件相关代码

18 lib:通用库

19 mm:内存管理相关代码

20 scripts:脚本相关代码

21 tools:工具

​​​​​​​

参考:

[1] 从源码编译linux-4.9内核并运行一个最小的busybox文件系统(最新整理版) - 哔哩哔哩 (bilibili.com)

[2] linux内核开发第1讲:从源码编译 linux-4.9.229 内核和 busybox 文件系统_哔哩哔哩_bilibili

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值