笔记记录
宿主机环境
ubuntu26.04
目录结构
/home/image/work/nanopi_neo_build/
├─ rootfs/rootfs_ubuntu2404 # 根文件系统目录
├─ uboot/u-boot-v2025.10 # U-Boot 目录
├─ kernel/linux-6.18 # Linux 6.18 内核目录
└─ build-image.sh # 打包镜像脚本
宿主机安装必要软件包
sudo apt update
sudo apt install -y swig u-boot-tools libgnutls28-dev python3-dev git wget curl gcc-arm-linux-gnueabihf bc bison flex libssl-dev make libc6-dev libncurses5-dev device-tree-compiler kmod cpio rsync dosfstools mtools parted gdisk e2fsprogs fakeroot
Uboot部分
下载uboot源码包
cd /home/image/work/nanopi_neo_build/uboot
git clone --depth 1 -b v2025.10 https://source.denx.de/u-boot/u-boot.git u-boot-v2025.10
编译
# 清理旧编译产物
make distclean
# NanoPi Neo 配置文件
make CROSS_COMPILE=arm-linux-gnueabihf- nanopi_neo_defconfig
# 编译(-j 后接 CPU 核心数,加速编译)
make CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
# 编译完成产物
u-boot-sunxi-with-spl.bin ==》》 这是全志 H3 专用合并固件(SPL + U-Boot),后续烧录到 SD 卡固定位置。
烧写验证
# 将sd卡插入电脑,查看sd卡名称,虚拟机大部分是/dev/sdb,根据容量自行判断
df -h
# 假设 sd 卡是:/dev/sdb
# 烧写 U‑Boot 到 /dev/sdb
cd ~/work/nanopi_neo_build/uboot/u-boot-v2025.10
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 conv=notrunc
sync
# 全志 H3 芯片强制要求:of=/dev/sdb + seek=8
# 烧写成功的标志,出现类似这样:
510+1 records in
510+1 records out
522848 bytes (523 kB, 511 KiB) copied, 0.439967 s, 1.2 MB/s
# 现在可以测试 U‑Boot 了!
# 弹出 SD 卡
# 插入 NanoPi Neo
# 上电
# 串口看到 U‑Boot 启动信息就完成了,比较简单
U-Boot SPL 2025.10 (Mar 21 2026 - 20:38:56 +0800)
DRAM: 512 MiB
Trying to boot from MMC1
U-Boot 2025.10 (Mar 21 2026 - 20:38:56 +0800) Allwinner Technology
CPU: Allwinner H3 (SUN8I 1680)
Model: FriendlyARM NanoPi NEO
DRAM: 512 MiB
Core: 64 devices, 18 uclasses, devicetree: separate
WDT: Not starting watchdog@1c20ca0
MMC: mmc@1c0f000: 0
... ...
内核部分
源码编译
# 下载最新主线内核6.18
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.tar.xz
# 加载 NanoPi Neo (H3) 默认配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sunxi_defconfig
# 这里根据需求可以进行内核裁剪,我这里保持默认基础配置
# 编译内核 + 设备树 + 模块
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules -j$(nproc)
# 生成镜像和设备树文件
image@Lenovo:~/work/nanopi_neo_build/kernel/linux-6.18$ ls arch/arm/boot/zImage -alh
-rwxrwxr-x 1 image image 5.6M Mar 20 10:19 arch/arm/boot/zImage
mage@Lenovo:~/work/nanopi_neo_build/kernel/linux-6.18$ ls -alh arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo.dtb
-rw-rw-r-- 1 image image 29K Mar 20 10:14 arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo.dtb
ubutun24.04文件系统制作
安装必要的软件
sudo apt install -y qemu-user binfmt-support binfmt-support debootstrap parted dosfstools libarchive-tools rsync
强制注册 ARM 模拟器(关键!)
sudo update-binfmts --enable qemu-arm
回到目录
cd /home/image/work/nanopi_neo_build
执行 debootstrap 下载根文件系统文件
sudo debootstrap --arch=armhf noble ./rootfs/rootfs_ubuntu2404 http://ports.ubuntu.com/ubuntu-ports
配置文件系统
跑完上面这条,直接进入 chroot,进行文件系统配置
sudo chroot ./rootfs/rootfs_ubuntu2404
1. 设置主机名
echo "nanopi-neo" > /etc/hostname
echo "127.0.0.1 localhost" > /etc/hosts
echo "127.0.1.1 nanopi-neo" >> /etc/hosts
2. 设置 root 密码(必须)
passwd
输入密码:******
3. 创建普通用户(安全必备,不要一直用 root)
useradd -m -s /bin/bash pi
passwd ******
# 给用户加 sudo 权限
usermod -aG sudo pi
4. 配置软件源 二选一即可
Ubuntu 24.04 armhf 官方源
cat > /etc/apt/sources.list << EOF
deb http://ports.ubuntu.com/ubuntu-ports noble main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports noble-updates main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports noble-security main restricted universe multiverse
EOF
清华国内源(最快)
cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports noble main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports noble-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports noble-security main restricted universe multiverse
EOF
5. 安装必备软件
apt update
apt install -y \
systemd systemd-sysv udev sudo bash-completion \
openssh-server isc-dhcp-client iproute2 net-tools \
curl wget nano htop i2c-tools usbutils \
locales tzdata rsyslog parted fdisk util-linux
6. 开启串口终端(NanoPi 串口调试必须)
systemctl enable serial-getty@ttyS0.service
7. 开启 SSH
systemctl enable ssh
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
8. 配置网络(开机自动连网)
mkdir -p /etc/netplan
cat > /etc/netplan/00-default.yaml << EOF
network:
version: 2
renderer: networkd
ethernets:
end0: # 这里改成你实际的网卡名 end0
dhcp4: true
optional: true
EOF
chmod 600 /etc/netplan/00-default.yaml
9. 设置时区(东八区)
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
10. 清理垃圾(减小镜像体积)
apt clean
apt autoremove -y
11. 创建扩容脚本
# 在根目录bin文件夹下,创建rootfs_expand.sh
cd /usr/bin
touch rootfs_expand.sh
cat > /usr/bin/rootfs_expand.sh << EOF
#!/bin/bash
parted -s /dev/mmcblk0 resizepart 2 100%
resize2fs /dev/mmcblk0p2
df -h
EOF
# 添加执行权限
chmod +x /usr/bin/rootfs_expand.sh
12. 退出 chroot(完成配置)
exit
镜像打包
# 安装必要软件
sudo apt update
sudo apt install -y parted dosfstools e2fsprogs rsync util-linux
# 创建打包镜像脚本
cd "/home/image/work/nanopi_neo_build
touch build_image.sh
chmod +x build_image.sh
打包脚本内容如下
shell
#!/bin/bash
set -e
# ====================== 你的目录 ======================
BASE_DIR="/home/image/work/nanopi_neo_build"
ROOTFS_DIR="$BASE_DIR/rootfs/rootfs_ubuntu2404"
UBOOT_DIR="$BASE_DIR/uboot/u-boot-v2025.10"
KERNEL_DIR="$BASE_DIR/kernel/linux-6.18"
IMAGE_NAME="$BASE_DIR/nanopi-neo-ubuntu2404.img"
# ====================== 1. 创建空镜像 ======================
echo "===== 创建空镜像 ====="
rm -f "$IMAGE_NAME"
dd if=/dev/zero of="$IMAGE_NAME" bs=1M count=2048 status=progress
# ====================== 2. fdisk 分区(无报错)======================
echo "===== 分区 ====="
sudo fdisk "$IMAGE_NAME" << EOF
o
n
p
1
32768
163839
t
c
a
n
p
2
163840
w
EOF
# ====================== 3. 写入U-Boot ======================
echo "===== 写入U-Boot ====="
dd if="$UBOOT_DIR/u-boot-sunxi-with-spl.bin" of="$IMAGE_NAME" bs=1024 seek=8 conv=notrunc
# ====================== 4. 挂载 ======================
LOOP=$(sudo losetup -f --show "$IMAGE_NAME")
sudo partprobe "$LOOP"
sleep 1
# ====================== 5. 格式化 ======================
echo "===== 格式化 ====="
sudo mkfs.vfat -F 32 -n BOOT "${LOOP}p1"
sudo mkfs.ext4 -L ROOTFS "${LOOP}p2"
# ====================== 6. 挂载 ======================
sudo mkdir -p /mnt/boot /mnt/rootfs
sudo mount "${LOOP}p1" /mnt/boot
sudo mount "${LOOP}p2" /mnt/rootfs
# ====================== 7. 拷贝内核 ======================
echo "===== 拷贝zImage/dtb ====="
sudo cp "$KERNEL_DIR/arch/arm/boot/zImage" /mnt/boot/
sudo cp "$KERNEL_DIR/arch/arm/boot/dts/allwinner/sun8i-h3-nanopi-neo.dtb" /mnt/boot/
# ====================== 8. 启动脚本(纯净无扩容)======================
sudo cat > /mnt/boot/boot.cmd << EOF
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
load mmc 0:1 0x42000000 zImage
load mmc 0:1 0x43000000 sun8i-h3-nanopi-neo.dtb
bootz 0x42000000 - 0x43000000
EOF
sudo mkimage -C none -A arm -T script -d /mnt/boot/boot.cmd /mnt/boot/boot.scr
# ====================== 9. 写入rootfs ======================
echo "===== 写入rootfs ====="
sudo rsync -aHAx \
--exclude="/dev/*" --exclude="/proc/*" --exclude="/sys/*" --exclude="/tmp/*" \
"$ROOTFS_DIR"/ /mnt/rootfs/
# ====================== 10. 清理 ======================
sync
sudo umount /mnt/boot /mnt/rootfs
sudo losetup -d "$LOOP"
echo -e "\n镜像制作完成!"
echo -e "\n使用方法:"
echo -e "1. 查看SD卡: lsblk"
echo -e "2. 写入SD卡: sudo dd if=nanopi-neo-ubuntu2404.img of=/dev/sdb bs=4M status=progress conv=fsync"
echo -e "3. 弹出SD卡: sudo eject /dev/sdb"
echo -e "4. 系统启动后扩容文件系统至整个sd卡: sudo rootfs_expand.sh"
结语
宿主环境为
ubuntu26版本,之前版本qemu配置会有所不同,其余部分通用,镜像烧写方法和内存扩展脚本有提示。