本文围绕 ARM设备上安装 Linux 系统 的完整流程展开,从准备环境到系统首次启动,覆盖从硬件选型、镜像选择、工具链搭建、内核与根文件系统构建,到写入存储、配置引导以及首次启动调试的全流程。文章着眼于实操要点,帮助工程师在真实场景中快速落地一个可用的 ARM 平台 的 Linux 环境。
1. 环境准备
1.1 硬件与固件需求
在开始 环境准备 时,需要明确目标 ARM 设备 的型号与规格。常见的开发板包括基于 ARMv7/ARMv8 的单板计算机,通常具备可扩展存储(SD 卡/eMMC)、GPIO、串口控制台等接口。需要关注点包括 CPU 架构、RAM 容量、存储介质类型以及对引导分区的要求。掌握这些信息有助于确定选择的 引导方案 与 根文件系统 的布局。
另外,固件/ boot 介质 的要求也要清晰,例如是否需要 U-Boot 作为引导加载程序、是否具备设备树(DTB)文件、以及对启动参数的支持。对未知设备,建议先在板子的厂商论坛或社区获取具体的引导方法与默认分区结构信息。
1.2 宿主机与必备工具
为了完成交叉编译、镜像打包与写入工作,需要在 宿主机(通常是 x86_64 Linux/ macOS)上准备好一套工具链与构建环境。常用工具包括 交叉编译工具链、内核源码、引导加载程序、以及创建和管理分区的工具。以下是宿主机常见准备清单:
- 编译相关:gcc、make、git、bc、libncurses 开发包等。
- ARM 交叉编译工具链:gcc-arm-linux-gnueabihf(32 位 ARM)、gcc-aarch64-linux-gnu(64 位 ARM),以及相应的 binutils。
- 设备树工具:dtc(Device Tree Compiler)以便处理 .dts/.dtb 文件。
- 镜像处理与调试工具:dd、fdisk/parted、rsync、ssh、qemu-user-static(如需在宿主机模拟运行)等。
在 Debian/Ubuntu 系统上,可以通过以下命令快速安装常用工具:
sudo apt-get update
sudo apt-get install build-essential git bc libncurses5-dev bison flex \libssl-dev wget dtc gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu \qemu-user-static qemu-system-arm
2. 选择镜像与引导方案
2.1 目标镜像与分区结构
在 选择镜像 时,需要确定所需的根文件系统类型(如 Debian、Ubuntu、Arch 等)以及根文件系统的架构(armhf、arm64)与兼容性。常见做法是先准备一个最小根文件系统,再在其中安装必要软件,确保在首次启动时就能进入 initramfs/init 系统并挂载根分区。典型的分区结构包括一个较小的 引导分区(存放内核镜像、设备树、引导配置)和一个较大的 根分区。
对于设备树文件 DTB,请确保与内核版本以及硬件平台匹配。错误的 DTB 可能导致启动失败,因此在镜像中提供正确的 dtb 文件是启动成功的关键之一。
2.2 引导方案与设备树配置
引导方案通常涉及一个 引导加载程序(如 U-Boot、Das U-Boot、或厂商自带的引导固件)。正确的引导顺序是:固件/BOOT ROM → 引导加载程序(U-Boot)→ 内核镜像(zImage/uImage/Image)+ 设备树(.dtb)+ 根文件系统。不同设备对启动参数的格式略有差异,应记录并正确设置 bootargs、bootcmd 等变量。
以下是一个简化的引导流程示例:在 U-Boot 环境中,通过加载内核与设备树到指定地址后,设置启动参数并执行引导。确保内核命令行包含 root 设备、console、以及需要的驱动参数。
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 ro
setenv kernel_addr_r 0x80000
setenv fdt_addr_r 0x2e0000
setenv bootcmd 'load mmc 0:1 ${kernel_addr_r} zImage; load mmc 0:1 ${fdt_addr_r} bank0.dtb; bootz ${kernel_addr_r} - ${fdt_addr_r}'
saveenv
3. 交叉编译工具链与内核配置
3.1 构建工具链与环境变量
为了在宿主机上为 ARM 平台 构建内核和根文件系统,需要设置正确的 CROSS_COMPILE 和 ARCH 环境变量,并确保工具链路径在系统 PATH 中。下面是一个常见的配置示例:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
注意,不同平台的工具链前缀不同,需根据实际使用的工具链填写。之后可以通过 make 进行内核配置与编译。
3.2 内核源代码获取与配置
获取内核源代码并进行配置,是实现 Linux 系统在 ARM 上的启动 的关键步骤。可从官方内核仓库或板级厂商仓库获取。通常流程包括:
1) 获取内核源代码并选择合适的默认配置:

