编译linux内核

https://zhuanlan.zhihu.com/p/510289859

sudo apt-get install gcc-aarch64-linux-gnu

sudo apt-get install libncurses5-dev build-essential git bison flex libssl-dev

tar -xjf busybox-1.33.1.tar.bz2

cd busybox-1.33.1

nano check-lxdialog.sh

make menuconfig

Settings --->

\* Build static binary (no shared libs)

在配置中禁用 tc(最简单、推荐)

既然编译不过,我们直接不编译这个模块。

运行 make menuconfig(如果之前报错,请参考上文安装 libncurses5-dev)。

进入以下路径:

Networking Utilities --->

tc (按 N 键取消勾选)

linux内核编译:

sudo tar -xvf linux-6.13.1.tar.xz -C /usr/src

make defconfig ARCH=arm64

将下面的配置加入.config文件中

CONFIG_DEBUG_INFO=y

CONFIG_INITRAMFS_SOURCE="./root"

CONFIG_INITRAMFS_ROOT_UID=0

CONFIG_INITRAMFS_ROOT_GID=0

sudo make menuconfig

sudo make -j$(nproc)

busybox工具编译:(定制文件系统)

编译完成,在busybox目录下生成_install目录

定制文件系统

为了init进程能正常启动, 需要再额外进行一些配置

根目录添加etc、dev和lib目录

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install 1:02:17

$ mkdir etc dev lib

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install 1:02:17

$ ls

bin dev etc lib linuxrc sbin usr

在etc分别创建文件:

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc 1:06:13

$ cat profile

#!/bin/sh

export HOSTNAME=bryant

export USER=root

export HOME=/home

export PS1="$USER@$HOSTNAME \\W\# "

PATH=/bin:/sbin:/usr/bin:/usr/sbin

LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH

export PATH LD_LIBRARY_PATH

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc 1:06:16

$ cat inittab

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc 1:06:19

$ cat fstab

#device mount-point type options dump fsck order

proc /proc proc defaults 0 0

tmpfs /tmp tmpfs defaults 0 0

sysfs /sys sysfs defaults 0 0

tmpfs /dev tmpfs defaults 0 0

debugfs /sys/kernel/debug debugfs defaults 0 0

kmod_mount /mnt 9p trans=virtio 0 0

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc 1:06:26

$ ls init.d

rcS

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/etc 1:06:30

$ cat init.d/rcS

mkdir -p /sys

mkdir -p /tmp

mkdir -p /proc

mkdir -p /mnt

/bin/mount -a

mkdir -p /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

这里对这几个文件做一点说明:

busybox 作为linuxrc启动后, 会读取/etc/profile, 这里面设置了一些环境变量和shell的属性

根据/etc/fstab提供的挂载信息, 进行文件系统的挂载

busybox 会从 /etc/inittab中读取sysinit并执行, 这里sysinit指向了/etc/init.d/rcS

/etc/init.d/rcS 中 ,mdev -s 这条命令很重要, 它会扫描/sys目录,查找字符设备和块设备,并在/dev下mknod

dev目录:

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/dev 1:17:36

$ sudo mknod console c 5 1

这一步很重要, 没有console这个文件, 用户态的输出没法打印到串口上

lib目录:拷贝lib库,支持动态编译的应用程序运行:

bryant @ ubuntu in ~/Downloads/busybox-1.33.1/_install/lib 1:18:43

$ cp /usr/aarch64-linux-gnu/lib/*.so* -a .

CONFIG_INITRAMFS_SOURCE是指定kernel ramdisk的位置,这样指定之后ramdisk会直接被编译到kernel 镜像中。

我们将之前制作好的根文件系统cp到root目录下:

bryant @ ubuntu in ~/Downloads/linux-arm64 on git:main x 1:26:56

$ cp -r ../busybox-1.33.1/_install root

执行编译

make ARCH=arm64 Image -j8 CROSS_COMPILE=aarch64-linux-gnu-

这里指定target为Image 会只编译kernel, 不会编译modules, 这样会增加编译速度

相关推荐
网络安全零基础教程15 分钟前
网络安全春招面试避坑与复盘指南
linux·网络·安全·web安全·面试·职场和发展
扛枪的书生33 分钟前
TigerVNC 安装流程
linux
Mortalbreeze40 分钟前
深入 Linux Socket 编程:端口号、网络字节序与 struct sockaddr 详解
linux·服务器·网络·c++
躺柒1 小时前
读半导体简史08大型机
linux·服务器·c语言·数据库·unix·ibm
井川廊咏1 小时前
【总集篇】Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户(补档)
linux·运维·服务器
Kina_C1 小时前
LVS负载均衡的十二种核心调度算法
linux·运维·算法·负载均衡·lvs
shencz20001 小时前
用bc脚本求解大质数
linux
AOwhisky2 小时前
Linux(CentOS)系统管理入门笔记(第十五期)——文件系统与存储管理(上篇):设备识别、挂载与文件查找
linux·运维·笔记·centos·文件系统
寒水馨2 小时前
Linux下载、安装 Bun v1.3.14(附安装包bun-linux-x64.zip)
linux·javascript·typescript·node.js·bun·运行时·包管理器
Dear~yxy3 小时前
LVS企业级实战
linux·服务器·lvs