前言
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 -y sudo apt full-upgrade -y # 安装依赖 sudo apt install $(curl -fsSL https://is.gd/depend_ubuntu2204_armbian) # 清理 sudo apt autoremove --purge sudo apt clean
编译镜像
拉取 Armbian 源码
git clone --single-branch --depth=1 --branch=main https://github.com/armbian/build.git build
cd 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 update apt-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 # 安装 Docker curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "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/null apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable docker --now mkdir /etc/docker cat >/etc/docker/daemon.json <<'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "1" }, "storage-driver": "overlay2" } EOF systemctl daemon-reload systemctl restart docker # 取消首次登录创建新用户步骤并修改 root 用户密码 ## 不修改的默认用户密码是 root/1234 rm -f /root/.not_logged_in_yet echo "root:1234567" | chpasswd ## 关闭 root 用户终端自动登陆 rm -f /etc/systemd/system/[email protected]/override.conf rm -f /etc/systemd/system/[email protected]/override.conf systemctl daemon-reload # 设置开机自启脚本(脚本文件自行创建) mv /tmp/overlay/init.sh /root chmod +x /root/init.sh ## 将要开机执行的命令添加到 /etc/rc.local 中 'exit 0' 的上面即可 sed -i 's/^exit 0$//g' /etc/rc.local cat >>/etc/rc.local <<'EOF' bash /root/init.sh exit 0 EOF chmod a+x /etc/rc.local systemctl enable rc-local # 清理缓存 apt autoremove -y && apt autoclean && apt remove -y && apt clean
- 实现 EMMC 自动写入
默认不会自动写入 EMMC,系统需要插着U盘才能使用,手动写入需要进入系统执行
armbian-install
命令然后根据提示操作,要实现自动写入则需要利用上方创建的init.sh
开机自启脚本,脚本内容如下,详见注释:#!/bin/bash # 1.写入EMMC lsblk -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} /mnt cat >/mnt/root/init.sh <<'EEE' #!/bin/bash #DEL BEGIN ## 1.修改 DNS cat >/etc/resolv.conf <<'EOF' nameserver 114.114.114.114 nameserver 119.29.29.29 nameserver 223.5.5.5 EOF ## 2.修改默认SSH端口 sed -i 's/Port 22/Port 60001/g' /etc/ssh/sshd_config systemctl restart sshd ## 3.删除环境初始化 sed -i '/#DEL BEGIN/,/#DEL END/d' /root/init.sh #DEL END # 3.提示信息 clear echo -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 10 poweroff
- 其他自定义需求
官方文档的这个页面有很详细的说明
开始编译
编译速度取决于你的机器 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/images mkdir -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/loop0 losetup -f # 使用 losetup -P 参数挂载 img 文件 losetup -P /dev/loop0 filename.img lsblk # 一般会有两个分区,分别为启动分区和文件系统分区 mkdir boot mkdir rootfs mount /dev/loop0p1 ./boot/ mount /dev/loop0p2 ./rootfs/ # 现在就可以根据需要修改镜像了,可执行文件别忘了赋权
- 编辑完成后,卸载镜像
umount /dev/loop0p1 umount /dev/loop0p2 losetup -d /dev/loop0 # 重新压缩 gzip filename.img
Comments | NOTHING