活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Arch Linux ARM架构编译完全指南 手把手教你从零开始打造专属Linux系统

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-11 17:40:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Arch Linux ARM是Arch Linux在ARM架构上的移植版本,它继承了Arch Linux的核心理念:简单、轻量、用户中心。与传统的ARM Linux发行版相比,Arch Linux ARM提供了滚动更新模型、最新的软件包以及极简的基础系统,让用户可以根据自己的需求构建高度定制化的Linux系统。

本指南将详细介绍如何在ARM架构上从零开始编译和打造专属的Arch Linux系统。无论你是想在树莓派、其他ARM开发板还是自定义ARM硬件上运行Linux,本指南都将提供全面的步骤和解释,帮助你完成整个编译过程。

准备工作

在开始编译Arch Linux ARM之前,我们需要确保具备必要的硬件和软件条件。

硬件需求

1. 主机系统:一台运行Linux的x86_64计算机(推荐使用Arch Linux或其他主流发行版)
2. 目标设备:ARM架构设备(如树莓派、BeagleBone、Jetson Nano等)
3. 存储介质:足够容量的SD卡或eMMC模块(建议16GB或更大)
4. 网络连接:稳定的互联网连接以下载必要的软件包和源代码

软件需求

在主机系统上,我们需要安装一些必要的软件包:
  1. # 在Arch Linux上安装必要的软件包
  2. sudo pacman -S base-devel git wget curl vim nano parted dosfstools \
  3.     multilib-devel gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf \
  4.     uboot-tools device-tree-compiler qemu-user-static qemu-arch-extra \
  5.     python2 python2-pip python python-pip
  6. # 如果是其他发行版,例如Ubuntu/Debian
  7. sudo apt-get update
  8. sudo apt-get install build-essential git wget curl vim nano parted dosfstools \
  9.     gcc-arm-linux-gnueabihf binutils-arm-linux-gnueabihf \
  10.     u-boot-tools device-tree-compiler qemu-user-static \
  11.     python2 python2-pip python python-pip
复制代码

环境设置

在开始编译之前,我们需要设置一个合适的工作环境。

创建工作目录
  1. # 创建并进入工作目录
  2. mkdir -p ~/archlinux-arm
  3. cd ~/archlinux-arm
复制代码

设置环境变量

为了方便后续操作,我们可以设置一些环境变量:
  1. # 设置目标架构
  2. export ARCH=arm
  3. # 设置交叉编译工具链前缀
  4. export CROSS_COMPILE=arm-linux-gnueabihf-
  5. # 设置目标机器类型(以树莓派3为例)
  6. export MACHINE=rpi3
  7. # 设置工作目录
  8. export WORKDIR=$(pwd)
  9. # 设置输出目录
  10. export OUTPUTDIR=${WORKDIR}/output
  11. mkdir -p ${OUTPUTDIR}
复制代码

获取源代码

获取Arch Linux ARM基础系统

Arch Linux ARM提供了基础系统的tar包,我们可以直接下载:
  1. # 下载Arch Linux ARM基础系统(以树莓派3为例)
  2. wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz
  3. # 或者对于64位ARM设备(如树莓派4)
  4. wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
复制代码

获取Linux内核源代码
  1. # 克隆Linux内核源代码
  2. git clone --depth=1 https://github.com/raspberrypi/linux -b rpi-5.10.y
  3. # 进入内核目录
  4. cd linux
复制代码

交叉编译工具链

虽然我们已经安装了交叉编译工具链,但为了确保一切正常,让我们验证一下:
  1. # 验证交叉编译器是否正常工作
  2. arm-linux-gnueabihf-gcc -v
  3. # 应该显示类似以下内容:
  4. # Using built-in specs.
  5. # COLLECT_GCC=arm-linux-gnueabihf-gcc
  6. # COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/10.2.0/lto-wrapper
  7. # Target: arm-linux-gnueabihf
  8. # Configured with: ...
  9. # Thread model: posix
  10. # Supported LTO compression algorithms: zlib
  11. # gcc version 10.2.0 (GCC)
复制代码

内核编译

配置内核

首先,我们需要为我们的目标设备配置内核:
  1. # 清理内核源代码
  2. make mrproper
  3. # 获取默认配置(以树莓派3为例)
  4. make bcm2709_defconfig
  5. # 或者使用树莓派4的配置
  6. make bcm2711_defconfig
  7. # 自定义内核配置(可选)
  8. make menuconfig
复制代码

在menuconfig界面中,你可以根据需要启用或禁用特定功能。例如,你可能需要确保以下选项被启用:

• 启用必要的文件系统支持(如EXT4, BTRFS等)
• 启用必要的网络驱动
• 启用你需要硬件的特定驱动

编译内核和模块

配置完成后,我们可以开始编译内核:
  1. # 编译内核
  2. make -j$(nproc) zImage dtbs
  3. # 编译内核模块
  4. make -j$(nproc) modules
  5. # 安装模块到输出目录
  6. make INSTALL_MOD_PATH=${OUTPUTDIR} modules_install
