Skip to content

Setup Arch Linux RISC V Development Environment

XieJiSS edited this page Mar 22, 2022 · 28 revisions

This documentation helps you set up an Arch Linux RISC-V development environment with QEMU usermode and systemd-nspawn.

Currently, this documentation contains instructions for Arch Linux, Debian and Ubuntu.

Install Packages

Arch Linux

  1. Add [archlinuxcn] repo

We will install packages from [archlinuxcn] later.

Append to /etc/pacman.conf:

[archlinuxcn]
Server = https://repo.archlinuxcn.org/$arch

There is also a list of public mirrors available.

Add PGP Keys:

$ sudo pacman -Sy && sudo pacman -S archlinuxcn-keyring
  1. 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.

Debian and Ubuntu

$ 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 using the rootfs.

Prepare rootfs

  1. Download rootfs
$ curl -O https://archriscv.felixc.at/images/archriscv-20210601.tar.zst
$ sha512sum archriscv-20210601.tar.zst
6f012a169fe6f1ea15aeb3283091466e7992f78d823951ee2170940fa030e7fa2394aee11bf67c29943d21579ab42d2262a3d5ca973b5de8be779f338ba1dd44  archriscv-20210601.tar.zst
  1. Decompress rootfs

Arch Linux

$ mkdir archriscv
$ sudo bsdtar -xf archriscv-20210601.tar.zst -C archriscv

Debian and Ubuntu

$ mkdir archriscv
$ sudo tar -I zstd -xf archriscv-20210601.tar.zst -C archriscv

Start and Setup Container

$ sudo systemd-nspawn -D ./archriscv -a -U

where -D provides the root directory for the container, -a for preventing processes with PID 1 doesn't reap zombie children, -U for preventing processes in container to use the same UID range as outside the container.

  1. Check the architecture
# uname -m
riscv64
  1. System upgrade
# pacman -Syu
  1. Install necessary packages

For example, install vim:

# pacman -S vim
  1. Set default editor
# echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
  1. Create a regular user and allow sudo access
# useradd -m <username>

where -m for create the user's home directory.

Then run visudo, add under ## User privilege specification:

username ALL=(ALL) NOPASSWD: ALL
  1. Switch to the regular user
# exec su username
$ cd ~
$ pwd
/home/username
$ echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc

Now we are all done.

Compile and Run the First Program

  1. Write the program

In vim hello.c, write:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello RISC-V!\n");
    return 0;
}
  1. Compile
$ gcc -o hello hello.c
  1. Check the file format
$ 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

RISC-V is expected in the output.

  1. Run
$ ./hello
Hello RISC-V!
Clone this wiki locally