前言
Armbian 是一套以 Linux 为基础的针对 Arm 架构及相关硬件所开发的轻量级软件系统,而且主要面向嵌入式体系架构的单板机(SBCs)应用场景,比如电视盒子、游戏机、NAS、媒体播放器、个人小电脑等等。目前 Armbian 支持 Debian 和 Ubuntu 的编译选项,可以生成具有字符或图形界面的运行系统。
此教程适用于 Amlogic S9xxx 系列处理器和 Rockchip 盒子,编译一次需要1-3小时左右,需要耐心等待,理论上 CPU 核心数越多编译越快。
环境要求
系统版本
推荐 Debian 11 或者 Ubuntu 22.04
配置要求
至少 4G RAM,SSD,推荐4核处理器以上,预留 25G 硬盘空间
网络要求
最好是境外主机或者能够访问国际网络,大陆网络环境编译耗时久且需要修改地方较多
编译依赖
# 升级sudo apt update -ysudo apt full-upgrade -y# 安装依赖sudo apt install $(curl -fsSL https://is.gd/depend_ubuntu2204_armbian)# 清理sudo apt autoremove --purgesudo apt clean
编译镜像
拉取 Armbian 源码
git clone --single-branch --depth=1 --branch=main https://github.com/armbian/build.git buildcd build
自定义配置
安装特定的软件包
安装特定的软件包只要在
userpatches/lib.config
中增加下面一行即可(文件目录请自行创建),当然也可以写在下面的自定义脚本中运行(推荐):# PACKAGE_LIST_ADDITIONAL="$PACKAGE_LIST_ADDITIONAL package_name"PACKAGE_LIST_ADDITIONAL="$PACKAGE_LIST_ADDITIONAL python-serial python" # additional packages
建议仔细阅读分析一下
lib/functions/configuration/main-config.sh
这个文件,里面定义了编译中所使用的环境变量,修改相应的变量可以改变编译结果,当然不是在这个文件中直接修改,而是放到lib.config
当中做调整。在编译的镜像中运行自定义命令
方法是在
userpatches
目录中创建脚本文件customize-image.sh
,写入需要执行的命令,这些命令是在 chroot 环境中运行的,该脚本文件是在编译完成后并在生成最终目标镜像之前被执行。如果要复制文件到镜像中,需要将文件放在userpatches/overlay
下,然后在customize-image.sh
通过/tmp/overlay
路径进行访问。官方提供了一个模版可以参考,下面是我列出的一些常用命令:#!/bin/bash# 安装常用软件apt-get updateapt-get install -y apt-transport-https ca-certificates \curl gnupg lsb-release pciutils net-tools iperf3 zip unzip \ntpdate iputils-ping vim iftop iotop mtr wget sudo qrencode \python3 python3-pip python3-venv# 修改默认 Python 版本ln -s /usr/bin/python3 /usr/bin/python# 安装 Dockercurl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list >/dev/nullapt-get updateapt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-pluginsystemctl enable docker --nowmkdir /etc/dockercat >/etc/docker/daemon.json <<'EOF'{"log-driver": "json-file","log-opts": {"max-size": "10m","max-file": "1"},"storage-driver": "overlay2"}EOFsystemctl daemon-reloadsystemctl restart docker# 取消首次登录创建新用户步骤并修改 root 用户密码## 不修改的默认用户密码是 root/1234rm -f /root/.not_logged_in_yetecho "root:1234567" | chpasswd## 关闭 root 用户终端自动登陆rm -f /etc/systemd/system/getty@.service.d/override.confrm -f /etc/systemd/system/serial-getty@.service.d/override.confsystemctl daemon-reload# 设置开机自启脚本(脚本文件自行创建)mv /tmp/overlay/init.sh /rootchmod +x /root/init.sh## 将要开机执行的命令添加到 /etc/rc.local 中 'exit 0' 的上面即可sed -i 's/^exit 0$//g' /etc/rc.localcat >>/etc/rc.local <<'EOF'bash /root/init.shexit 0EOFchmod a+x /etc/rc.localsystemctl enable rc-local# 清理缓存apt autoremove -y && apt autoclean && apt remove -y && apt clean
实现 EMMC 自动写入
默认不会自动写入 EMMC,系统需要插着U盘才能使用,手动写入需要进入系统执行
armbian-install
命令然后根据提示操作,要实现自动写入则需要利用上方创建的init.sh
开机自启脚本,脚本内容如下,详见注释:#!/bin/bash# 1.写入EMMClsblk -o NAME,MOUNTPOINT | grep -E 'mmcblk[0-9]p[0-9]' | sed 's/├─//g;s/└─//g' | awk '{print $1}' | xargs -I{} mkfs.ext4 /dev/{}echo -e "101\n1" | (/usr/sbin/armbian-install) # 斐讯N1为例,其他设备需要修改101为对应选项# 2.写入初始化脚本ROOTFS=$(lsblk -o NAME,MOUNTPOINT | grep -E 'mmcblk[0-9]p2' | sed 's/├─//g;s/└─//g' | awk '{print $1}')mount /dev/${ROOTFS} /mntcat >/mnt/root/init.sh <<'EEE'#!/bin/bash#DEL BEGIN## 1.修改 DNScat >/etc/resolv.conf <<'EOF'nameserver 114.114.114.114nameserver 119.29.29.29nameserver 223.5.5.5EOF## 2.修改默认SSH端口sed -i 's/Port 22/Port 60001/g' /etc/ssh/sshd_configsystemctl restart sshd## 3.删除环境初始化sed -i '/#DEL BEGIN/,/#DEL END/d' /root/init.sh#DEL END# 3.提示信息clearecho -e "\033[33mThe system will automatically shut down within 10 seconds\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"echo -e "\033[33mPlease remove the USB flash drive after the system shuts down\033[0m"sleep 10poweroff
其他自定义需求
官方文档的这个页面有很详细的说明
开始编译
编译速度取决于你的机器 CPU 性能和核心数
# RELEASE: bullseye 代表 Debian 11,jammy 代表 Ubuntu 22,其他参数不要修改./compile.sh RELEASE=bullseye BUILD_MINIMAL=no \BOARD=odroidn2 BRANCH=current BUILD_ONLY=default HOST=armbian BUILD_DESKTOP=no EXPERT=yes \KERNEL_CONFIGURE=no CLEAN_LEVEL="make,cache,alldebs,sources" COMPRESS_OUTPUTIMAGE="sha"
完整参数列表参考:https://docs.armbian.com/Developer-Guide_Build-Options/
打包镜像
编译成功的镜像文件不能直接写到U盘去引导,因为只有一个根文件系统,N1 的引导需要有引导分区和根文件系统分区,所以需要重新打包可引导的映像。
拉取源码
# 拉取源码git clone https://github.com/ophub/amlogic-s9xxx-armbian.git# 进入 amlogic-s9xxx-armbian 根目录cd amlogic-s9xxx-armbian
打包镜像
# 在 amlogic-s9xxx-armbian 目录下创建文件夹 build/output/imagesmkdir -p build/output/images# 拷贝上面编译好的 Armbian 镜像到 amlogic-s9xxx-armbian/build/output/images 目录里## Armbian 镜像文件名称中的发行版本号(如:21.11.0)和内核版本号(如:5.15.50)请保留,它将在重构后用作 Armbian 固件的名称## 进入 amlogic-s9xxx-armbian 根目录,然后运行如下命令即可生成指定 board 的 Armbian 镜像文件sudo ./rebuild -b s905d -k 6.1.21
打包参数说明:本地化打包说明
至此,镜像编译完成,新的镜像同样保存在
build/output/images
目录
编辑镜像
涉及镜像文件内容变更时,不需要重新编译镜像,直接挂载编辑镜像文件即可。
解压已经打包好的镜像,查看镜像分区信息
# 使用下方命令可以查看镜像分区信息fdisk -l filename.img
挂载 img 系统镜像分区
# 查询下一个可用 loop 设备文件,假设是 /dev/loop0losetup -f# 使用 losetup -P 参数挂载 img 文件losetup -P /dev/loop0 filename.imglsblk# 一般会有两个分区,分别为启动分区和文件系统分区mkdir bootmkdir rootfsmount /dev/loop0p1 ./boot/mount /dev/loop0p2 ./rootfs/# 现在就可以根据需要修改镜像了,可执行文件别忘了赋权
编辑完成后,卸载镜像
umount /dev/loop0p1umount /dev/loop0p2losetup -d /dev/loop0# 重新压缩gzip filename.img
发表评论: