从源码编译内核 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
fakeroot
:fake 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
$ 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)
配置不正确。