在 RISC-V 板子(哪吒 D1)上安装 Arch Linux

为什么是这块板子

一个月前,在操作 MirrorZ 项目时,我了解到肥猫建的镜像站——武昌首义学院开源软件镜像站,在其中发现一个申必的项目:archriscv,我当时表示震撼猫猫。

过了一段时间,也就是一周前,我心血来潮想找块 RISC-V 板子玩玩,试一下 archriscv(别问我为啥不用 qemu 玩),于是问肥猫有没有消费级板子,肥猫表示可以看看这块。

为了论证这块板子能装上 Arch Linux,我看了一些教程和文档,不过发现结果不尽人意,不仅需要用 Windows 特有工具来烧录固件(我手头甚至没有一台 Windows 机器),其内核也较难 hack(源码需要注册后下载,编译需要奇妙虚拟机,生成的镜像是特殊的),这对于我来说非常难受。

不过好在,在 Icenowy 的介绍下,我找到了 https://linux-sunxi.org/Allwinner_Nezha 这个页面,其中给出了一个比较舒畅的折腾方式(主线内核!),至少我能自己折腾分区表和内核了。

所以有两条路,要么采用厂商附带的分区表、内核,要么自己编译,我更倾向于后者,不过保险起见,我先尝试了前者。

厂商附带

由于厂商镜像必须得使用 Windows 特有工具来烧录(Icenowy 并不推荐 hack 这个分区表),我只能找一个 dd 出来的镜像,由于我买的时候没有附带 SD 卡,我前往相关论坛找资源,可惜下载下来均不能用。幸好,我找到了二老师,二老师刚好有一份 dd 出来的备份,于是我拿到了一个能工作的镜像!

该镜像的基础版本是 sipeed debian hdmi,是二老师用 Windows 烧录后 dd 出来用于备份的,避免每次需要重新用 Windows 烧写。

我在 dd 后,成功启动!

可惜折腾了一阵后,发现内核缺了不少东西,自己也编译不了相关模块,我准备随便弄一弄就交差了。按照 sipeed 的说法,只需要自己换一个 rootfs 就行,于是我直接把 sipeed 镜像的 debian rootfs 删了换成 archriscv 的,指令如下

1
2
3
4
mount /dev/mmcblk0p7 /mnt
cd /mnt
rm -rf *
tar xf ~/archriscv-20210601.tar.zst

然后对该 rootfs 做些调整,如何调整参见后文。

之后就是上电启动了,我没去验证图形界面,只试了串口和 ssh。

注意其中内核版本。

主线内核

https://linux-sunxi.org/Allwinner_Nezha 中已经非常详细了,在做完这个页面的步骤后即按照 Manual Build Howto 页面的步骤走即可,其中一些参数随着情况改变就行。

一些构建小建议:

加速内核代码下载

1
2
3
4
5
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
cd linux
git remote add smaeul git@github.com:smaeul/linux.git
git fetch smaeul riscv/d1-wip
git checkout smaeul/riscv/d1-wip

交叉编译环境构建:由于我用 NixOS,所以……

1
2
3
4
5
6
7
8
with import <nixpkgs> {
crossSystem = {
config = "riscv64-unknown-linux-gnu";
};
};

mkShell {
}

内核编译时还有一些 HOST 依赖,我是这样用的 nix-shell -p gcc flex bison pkg-config ncurses openssl bc swig libelf gmp zlib libmpc pahole

不过在这里要提醒一点,现在该内核、glibc、工具链等的相性不是很好,一些服务(乃至 systemd 本体)在启动时容易 SEGV,最终导致 kernel panic 然后不能启动,我的解决方案是,将所有 SEGV 的服务都 systemctl mask 掉!

同时,其他不少软件(基本在涉及网络的地方,比如 curl,比如 pacman)都会 SEGV,导致我装软件包只能按照后文中所提的那样,拆下 sd 卡后 chroot 进去装。当然,我们发现 ssh 是能工作的,所以也可以把包 scp 上去然后 pacman -U 安装。

SEGV/panic 的具体情况可以参考 https://gist.github.com/heitbaum/e4dceeb7b236560b94cc66fce91cdd11

注意其中内核版本,既有 patch 也有我本地修改,按过不表。

rootfs 调整

首先修改 /etc/fstab,使得根目录是 rw 的(这能避免一些 SEGV)

1
/dev/mmcblk0p2  /       ext4    user_xattr,errors=remount-ro    0       1

之后替换镜像源

1
sed -i 's_archriscv.felixc.at_mirrors.wsyu.edu.cn/archriscv_g' /etc/pacman.conf

顺便,据肥猫介绍,archriscv-20210601.tar.zst 的 root 密码是 sifive,而比这个更早的镜像没有密码(不过有些小坑在里面)

顺便, archlinuxcn/binfmt-qemu-static 相当好用,arch-chroot 进去以后直接调整各种配置也比较清爽。

镜像下载

镜像下载估计会托管到 archriscv 那边,不过按照目前的情况看,使用厂商内核的镜像可以直接下载 sipeed 的 debian 镜像然后更换 rootfs,没啥技术含量;而折腾主线内核的同学应该有精力自己编译,该内核目前也还不稳定,下载后发现基本不能用反而影响不好,所以没必要提供下载。