从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像

发布时间: 更新时间: 总字数:1344 阅读时间:3m 作者: 分享 复制网址
专栏文章
  1. Linux kernel 介绍
  2. 如何快速的将Centos6.7快速升级3.10.9
  3. Centos7 切换内核
  4. Linux kernel 内核模块编译、装载和卸载
  5. 从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像(当前)
  6. Linux Kernel 源码介绍

从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像

环境

为了更直观的为你展示 busybox 编译好的内容,已将其制作为(参考)镜像 xiexianbin/busybox:1

Linux kernel 编译

解压

tar xvf linux-5.15.16.tar.xz
cd linux-5.15.16

安装依赖包

apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
  • fakerootfake root 环境模拟工具
  • build-essential:工具包,包括:C, C++, gcc, and g++
  • ncurses-dev:为基于文本的终端提供API的编程库。
  • xz-utils:提供快速的文件压缩和解压缩
  • libssl-dev:支持SSL和TSL加密数据,保证网络连接的安全性
  • bc(Basic Calculator):一种支持语句交互式执行的数学脚本语言
  • flex(Fast Lexical Analyzer Generator):生成将字符转换为标记的词法分析程序
  • libelf-dev:发布用于管理ELF文件(可执行文件、核心转储和目标代码)的共享库
  • bison:GNU解析器生成器,将语法描述转换为C程序

配置

  • 配置文件

使用内核目录下选择通用配置文件

cp arch/x86/configs/x86_64_defconfig .config

若是已经存在系统的编译,建议选择:

cp -v /boot/config-$(uname -r) .config
  • 修改内核配置文件,根据自己需要选择
make menuconfig

内核启用 ramdisk 支持步骤:

# 启用RAMfs,在主菜单执行
General setup  --->
  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support

# 启用 RAM dev,其中 65536 kbytes = 64 M,返回主菜单后执行
    Device Drivers  --->
      [*] Block devices  --->
        <*>   RAM block device support
        (16)    Default number of RAM disks
        (65536) Default RAM disk size (kbytes)

# 启用 ext3,返回主菜单后执行
    File systems  --->
      <*> The Extended 3 (ext3) filesystem
      [*]   Ext3 POSIX Access Control Lists
      [*]   Ext3 Security Labels

编译

使用4个CPU(-j4)编译:

$ make -j4
  DESCEND objtool
  CALL    scripts/atomic/check-atomics.sh
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
Kernel: arch/x86/boot/bzImage is ready  (#1)
$ ls -lhart arch/x86/boot/bzImage
-rw-r--r-- 1 root root 9.2M Jan 22 00:57 arch/x86/boot/bzImage

编译成功后,内核位于:arch/x86/boot/bzImage

编译命令如下:

  • make:编译 Linux kernel image 文件,即 vmlinuz
  • make modules:配置为 M 的选项编译成一个个的模块(选项 Y 的经编译进 vmlinuz,选项为 N 的忽略)。这些模块会链接新编译出来的 kernel image
  • make install:安装 vmlinuz 文件到 /boot 文件夹
  • make modules_install:安装模块文件到 /lib/modules/lib/modules/<version>

安装

若需要安装到本机上,执行如下命令:

# Install the required modules
sudo make modules_install

# install the kernel
sudo make install

# 更新 Bootloader
sudo update-initramfs -c -k 5.15.16
sudo update-grub

# 重启
sudo reboot

buysbox 编译

解压

tar xvf busybox-1.35.0.tar.bz2
cd busybox-1.35.0

配置

将 busybox 配置为静态编译

make menuconfig

选择:

Settings  --->
--- Build Options
[*] Build static binary (no shared libs)

Esc 退出保存

编译

make -j4 && make install

编译完成后,_install/ 目录就是 busybox 的根目录。

系统初始化

  • 目录补全
cd _install/
mkdir dev etc/init.d/ proc sys tmp mnt/sysroot -p
  • 初始化设备
mknod dev/console c 5 1
mknod dev/null c 1 3
mknod dev/tty1 c 4 1
  • 初始化挂载点
cat << EOF >> etc/fstab
# proc    /proc    proc    defaults    0    0
# sysfs   /sys     sysfs   defaults    0    0
tmpfs   /tmp     tmpfs   defaults    0    0
EOF
  • 初始化启动脚本
$ cat << EOF >> etc/init.d/rcS
#!/bin/sh

echo -e "Welcome to busybox"
/bin/mount -a
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
echo -e "Remounting the rootfs..."
mount -o remount,rw /
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
EOF
$ chmod 755 etc/init.d/rcS
  • 初始化 inittab
$ cat << EOF >> etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount ‐a ‐r
::restart:/sbin/init
EOF
$ chmod 755 etc/inittab

kvm 镜像制作

制作系统镜像(不包含内核)

cd ../..
qemu-img create -f raw busybox.raw 64M
mkfs -t ext4 ./busybox.raw
mkdir img
mount -o loop busybox.raw ./img
cp -rf ./busybox-1.35.0/_install/* ./img
umount ./img

PS:cp 后,使用 chroot ./img sh 进入 fs

验证,在 Ubuntu Desktop 中,执行:

$ qemu-system-x86_64 -m 1024 \
  -kernel ./linux-5.15.16/arch/x86_64/boot/bzImage \
  -initrd ./busybox.raw \
  -append "root=/dev/ram init=/linuxrc" \
  -serial file:output.txt

制作系统镜像(包含内核)

cd ../..
qemu-img create -f raw busybox.raw 256M
mkfs -t ext4 ./busybox.raw
mkdir img
mount -o loop busybox.raw ./img

PS:cp 后,使用 chroot ./img sh 进入 fs

安装内核

cd linux-5.15.16
make modules_install INSTALL_MOD_PATH=../img

安装 busybox

cd ../busybox-1.35.0
make CONFIG_PREFIX=../img install

参考上文做系统初始化

cd ../img
mkdir boot
cp ../linux-5.15.16/arch/x86/boot/bzImage boot

# 修改 rcS 文件中 mount -o remount,rw / 为:
mount ‐t ext4 ‐o remount,rw /dev/sda /

生产 grub2 文件,待完善

验证,在 Ubuntu Desktop 中,执行:

$ qemu-system-x86_64 -m 1024 \
  -initrd ./busybox.raw \
  -append "root=/dev/sda init=/linuxrc" \
  -serial file:output.txt

FaQ

end Kernel panic - not syncing:System is deadlocked on memory

内存不足。

end kernel panic not syncing: VFS: Unable to mount root fs on unknow block(1,0)

Initial RAM filesystem and RAM disk(65536) Default RAM disk size (kbytes) 配置不正确。

参考

  1. https://www.kernel.org/
  2. https://www.busybox.net/FAQ.html#build_system
  3. https://busybox.net/FAQ.html#emu
  4. https://buildroot.org/
专栏文章
  1. Linux kernel 介绍
  2. 如何快速的将Centos6.7快速升级3.10.9
  3. Centos7 切换内核
  4. Linux kernel 内核模块编译、装载和卸载
  5. 从源码编译内核 linux-5.15.16 并制作基于 KVM 的 busybox 镜像(当前)
  6. Linux Kernel 源码介绍
最新评论
加载中...
Home Archives Categories Tags Statistics