Boot an Arch Linux RISC-V using qemu-system
CAUTION
We (distro packagers) decided to modify GCC spec to get rid of just way too many atomic symbol missing error. AFAIK debian does the same thing in the same way.
So, you may notice that some program compiles without -latomic
flag, but that's not the case if you switch to some other distros. I wrote another blog post explaining this in detail.
In short: For GCC you should add -latomic
if you use std::atomic<T>
where sizeof(T)
is lower than 4. Also apply to those __atomic_compare_exchange_2()
stuff. Clang is not affected.
Method
This approach requires you to be on a non-RISC-V Arch Linux (x86_64 or aarch64, etc.) machine, because we use pacstrap
and pacman
.
1 | # pacman -Syu then reboot is recommended before this |
The default root password is archriscv
. You will be asked to change the root password the first time you boot the machine. DO NOT LEAVE IT BLANK, or you won't be able to login as root user later.
If, in the last step, you find yourself stucked at [ OK ] Reached target Graphical Interface
for too long, just press Ctrl-C and re-run startqemu.sh
.
After booting the machine, you may need to install necessary packages:
1 | sudo pacman -S git vim gcc |
Detailed Explanation (zh)
mkrootfs
首先执行 /usr/share/makepkg/util.sh
来初始化当前的 bash 环境。这个脚本由 Arch Linux 的 makepkg
提供,里面有许多工具函数,例如 msg
函数可以往屏幕上打印出好看的 log。
1 | . /usr/share/makepkg/util.sh |
解析参数、显示帮助的部分这里略过。
创建 rootfs 的第一步是确保将会被视作 rootfs 的 /
目录的新创建的文件夹权限正确:
1 | mkdir -p ./rootfs |
随后调用 pacstrap 来生成 rootfs。
1 | sudo pacstrap \ |
这里的 /usr/share/devtools/pacman-extra-riscv64.conf
是类似于 /etc/pacman.conf
的一个配置文件,其中声明了包括软件源在内的一些配置:
1 | #[testing] |
这里的软件源配置比较重要,是 pacstrap
魔法的一部分。实际上,在调用 pacstrap
时,传入的 base
参数就告诉 pacstrap
需要从上述源里面下载、安装 base
组里面所有的软件包,其中就包括了 linux
、glibc
和 pacman
。而上述源就是 riscv64gc
架构的源,其中的软件包均面向 riscv64gc
架构编译,因此可以在 RISC-V 64 位 CPU 上的 Arch Linux 操作系统中运行。在 pacstrap
执行完毕后,base
meta package 中的所有软件包都已安装完成,这时的 rootfs 已经安装了 Arch Linux 的最小发行版。
再往下,则是配置镜像源。
1 | sudo sed -E -i 's|#(Server = https://riscv\.mirror\.pkgbuild\.com/repo/\$repo)|\1|' ./rootfs/etc/pacman.d/mirrorlist |
https://riscv.mirror.pkgbuild.com 为 Arch Linux 维护者在 pkgbuild.com
域名上为 Arch Linux RISC-V 创建的全球镜像。如果不添加这个镜像,初始的默认源从国内访问可能较慢或干脆无法访问。
1 | sudo pacman \ |
清空 pacman 的软件包缓存。通过 --sysroot
参数指定了 rootfs。
1 | sudo usermod --root $(realpath ./rootfs) --password $(openssl passwd -6 "$password") root |
设置系统密码。默认为 archriscv
。usermod
的 --password
接受的是密码的哈希,因此需要使用 openssl passwd -6 "$password"
算出给定的密码的哈希,再传给 usermod
。
1 | sudo bsdtar --create \ |
将配置完毕的 rootfs 文件夹压缩为 .tar.gz
格式,使用 --xattrs
以确保文件的 extended attribute 得到保留。压缩成功后,可以删除刚才临时创建的 rootfs 文件夹。
mkimg
TBD