-
Notifications
You must be signed in to change notification settings - Fork 81
Setup Arch Linux RISC V Development Environment
This documentation aims to help you set up an Arch Linux RISC-V (riscv64gc
) development environment powered by usermode QEMU and systemd-nspawn
.
Currently, the documentation contains instructions for Arch Linux, Debian and Ubuntu.
Caution: If you are using a native RISC-V board, you should skip these steps, and scroll down to the bottom of this page. The following instruction is for x86_64, etc. users.
If you are using Ubuntu/Debian as the host OS, skip to "For Debian and Ubuntu".
Add [archlinuxcn]
Repo Source
We need to install some packages from [archlinuxcn] later.
Append these two lines to /etc/pacman.conf
:
[archlinuxcn]
Server = https://repo.archlinuxcn.org/$arch
There is also a list of public mirrors available.
After doing so, you need to trust the archlinuxcn
maintainers' PGP keys to install packages from it:
$ sudo pacman -Sy && sudo pacman -S archlinuxcn-keyring
Install Packages
$ sudo pacman -S qemu-user-static binfmt-qemu-static
where binfmt-qemu-static
is for registering QEMU interpreter to execute RISC-V ELF files. Other necessary packages like zstd
and systemd-nspawn
are listed in the dependency tree of base
meta package, so they will also be installed by the provided command, hence there's no need to install them explicitly.
$ sudo apt install zstd qemu-user-static systemd-container
where zstd
is for decompressing the Arch Linux RISC-V rootfs compressed tarball, and systemd-container
is for the systemd-nspawn
command, which we'll use later to spawn a container from the rootfs.
$ curl -O https://archriscv.felixc.at/images/archriscv-20210601.tar.zst
$ sha512sum archriscv-20210601.tar.zst
6f012a169fe6f1ea15aeb3283091466e7992f78d823951ee2170940fa030e7fa2394aee11bf67c29943d21579ab42d2262a3d5ca973b5de8be779f338ba1dd44 archriscv-20210601.tar.zst
UPDATE: A newer version archriscv-20220727.tar.zst
is available.
If you have poor connectivity to reach archriscv.felixc.at, you can also download the rootfs from mirror sites. They are listed at https://archriscv.felixc.at/.
root
user's password is sifive
, but probably you don't need it if you are creating a container with this rootfs to chroot
into it later.
Arch Linux
$ mkdir archriscv
$ bsdtar -xf archriscv-20210601.tar.zst -C archriscv
Debian and Ubuntu
$ mkdir archriscv
$ tar -I zstd -xf archriscv-20210601.tar.zst -C archriscv
tar
may spit out some warnings, which turn out to be harmless and we can safely ignore them.
$ sudo systemd-nspawn -D ./archriscv -a -U
where -D
provides the root directory for the container, -a
for preventing processes with PID 1 from not reaping zombie children, -U
for preventing processes in container from using the same UID range as those used outside the container.
# uname -m
riscv64
# pacman -Syu
For example, if you want to install vim:
# pacman -S vim
# echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
# useradd -m <username>
where -m
means to create a home directory for the user to be added.
Use visudo
if you'd like to grant sudo privilege for this user, and append this line under ## User privilege specification
:
<username> ALL=(ALL) NOPASSWD: ALL
# exec su username
$ cd ~
$ pwd
/home/<username>
$ echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
This guide is about compile & run a program manually. If you want to start your development from a git repo or so, jump to 3.2 Compile for instructions on how to install
git
and other packages needed by your toolchain. If you are trying to create or modify an Arch Linux package (i.e. dealing with aPKGBUILD
), you may refer to related ArchWiki pages.
Run vim hello.c
and type:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello RISC-V!\n");
return 0;
}
Exit with esc and :wqEnter, as this S/O answer suggested :-P
First of all, update your local packages repo data from remote package sources (like sudo apt-get update
):
$ sudo pacman -Sy
You should run this prior to any attempt to install a package, unless you are sure that your local copy of package info is up-to-date.
Then, install your development toolchain:
$ sudo pacman -S gcc cmake foo bar bah
Compile your code:
$ gcc -o hello hello.c
$ file hello
hello: ELF 64-bit LSB pie executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=4a75c57e4e99654dca0d6dc91689dffbbe7dc581, for GNU/Linux 4.15.0, not stripped
$ ./hello
Hello RISC-V!
For native RISC-V board users:
Edit your /etc/pacman.conf
with the following settings:
[core]
Server = https://archriscv.felixc.at/repo/$repo
[extra]
Server = https://archriscv.felixc.at/repo/$repo
[community]
Server = https://archriscv.felixc.at/repo/$repo
[unsupported]
Server = https://archriscv.felixc.at/repo/$repo
Then, add the packager's public key to your keyring:
$ pacman-key --recv-keys "B5971F2C5C10A9A08C60030F786C63F330D7CB92" # Always grab the latest key ID from https://archlinux.org/people/developers/#felixonmars