2. 车载Linux内核源码获取与首次编译
任务目标
在嵌入式Linux开发中,根文件系统是系统启动后挂载的第一个文件系统,包含init进程、Shell及必要工具。本案例使用BusyBox构建一个最小根文件系统,并通过initramfs方式让内核直接挂载启动,验证系统能够正常进入Shell交互界面。
环境与依赖
- Linux主机(Ubuntu 20.04+,x86_64或aarch64均可)
- 交叉编译工具链(若目标为ARM,使用
arm-linux-gnueabihf-gcc;本机运行则使用系统自带gcc) - BusyBox源码(
busybox-1.36.1.tar.bz2) - Linux内核源码(用于编译测试内核,可选,若已有内核可跳过)
实现步骤
1. 下载并配置BusyBox
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
make defconfig
# 如需静态编译(推荐,避免动态库依赖):
sed -i 's/# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config
make -j$(nproc)
2. 构建根文件系统目录结构
# 创建根文件系统目录
mkdir -p rootfs/{bin,sbin,usr/bin,usr/sbin,etc/init.d,proc,sys,dev,lib,root,tmp}
# 安装BusyBox到rootfs
make CONFIG_PREFIX=$PWD/rootfs install
# 添加必要设备节点(静态编译时devtmpfs会自动挂载,但保留基本节点更稳妥)
sudo mknod -m 666 rootfs/dev/console c 5 1
sudo mknod -m 666 rootfs/dev/null c 1 3
3. 创建init脚本
cat > rootfs/init << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
echo "=== Minimal Rootfs Booted ==="
exec /bin/sh
EOF
chmod +x rootfs/init
4. 打包为initramfs并启动
# 打包为cpio归档
cd rootfs
find . | cpio -H newc -o --owner root:root > ../initramfs.cpio
cd ..
gzip -9 initramfs.cpio
# 使用QEMU启动(以x86_64为例,需先安装qemu-system-x86)
qemu-system-x86_64 -kernel /path/to/bzImage -initrd initramfs.cpio.gz -append "console=ttyS0 rdinit=/init" -nographic
验证方法
启动后观察串口输出,若出现以下内容则判定成功:
- 内核完成初始化后挂载initramfs,执行
/init脚本; - 控制台打印
=== Minimal Rootfs Booted ===; - 进入
/bin/sh交互Shell,输入ls、pwd等命令能正常返回结果; - 执行
cat /proc/mounts可看到proc、sysfs、devtmpfs已挂载。
预期输出(确定性结果)
=== Minimal Rootfs Booted ===
/ # ls
bin dev etc init lib proc root sbin sys tmp usr
/ # cat /proc/mounts
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,relatime 0 0
常见问题
- QEMU提示内核未找到:需先编译内核(
make defconfig && make -j$(nproc) bzImage),或使用发行版自带内核镜像(如Ubuntu的/boot/vmlinuz-*)。 - Shell无法执行:确认BusyBox为静态编译(
file rootfs/bin/busybox显示statically linked),否则需将动态库复制到rootfs/lib。 - 设备节点缺失:若devtmpfs未自动挂载,需在init脚本中手动
mknod创建console和null节点。
本案例以最小可运行闭环验证了BusyBox根文件系统的构建与启动流程,实际项目中可在此基础上添加应用层库、配置文件及自定义启动服务。