技术知识库

将 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,从而证明用户空间位于内核镜像内部。

前置条件

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 便于单文件部署,但本实验没有足够数据证明它显著加快启动。

关联