VERSION: 1
买了一块 rk3588 的 nanopi M6 用来做家用服务器,由于 Arch Linux 的 arm 版维护不够活跃,最终还是选择使用 Gentoo 操作系统。
本文主要记载整个折腾过程
官方镜像
下载官方 sd 卡镜像,我下载的是 debian 的 image,解压后 dd
进 sd 卡
1 2 gunzip rk3588-sd-debian-bookworm-core-6.1-arm64-20250123.img.gz sudo dd if=rk3588-sd-debian-bookworm-core-6.1-arm64-20250123.img of=/dev/mmcblk0 bs=1M status=progress conv=fsync
登录 ssh
通过 ssh 登录机器,用户名和密码都是 pi
分区
安装必要的工具
1 2 apt update apt install gdisk btrfs-prog dosfstools
1 2 sudo su - cgdisk /dev/nvme0n1
分区情况,我在此处使用 btrfs
文件系统
1 2 3 4 5 6 Part. # Size Partition Type Partition Name ---------------------------------------------------------------- 1007.0 KiB free space 1 512.0 MiB EFI system partition EFI System Partition 2 32.0 GiB Linux swap Swap Partition 3 899.0 GiB Linux filesystem Btrfs
文件系统
创建文件系统
1 2 3 mkfs.vfat /dev/nvme0n1p1 mkswap /dev/nvme0n1p2 mkfs.btrfs /dev/nvme0n1p3
创建基于 btrfs
的 rootfs
子卷
1 2 3 mount /dev/nvme0n1p3 /mnt/ btrfs subvolume create /mnt/rootfs umount /mnt
系统安装
挂载 rootfs 卷和 boot 分区
1 2 3 mkdir -p /mnt/gentoomkdir -p /mnt/gentoo/bootmount -o subvol=/rootfs /dev/nvme0n1p3 /mnt/gentoo/
下载并解压 stage3
1 2 3 cd /mnt/gentoowget https://mirrors.ustc.edu.cn/gentoo/releases/arm64/autobuilds/20250427T235504Z/stage3-arm64-systemd-20250427T235504Z.tar.xz tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner
配置交叉编译环境
以下命令我会使用 PC
,RK
来做命令行 prompt
代表在不同的地方执行语句
1 2 3 4 PC $ sudo emerge --ask sys-devel/crossdev sys-devel/distcc PC $ sudo emerge --ask app-eselect/eselect-repository PC $ sudo eselect repository create crossdev PC $ sudo crossdev --stable --target aarch64-unknown-linux-gnu
配置 distccd
服务,允许局域网客户端连接
1 2 3 4 5 6 7 8 9 10 11 12 13 PC $ sudo systemctl edit --full distccd.service [Unit] Description=Distccd: A Distributed Compilation Server After=network.target [Service] Environment="ALLOWED_SERVERS=192.168.1.0/24" User=distcc ExecStart=/usr/bin/distccd --no-detach --daemon --port 3632 --jobs 16 -N 15 --allow $ALLOWED_SERVERS [Install] WantedBy=multi-user.target
1 2 PC $ sudo systemctl daemon-reload PC $ sudo systemctl restart distccd
后续可以通过以下命令查看 distccd 的状态
1 PC $ sudo systemctl status distccd
接下来配置 RK3588,首先安装 distcc,配置 distcc HOST,这里就是 PC 的 IP 地址了,建议使用静态 IP
同时需要更改 /etc/distcc/hosts
文件确保 IP
一致
1 2 RK # cat /etc/distcc/hosts 192.168.1.3
修改 /etc/portage/make.conf
1 2 3 4 5 6 7 8 9 COMMON_FLAGS="-mcpu=cortex-a76.cortex-a55+crc+crypto -O3 -pipe -fomit-frame-pointer -fPIC" CFLAGS="${COMMON_FLAGS} " CXXFLAGS="${COMMON_FLAGS} " FCFLAGS="${COMMON_FLAGS} " FFLAGS="${COMMON_FLAGS} " USE="cjk dist-kernel dracut -handbook networkmanager systemd-boot" CHOST="aarch64-unknown-linux-gnu" FEATURES="distcc" MAKEOPTS="-j16"
此时已经可以使用 emerge distcc 编译包了
u-boot 和内核
内核
在 PC 机上,参照友善官方文档 编译 uboot
和内核
制作 initramfs 首先到 alpine linux 下载 minirootfs
解压后新增 init
脚本,用来 switch root
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/sh -e tty >/dev/null 2>&1 || { mkdir -p /proc && mount -t proc -o noexec,nosuid,nodev,relatime proc /proc mkdir -p /sys && mount -t sysfs -o noexec,nosuid,nodev,relatime sysfs /sys mkdir -p /dev && mount -t devtmpfs -o nosuid,size=4096k,nr_inodes=32956400,mode=755,inode64 devtmpfs /dev mkdir -p /dev/pts && mount -t devpts -o nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 devpts /dev/pts mkdir -p /tmp && mount -t tmpfs -o nosuid,nodev,nr_inodes=1048576,inode64 tmpfs /tmp exec setsid sh -c 'exec sh /init </dev/ttyFIQ0 >/dev/ttyFIQ0 2>&1' } mkdir -p /newrootmount -o rw,subvol=rootfs /dev/nvme0n1p3 /newroot for MOUNT in proc sys dev tmp; do mkdir -p "/newroot/${MOUNT} " mount --move "/${MOUNT} " "/newroot/${MOUNT} " done exec switch_root -c /dev/console /newroot /sbin/init
1 find . -print0 | cpio --null --create --verbose --format=newc > /home/locez/rk3588/initramfs.cpio
编译内核 1 2 3 4 5 6 7 8 9 10 11 12 13 git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi6-v6.1.y kernel-rk3588 make ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- nanopi6_linux_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-unknown-linux-gnu- -j16 ls arch /arm64/boot/Image -alhmkimage -A arm64 -O linux -T kernel -C gzip -a 0x00400000 -e 0x00400000 -n "Linux Kernel" -d arch /arm64/boot/Image.gz uImage
uboot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 emerge -a dtc git clone https://github.com/friendlyarm/rkbin --single-branch --depth 1 -b nanopi6 git clone https://github.com/friendlyarm/uboot-rockchip --single-branch --depth 1 -b nanopi6-v2017.09 export ARCH=arm64export CROSS_COMPILE=aarch64-unknown-linux-gnu-./make.sh CROSS_COMPILE=$CROSS_COMPILE nanopi6
对之前烧录好的 sd 卡进行 uboot 更新
1 dd if =uboot.img of=/dev/mmcblk0p1 bs=1M
将 uImage
放入 nvme
的 /boot
分区中,然后重启在 uboot
输入
1 2 3 setenv bootcmd "pci enum;nvme scan;load nvme 0:1 ${kernel_addr_c} uImage;bootm ${kernel_addr_c} - ${fdt_addr_r} " saveenv boot
总结
没接触过这块,玩起来还是有点吃力,期间也学习和查了不少东西,所以按照本文写的不一定能完全执行,也可能某些细节有遗漏,请酌情阅读,仅供参考。