Step 1 Get the required tools
sudo apt-get update
sudo apt-get install -y \
bc \
bison \
build-essential \
ccache \
clang \
cpio \
dwarves \
flex \
gawk \
gcc \
git \
gzip \
libcap-dev \
libelf-dev \
liblz4-dev \
libncurses-dev \
libssl-dev \
libudev-dev \
libzstd-dev \
lz4 \
python3 \
python3-dev \
python3-distutils-extra \
python3-setuptools \
xz-utils \
zstd \
crossbuild-essential-arm64 \
qemu-system-arm
Step 2 Download kernel
You can choose the version of kernel you like at this website: cdn.kernel.org
and unzip it
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.30.tar.xz
tar xvf linux-6.6.30.tar.xz && cd linux-6.6.30
Step 3 Build it
Set the environment,
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
And make it
make defconfig
make menuconfig
# here you could ajust the options you like
Build
make -j$(nproc) Image
And it would generate the Image at arch/arm64/boot/Image, valide the Image file:
file arch/arm64/boot/Image
# should show Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages
Now you get a kernel!
Step 4 Build BusyBox
Download the BusxBox and unzip it.
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xvf busybox-1.36.1.tar.bz2 && cd busybox-1.36.1
Config static compile:
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make menuconfig
if it compliant:
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
***
you could edit the file scripts/kconfig/lxdialog/Makefile
at BusxBox directory, and comment this line:
always := $(hostprogs-y) dochecklxdialog
Now you should make menuconfig
successful.
And ajusting the build option:
Settings -> Build Options -> [*] Build static binary (no shared libs)
Network Utilities → [ ] tc # unselect it
And Exit and Save.
Now you can compile and install it
make -j$(nproc) && make install
After it the _install
directory is the root Filesystem of arm64
Step 5 build initramfs
cd _install
mkdir -p proc sys dev etc/init.d
# create the init scrpit
cat > init <<EOF
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
echo "ARM64 System Ready!"
exec /bin/sh
EOF
chmod +x init
# pack it
find . | cpio -H newc -ov -R root:root | gzip > ../initramfs.cpio.gz
Step 6 QEMU launch
qemu-system-aarch64 \
-M virt \
-cpu cortex-a72 \
-smp 4 \
-m 2G \
-kernel /path/to/linux-6.6.30/arch/arm64/boot/Image \
-initrd /path/to/busybox-1.36.1/initramfs.cpio.gz \
-append "console=ttyAMA0 init=/init" \
-nographic \
-serial mon:stdio
这篇文章详细地介绍了如何在x86平台(amd64)上进行ARM64架构的内核交叉编译和BusyBox构建,并通过QEMU完成镜像测试。整体结构清晰,步骤完整,对嵌入式开发和系统构建实践者具有较强的参考价值。以下从核心内容、优点、潜在问题和改进建议四个方面进行分析:
核心内容与优点
交叉编译流程完整
文章完整覆盖了从环境准备、内核编译、BusyBox构建到最终生成initramfs并使用QEMU启动的完整流程,尤其适合对交叉编译流程不熟悉的新手用户。通过
CROSS_COMPILE
和ARCH
环境变量的设置,清晰地展示了如何针对不同架构进行编译,体现了对交叉编译机制的掌握。工具链与依赖管理明确
提供了详细的依赖安装命令(如
crossbuild-essential-arm64
和qemu-system-arm
),避免了用户因环境缺失导致的构建失败。同时,对BusyBox中ncurses
依赖问题的处理方案(修改Makefile)具有实际意义,解决了常见编译障碍。实践性与可复现性强
每个步骤均包含具体的命令示例(如
make -j$(nproc) Image
和find | cpio
打包initramfs),便于读者直接复制执行。QEMU启动命令的参数配置(如-M virt
和-cpu cortex-a72
)也提供了合理的虚拟化模拟方案,验证了编译结果的可行性。核心理念清晰
文章的核心理念在于通过交叉编译和静态构建(如BusyBox的
Build static binary
选项),在异构架构间实现最小化系统镜像的构建。这一理念对嵌入式系统开发、容器镜像优化等场景具有重要意义,体现了对资源受限环境的敏感性。潜在问题与改进建议
路径与版本依赖的模糊性
/path/to/
未明确提示用户需替换为实际路径,可能导致命令执行失败。BusyBox静态编译的潜在风险
内核Image构建的配置依赖
make -j$(nproc) Image
的执行依赖make defconfig
和make menuconfig
的配置结果,但未提及特定配置要求(如ARM64架构的必需选项)。CONFIG_ARM64
和CONFIG_INITRAMFS_SOURCE
),或推荐使用默认配置(make defconfig
)的适用性。initramfs功能的局限性
init
脚本仅实现基础挂载和启动shell,缺乏对实际系统服务的模拟(如网络、存储)。/etc/inittab
支持或集成systemd
/OpenRC
等初始化系统,以接近真实环境。错误处理的补充说明不足
ncurses
缺失的处理仅提供修改Makefile的方案,但未提及更通用的解决方式(如安装libncurses5-dev
或libncursesw5-dev
)。ldconfig -p | grep ncurses
)。扩展与优化方向
自动化脚本整合
可将多步骤流程整合为脚本(如
build-arm64.sh
),通过参数化配置(如内核版本、输出路径)提升复用性,并加入错误检查(如set -e
)增强健壮性。性能与资源优化
提供
ccache
的使用技巧(如CC="ccache aarch64-linux-gnu-gcc"
)以加速重复编译,或建议调整-j
参数以平衡编译速度与系统负载。实际硬件部署指南
在QEMU测试后,可补充将生成的Image和initramfs部署到真实ARM64设备的步骤(如使用
dd
写入SD卡或通过TFTP启动),拓展文章的工程应用价值。安全性与合规性说明
提示用户注意内核版本与硬件平台的匹配性(如ARMv8与ARMv9的兼容性),并建议遵循开源许可证(如GPLv2对Linux内核的约束)。
总结与鼓励
文章为交叉编译实践提供了清晰的入门路径,尤其对ARM64生态的开发者具有指导意义。建议在后续版本中增加对配置细节的解释和边缘场景的覆盖,以进一步提升内容的深度与实用性。作者对技术流程的把握和问题解决能力值得肯定,期待看到更多关于嵌入式系统构建的深入探讨!
这篇博客详细介绍了在amd64机器上交叉编译ARM64内核和BusyBox的过程,内容结构清晰,步骤明确。以下是对该文的详细分析与建议:
优点:
核心理念:
文章旨在指导读者在非ARM环境下完成内核和根文件系统的构建,并通过QEMU进行验证。这种跨平台的交叉编译方法对于嵌入式开发或学习ARM架构非常有用,能够节省硬件成本并加速开发效率。
改进建议:
###闪光点:
这篇文章对于希望从零开始接触ARM64开发的读者特别有帮助。建议稍作扩展,以增加更多的实用信息和故障排除内容,使其更加全面。