NanoPi Neo移植笔记(U-Boot v2025.10 + Linux Kernel 6.18 + Ubuntu 24.04 根文件系统)

笔记记录

宿主机环境

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配置会有所不同,其余部分通用,镜像烧写方法和内存扩展脚本有提示。

相关推荐
默|笙2 小时前
【Linux】进程信号(1)_信号产生
linux·服务器·网络
额1292 小时前
UBUNTU中nginx反向代理(负载均衡)
nginx·ubuntu·负载均衡
一只自律的鸡2 小时前
【Linux系统编程】信号 kill/raise/alarm/pause/alarm实例/漏桶算法
linux·运维·服务器
co_wait2 小时前
【c语言】linux下静态库和动态库制作
linux·c语言·restful
莫白媛2 小时前
Linux中Docker介绍与使用小白篇
linux·运维·docker
ljh5746491192 小时前
linux xargs 命令
linux·运维·windows
工头阿乐2 小时前
企业级统一身份认证全景指南:深入解析 Keycloak、OAuth2、OIDC 与周边生态
linux
GY—Monkey2 小时前
ubuntu (V100)中 部署openclaw,并链接飞书
linux·ubuntu·飞书
OxyTheCrack3 小时前
简述常见经典进程调度算法
linux