复制代码

准备内核镜像
  1. # 创建内核镜像目录
  2. mkdir -p ${OUTPUTDIR}/boot
  3. # 复制内核镜像
  4. cp arch/arm/boot/zImage ${OUTPUTDIR}/boot/
  5. # 复制设备树文件
  6. cp arch/arm/boot/dts/*.dtb ${OUTPUTDIR}/boot/
  7. mkdir -p ${OUTPUTDIR}/boot/overlays
  8. cp arch/arm/boot/dts/overlays/*.dtb* ${OUTPUTDIR}/boot/overlays/
复制代码

根文件系统构建

准备根文件系统
  1. # 创建根文件系统目录
  2. mkdir -p ${OUTPUTDIR}/rootfs
  3. # 解压Arch Linux ARM基础系统
  4. tar -xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C ${OUTPUTDIR}/rootfs
  5. # 对于64位ARM设备
  6. # tar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C ${OUTPUTDIR}/rootfs
复制代码

配置根文件系统
  1. # 进入根文件系统
  2. cd ${OUTPUTDIR}/rootfs
  3. # 创建必要的目录
  4. mkdir -p boot/overlays
  5. # 复制内核镜像和设备树文件
  6. cp ../boot/zImage boot/
  7. cp ../boot/*.dtb boot/
  8. cp ../boot/overlays/*.dtb* boot/overlays/
  9. # 返回工作目录
  10. cd ${WORKDIR}
复制代码

设置QEMU用户模式模拟

为了在x86主机上运行ARM程序,我们需要设置QEMU用户模式模拟:
  1. # 复制QEMU ARM二进制文件到根文件系统
  2. cp /usr/bin/qemu-arm-static ${OUTPUTDIR}/rootfs/usr/bin/
  3. # 对于64位ARM
  4. # cp /usr/bin/qemu-aarch64-static ${OUTPUTDIR}/rootfs/usr/bin/
复制代码

系统配置

chroot到目标系统
  1. # 绑定挂载必要的文件系统
  2. sudo mount --bind /proc ${OUTPUTDIR}/rootfs/proc
  3. sudo mount --bind /sys ${OUTPUTDIR}/rootfs/sys
  4. sudo mount --bind /dev ${OUTPUTDIR}/rootfs/dev
  5. sudo mount --bind /run ${OUTPUTDIR}/rootfs/run
  6. # 复制resolv.conf以启用网络
  7. sudo cp /etc/resolv.conf ${OUTPUTDIR}/rootfs/etc/
  8. # chroot到目标系统
  9. sudo chroot ${OUTPUTDIR}/rootfs /bin/bash
复制代码

基本系统设置

现在我们在目标系统的chroot环境中,可以进行基本系统设置:
  1. # 初始化 pacman 密钥环
  2. pacman-key --init
  3. pacman-key --populate archlinuxarm
  4. # 更新系统
  5. pacman -Syu
  6. # 设置时区
  7. ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
  8. hwclock --systohc
  9. # 设置本地化
  10. echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
  11. locale-gen
  12. echo "LANG=en_US.UTF-8" > /etc/locale.conf
  13. # 设置主机名
  14. echo "myarcharm" > /etc/hostname
  15. # 设置root密码
  16. passwd
  17. # 创建用户
  18. useradd -m -G wheel -s /bin/bash alarm
  19. passwd alarm
  20. # 安装必要软件
  21. pacman -S sudo vim htop net-tools wireless_tools wpa_supplicant dialog
  22. # 配置sudo
  23. echo "%wheel ALL=(ALL) ALL" >> /etc/sudoers
  24. # 启用服务
  25. systemctl enable sshd
  26. systemctl enable dhcpcd
复制代码

配置引导加载程序

对于树莓派,我们需要配置config.txt文件:
  1. # 创建/config.txt文件
  2. cat > /boot/config.txt << EOF
  3. # 启用4核
  4. arm_64bit=1
  5. disable_overscan=1
  6. # 设置内存分配
  7. gpu_mem=16
  8. # 启用音频
  9. dtparam=audio=on
  10. # 配置UART
  11. enable_uart=1
  12. # 设置设备树
  13. device_tree=bcm2710-rpi-3-b.dtb
  14. EOF
复制代码

配置fstab
  1. # 创建/etc/fstab文件
  2. cat > /etc/fstab << EOF
  3. # <file system> <dir> <type> <options> <dump> <pass>
  4. /dev/mmcblk0p1  /boot   vfat    defaults        0       0
  5. /dev/mmcblk0p2  /       ext4    defaults        0       1
  6. EOF
复制代码

退出chroot环境
  1. # 退出chroot环境
  2. exit
  3. # 卸载绑定的文件系统
  4. sudo umount ${OUTPUTDIR}/rootfs/{proc,sys,dev,run}
复制代码

引导加载程序配置

安装U-Boot

对于某些ARM设备,我们可能需要编译和安装U-Boot:
  1. # 克隆U-Boot源代码
  2. git clone https://github.com/u-boot/u-boot.git
  3. cd u-boot
  4. # 获取默认配置(以树莓派3为例)
  5. make rpi_3_32b_defconfig
  6. # 或者使用树莓派4的配置
  7. # make rpi_4_defconfig
  8. # 编译U-Boot
  9. make -j$(nproc)
  10. # 复制U-Boot到输出目录
  11. cp u-boot.bin ${OUTPUTDIR}/boot/
  12. # 返回工作目录
  13. cd ${WORKDIR}
复制代码

打包和部署

创建SD卡镜像
  1. # 创建空镜像文件(4GB)
  2. dd if=/dev/zero of=${OUTPUTDIR}/archlinux-arm.img bs=1M count=4096
  3. # 分区镜像
  4. parted -s ${OUTPUTDIR}/archlinux-arm.img mklabel msdos
  5. parted -s ${OUTPUTDIR}/archlinux-arm.img mkpart primary fat32 1 256
  6. parted -s ${OUTPUTDIR}/archlinux-arm.img mkpart primary ext4 256 100%
  7. parted -s ${OUTPUTDIR}/archlinux-arm.img set 1 boot on
  8. # 设置loop设备
  9. LOOPDEV=$(losetup -f --show ${OUTPUTDIR}/archlinux-arm.img)
  10. # 创建文件系统
  11. mkfs.vfat -F32 ${LOOPDEV}p1
  12. mkfs.ext4 -F ${LOOPDEV}p2
  13. # 挂载分区
  14. mkdir -p ${OUTPUTDIR}/mnt/{boot,root}
  15. mount ${LOOPDEV}p1 ${OUTPUTDIR}/mnt/boot
  16. mount ${LOOPDEV}p2 ${OUTPUTDIR}/mnt/root
  17. # 复制文件系统
  18. cp -r ${OUTPUTDIR}/rootfs/* ${OUTPUTDIR}/mnt/root/
  19. cp -r ${OUTPUTDIR}/rootfs/boot/* ${OUTPUTDIR}/mnt/boot/
  20. # 卸载分区
  21. umount ${OUTPUTDIR}/mnt/{boot,root}
  22. losetup -d ${LOOPDEV}
  23. # 清理挂载点
  24. rm -rf ${OUTPUTDIR}/mnt
复制代码

写入SD卡
  1. # 确定SD卡设备(例如/dev/sdb)
  2. lsblk
  3. # 写入镜像到SD卡(请将/dev/sdb替换为你的SD卡设备)
  4. sudo dd if=${OUTPUTDIR}/archlinux-arm.img of=/dev/sdb bs=4M status=progress
  5. sync
复制代码

常见问题与解决方案

1. 编译内核时出现错误

问题:编译内核时出现”undefined reference to”错误。

解决方案:
  1. # 清理内核源代码
  2. make mrproper
  3. # 重新配置内核
  4. make bcm2709_defconfig
  5. # 再次尝试编译
  6. make -j$(nproc) zImage dtbs modules
复制代码

2. 系统无法启动

问题:系统无法启动,停留在引导加载程序阶段。

解决方案:

• 检查config.txt文件是否正确配置
• 确保内核镜像和设备树文件位于正确的位置
• 检查分区表是否正确设置

3. 网络连接问题

问题:系统启动后无法连接网络。

解决方案:
  1. # 检查网络接口
  2. ip a
  3. # 启用网络接口
  4. ip link set eth0 up
  5. # 配置DHCP
  6. dhcpcd eth0
  7. # 或者设置静态IP
  8. ip addr add 192.168.1.100/24 dev eth0
  9. ip route add default via 192.168.1.1
  10. echo "nameserver 8.8.8.8" > /etc/resolv.conf
复制代码

4. 软件包安装问题

问题:无法安装软件包,出现”signature is”错误。

解决方案:
  1. # 初始化pacman密钥环
  2. pacman-key --init
  3. pacman-key --populate archlinuxarm
  4. # 刷新软件包数据库
  5. pacman -Sy
复制代码

结语

通过本指南,你已经学会了如何在ARM架构上从零开始编译和打造专属的Arch Linux系统。这个过程虽然复杂,但它让你能够完全控制你的Linux系统,并根据你的特定需求进行定制。

Arch Linux ARM的优势在于其简洁性和灵活性,它为你提供了一个坚实的基础,让你可以构建适合自己需求的系统。无论是用于嵌入式开发、服务器还是个人项目,Arch Linux ARM都能满足你的需求。

进一步学习资源

1. Arch Linux ARM官方网站
2. Arch Linux Wiki
3. Linux内核文档
4. U-Boot项目页面

希望本指南对你有所帮助,祝你在Arch Linux ARM的世界中探索愉快!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则