git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
make ARCH=arm menuconfig
2) 配置完成后进行编译,比如:
make -j8
3) 将编译产物(bzImage/uImage、也可能是 zImage)与设备树文件一起打包,准备写入存储介质的引导分区。
4. 构建根文件系统与必要软件
4.1 生成最小根文件系统
根文件系统(rootfs)的结构直接决定系统启动后的可用性。可以通过不同方式生成 rootfs,例如 debootstrap、Buildroot、Yocto 等。以下给出一个常见的 Debian/ARMHF 路径示例:
sudo debootstrap --arch=armhf stable /srv/arm-rootfs http://deb.debian.org/debian
生成完成后可以进入根文件系统进行进一步配置,例如创建用户、设置网络、安装必要软件包等。
4.2 预装软件与初始化脚本
为了实现系统在首次启动后的自动化初始化,需要准备好基本的初始化脚本、fstab、以及必要的系统服务。常见做法是使用 systemd 或其他初始化系统,并在 rootfs 中预置基本工具、网络配置、以及 SSH 服务等。下列操作有助于提升首次启动的自洽性:
重要:确保 rootfs 中包含与目标架构匹配的库与二进制文件,以避免启动阶段出现缺少依赖的问题。
5. 写入存储与引导配置
5.1 分区布局与写入步骤
将内核镜像、设备树以及根文件系统写入目标存储介质(如 SD 卡、eMMC)时,应遵循一个清晰的分区布局方案。常见结构是:
- 引导分区(1): 存放内核镜像、设备树和引导配置文件(如 boot.scr、config.txt、uEnv.txt 等,根据引导方案而定)
- 根分区(2): 提供实际的 根文件系统 与初始化工具
写入流程大致如下:创建分区、格式化、拷贝内核及 dtb、拷贝根文件系统,并确保引导配置指向正确的分区与文件。
sudo dd if=kernel_image of=/dev/sdX bs=4M status=progress
sudo dd if=bank0.dtb of=/dev/sdX seek=`#对应设备分区号` bs=512
sudo mkfs.vfat /dev/sdX1
sudo mkfs.ext4 /dev/sdX2
sudo mount /dev/sdX2 /mnt/arm-root
sudo rsync -a ~/arm-rootfs/ /mnt/arm-root
5.2 引导配置与设备树传递
在引导分区中,需要提供与内核相匹配的 设备树文件(.dtb)以及合适的启动命令。若使用的是 U-Boot,请在通过串口进入 U-Boot 命令行后,配置 bootcmd、bootargs、kernel_addr_r、fdt_addr_r 等变量,并确保开机能正确加载内核与设备树。
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 ro
setenv bootcmd 'load mmc 0:1 ${kernel_addr_r} zImage; load mmc 0:1 ${fdt_addr_r} device.dtb; bootz ${kernel_addr_r} - ${fdt_addr_r}'
saveenv
6. 第一次启动与调试
6.1 连接串口日志与进入控制台
第一台 ARM 设备启动时,可以通过串口控制台观察启动过程的日志输出。串口控制台通常使用 115200 甚至 57600 的波特率,确保 bootargs 中包含正确的 console 参数,如 console=ttyS0,115200。若看到启动信息停滞,应通过串口日志定位问题点,例如设备找不到根分区、根文件系统初始化失败、或设备树不匹配等。
在调试阶段,记录关键字如 kernel panic、cannot open root device、unrecognized device 等,有助于快速定位问题。
dmesg | tail -n 100
journalctl -b | tail -n 200
6.2 初次登陆与基本测试
如果系统启动进入用户空间,通常可以通过串口控制台登录或通过网络 SSH 远程登录。首次登录后,建议进行基本测试,如网络连通性、包管理、时间同步与基本服务状态。确保 SSH(如 openssh-server)在 rootfs 启动时自动启动,并且防火墙策略允许必要端口。
ssh user@arm-device
uname -a
df -h
ps aux | head -n 20
7. 系统启动后的验证与基本调优
7.1 启动日志与系统健康检查
在系统启动完成后,持续监控启动日志和系统健康状态是常见走向。可以通过以下命令对系统进行快速检查:
systemctl is-active network-online.target
uptime
free -h
cat /proc/meminfo | head -n 5
确保根文件系统挂载正确、网络服务正常、以及设备驱动工作正常。对性能敏感的 ARM 设备,可以进一步分析 CPU 使用率、内存占用和 I/O 带宽,以指导后续的优化工作。
7.2 进一步的硬件驱动与系统优化
在系统启动并进入稳定状态后,可以考虑开启针对目标硬件的驱动优化与性能调优,例如启用特定芯片的互连总线驱动、提升网络驱动的参数、或调整内核就绪队列以提高吞吐率。所有优化建议应以实际硬件特性为基础,避免过度调参引发稳定性问题。
以上内容覆盖了从最初的 环境准备、镜像与引导方案的选择,到交叉编译工具链、内核与根文件系统的构建,再到将系统写入存储、首次启动与调试,直至系统启动后的验证阶段的完整流程。整个流程围绕 ARM 设备上安装 Linux 系统 的目标展开,确保在真实硬件上实现一次性从准备到启动的落地。


