技术知识库
将 BusyBox initramfs 内置到 Linux 5.0 ARM64 Image
将 BusyBox initramfs 内置到 Linux 5.0 ARM64 Image
摘要
本手册将已经验证的 BusyBox _install 目录编入独立的 Linux 5.0 ARM64 Image。QEMU 不传 -initrd 仍能进入 PID 1 shell,从而证明用户空间位于内核镜像内部。
前置条件
- 已完成 使用 BusyBox 制作 ARM64 initramfs。
_install/init已可执行,并以exec setsid cttyhack sh结束。- external 内核配置位于
build/arm64/.config。
1. 创建独立输出目录
cd /home/martin-zou/workspace/runninglinuxkernel_5.0
mkdir -p build/arm64-builtin
cp build/arm64/.config build/arm64-builtin/.config
2. 指定内置根文件系统
scripts/config --file build/arm64-builtin/.config \
--set-str INITRAMFS_SOURCE "/home/martin-zou/workspace/busybox-1.37.0/_install" \
--set-val INITRAMFS_ROOT_UID 1000 \
--set-val INITRAMFS_ROOT_GID 1000
make ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-gnu- \
O=build/arm64-builtin \
olddefconfig
grep -E '^CONFIG_INITRAMFS_(SOURCE|ROOT_UID|ROOT_GID)=' \
build/arm64-builtin/.config
本机 _install 文件由 UID/GID 1000 创建;INITRAMFS_ROOT_UID/GID=1000 将它们映射为归档内 root 所有权。
3. 编译 built-in Image
make ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-gnu- \
O=build/arm64-builtin \
-j"$(nproc)"
echo "make_status=$?"
4. 对比镜像大小
ls -lh \
build/arm64/arch/arm64/boot/Image \
build/arm64-builtin/arch/arm64/boot/Image
stat -c '%n %s bytes' \
build/arm64/arch/arm64/boot/Image \
build/arm64-builtin/arch/arm64/boot/Image
file build/arm64-builtin/arch/arm64/boot/Image
本轮结果:external Image 为 34,693,632 bytes,built-in Image 为 35,873,280 bytes,增量约等于压缩后的 BusyBox rootfs。
5. 不使用 -initrd 启动
qemu-system-aarch64 \
-machine virt \
-cpu cortex-a57 \
-smp 2 \
-m 1024 \
-kernel /home/martin-zou/workspace/runninglinuxkernel_5.0/build/arm64-builtin/arch/arm64/boot/Image \
-append "console=ttyAMA0 rdinit=/init loglevel=8" \
-nographic
关键判据是命令中完全没有 -initrd。
6. 虚拟机内验证
tty
echo $$
uname -a
cat /proc/cmdline
mount
本轮结果:tty=/dev/ttyAMA0、shell PID 为 1、Linux 为 5.0.0+ aarch64,虚拟文件系统均挂载成功。
更新规则
- External:修改
_install后只需重新打包rootfs-v2.cpio.gz。 - Built-in:修改
_install后必须重新构建build/arm64-builtin/arch/arm64/boot/Image。 - Built-in 便于单文件部署,但本实验没有足够数据证明它显著加快启动。