From Fedora Project Wiki
(Reworked by Andrea Bolognani (abologna))
(Add SiFive HiFive Premier P550)
 
(26 intermediate revisions by 8 users not shown)
Line 1: Line 1:
This page describes the steps necessary to get Fedora for RISC-V running, either on emulated or real hardware.
The process of installing Fedora RISC-V might be target-dependent. Check out the relevant page for detailed information.


= Obtain and prepare a disk image =
= Emulated hardware =


== Tested images ==
* [[Architectures/RISC-V/QEMU|QEMU]]


You can find them here: https://dl.fedoraproject.org/pub/alt/risc-v/disk-images/fedora/
= Real hardware =


Download <code>Fedora-Developer-Rawhide-*-sda1.raw.xz</code> as well as <code>bbl-*.riscv64</code> and <code>initramfs-*.img</code>.
* [[Architectures/RISC-V/HiFive-Premier-P550|SiFive HiFive Premier P550]]
 
These disk images:
* contain a single "naked" filesystem (<code>root=/dev/vda</code>);
* have SELinux set to enforcing=1;
* have restored default SELinux security context (<code>restorecon -Rv /</code>);
* kernel, initramfs, config and BBL are available as separate downloads;
* have been booted in QEMU/libvirt a few times to verify.
 
If you are not sure which image to choose, go with this one.
 
== Nightly builds ==
 
<!-- http://fedora-riscv.tranquillity.se/koji/tasks?state=closed&view=flat&method=createAppliance&order=-id -->
 
You can find them here: http://185.97.32.145/koji/tasks?state=closed&view=flat&method=createAppliance&order=-id
 
Select the most recent (top) build and download <code>Fedora-Developer-Rawhide-*-sda.raw.xz</code>.
 
These disk images:
* contain a partitioned disk (<code>root=/dev/vda1</code>);
* have SELinux set to enforcing=1;
* have restored default SELinux security context (<code>restorecon -Rv /</code>);
* kernel, initramfs, config and BBL are inside the disk image, in the <code>/boot</code> directory;
* are completely untested.
 
If you choose this image, you'll have to tweak most of the commands below to account for the different names for the root partition and the disk image itself.
 
== Uncompress the image ==
 
Whether you have downloaded a tested image or a nightly build, you'll need to uncompress it before it can be used:
 
<pre>
$ unxz Fedora-Developer-Rawhide-*.raw.xz
</pre>
 
== Optional: expand the disk image ==
 
You might want to expand the disk image before setting up the VM. Here is one example:
 
<pre>
truncate -r Fedora-Developer-Rawhide-*-sda.raw expanded.raw
truncate -s 40G expanded.raw
virt-resize -v -x --expand /dev/sda1 Fedora-Developer-Rawhide-*-sda.raw expanded.raw
virt-filesystems --long -h --all -a expanded.raw
virt-df -h -a expanded.raw
</pre>
 
You can only perform this operation if you downloaded a nightly build.
 
The resulting disk image will work with QEMU as well as TinyEMU. Make sure you use <code>expanded.raw</code> instead of <code>Fedora-Developer-Rawhide-*-sda.raw</code> when booting the guest.
 
== Optional: create an overlay ==
 
You can also create <code>qcow2</code> disk image with <code>raw</code> Fedora disk as backing one. This way Fedora <code>raw</code> is unmodified and all changes are written to <code>qcow2</code> layer. You will need to install <code>libguestfs-tools-c</code>.
 
<pre>
qemu-img create -f qcow2 -F raw -b Fedora-Developer-Rawhide-*-sda.raw overlay.qcow2 20G
virt-resize -v -x --expand /dev/sda1 Fedora-Developer-Rawhide-*-sda.raw overlay.qcow2
virt-filesystems --long -h --all -a overlay.qcow2
</pre>
 
You can only perform this operation if you downloaded a nightly build.
 
The resulting disk image will only work with QEMU. Make sure you use <code>overlay.qcow2</code> instead of <code>Fedora-Developer-Rawhide-*-sda.raw</code> when booting the guest.
 
== Optional: set the hostname before booting ==
 
If you want to change hostname before the first boot, install <code>libguestfs-tools-c</code> and then run:
 
<pre>
virt-customize -a Fedora-Developer-Rawhide-*-sda1.raw --hostname fedora-riscv-mymagicbox
</pre>
 
== Nightly builds only: extracting kernel, config, initramfs and BBL ==
 
Fedora/RISC-V does not support BLS (Boot Loader Specification - [https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault more details]).
 
Disk images contain a <code>/boot</code> directory from where you can copy out kernel, config, initramfs and BBL (contains embedded kernel).
 
This is '''only''' necessary for nightly builds, since for tested images these files are provided as separate downloads alongside the image.
 
Example session:
 
<pre>
$ export LIBGUESTFS_BACKEND=direct
$ guestfish \
  add Fedora-Developer-Rawhide-20190126.n.0-sda.raw : run : \
  mount /dev/sda1 / : ls /boot | grep -E '^(bbl|config|initramfs|vmlinuz)' | grep -v rescue
bbl-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64
config-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64
initramfs-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64.img
vmlinuz-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64
$ guestfish \
  add Fedora-Developer-Rawhide-20190126.n.0-sda.raw : run : mount /dev/sda1 / : \
  download /boot/bbl-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 bbl-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 : \
  download /boot/config-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 config-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 : \
  download /boot/initramfs-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64.img initramfs-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64.img : \
  download /boot/vmlinuz-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 vmlinuz-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64
</pre>
 
You can also use <code>guestmount</code> or QEMU/NBD to mount disk image. Examples:
<pre>
$ mkdir a
$ guestmount -a $PWD/Fedora-Developer-Rawhide-20190126.n.0-sda.raw -m /dev/sda1 $PWD/a
$ cp a/boot/bbl-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64 .
$ guestunmount $PWD/a
</pre>
 
<pre>
$ sudo modprobe nbd max_part=8
$ sudo qemu-nbd -f raw --connect=/dev/nbd1 $PWD/Fedora-Developer-Rawhide-20190126.n.0-sda.raw
$ sudo fdisk -l /dev/nbd1
Disk /dev/nbd1: 7.5 GiB, 8053063680 bytes, 15728640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F0F4268F-1B73-46FF-BABA-D87F075DCCA5
 
Device      Start      End  Sectors  Size Type
/dev/nbd1p1  2048 15001599 14999552  7.2G Linux filesystem
$ sudo mount /dev/nbd1p1 a
$ sudo cp a/boot/initramfs-5.0.0-0.rc2.git0.1.0.riscv64.fc30.riscv64.img .
$ sudo umount a
$ sudo qemu-nbd --disconnect /dev/nbd1
</pre>
 
Note NBD is highly useful if you need to run <code>fdisk</code>,  <code>e2fsck</code> (e.g. after VM crash and filesystem lock up), <code>resize2fs</code>. It might be beneficial to look into <code>nbdkit</code> and <code>nbd</code> packages.
 
= Boot the image on virtual hardware =
 
There are several options for booting the image on virtual hardware once you've prepared it following the steps above.
 
== Boot with libvirt ==
 
Detailed instructions how to install libvirt: https://docs.fedoraproject.org/en-US/quick-docs/getting-started-with-virtualization/
 
Quick instructions for libvirt installation (tested on Fedora 30):
 
<pre>
dnf group install --with-optional virtualization
systemctl enable --now libvirtd
</pre>
 
When running RISC-V guests, it's usually a good idea to use the very latest versions of QEMU, libvirt and virt-manager: the <code>virt-preview</code> repository offers just that for Fedora users. To enable it, simply run:
 
<pre>
dnf copr enable @virtmaint-sig/virt-preview
</pre>
 
and update your system.
 
Assuming you have QEMU &ge; 4.0.0, libvirt &ge; 5.3.0 and virt-manager &ge; 2.2.0, the installation will be as simple as:
 
<pre>
# virt-install \
  --name fedora-riscv \
  --arch riscv64 \
  --vcpus 8 \
  --memory 2048 \
  --os-variant fedora30 \
  --boot kernel=/var/lib/libvirt/images/bbl-*.riscv64,initrd=/var/lib/libvirt/images/initramfs-*.img,kernel_args="console=ttyS0 ro root=/dev/vda" \
  --import --disk path=/var/lib/libvirt/images/Fedora-Developer-Rawhide-*-sda1.raw \
  --network network=default \
  --graphics none
</pre>
 
If you want graphics rather than serial console, simply replace <code>--graphics none</code> with <code>--graphics spice</code>.
 
If you are stuck with older software (QEMU &ge; 2.12.0, libvirt &ge; 4.7.0), then you're going to need a more verbose command line:
 
<pre>
# virt-install \
  --name fedora-riscv \
  --arch riscv64 \
  --machine virt \
  --vcpus 8 \
  --memory 2048 \
  --os-variant fedora30 \
  --boot kernel=/var/lib/libvirt/images/bbl-*.riscv64,initrd=/var/lib/libvirt/images/initramfs-*.img,kernel_args="console=ttyS0 ro root=/dev/vda" \
  --import --disk path=/var/lib/libvirt/images/Fedora-Developer-Rawhide-*-sda1.raw,bus=virtio \
  --network network=default,model=virtio \
  --rng device=/dev/urandom,model=virtio \
  --channel name=org.qemu.guest_agent.0 \
  --graphics none
</pre>
 
Additionally, when using older software components you won't get PCI support, and so enabling graphics will not be possible.
 
Either one of the commands above will automatically boot you into the console. If you don't want that add <code>--noautoconsole</code> option. You can later use <code>virsh</code> tool to manage your VM and get to console.
 
A quick reference of <code>virsh</code> commands:
* <code>virsh list --all</code> - list all VMs and their states
* <code>virsh console <name></code> - connect to serial console (remember: <code>Escape character is ^]</code>)
* <code>virsh shutdown <name></code> - power down VM (see above for more details)
* <code>virsh start <name></code> - power up VM
* <code>virsh undefine <name></code> - remove VM
* <code>virsh net-list</code> - list network (useful for the next command)
* <code>virsh net-dhcp-leases <network_name></code> - list DHCP leases, <code><network_name></code> most likely will be <code>default</code>. This is useful when you want to get IPv4 and SSH to the VM.
* <code>virsh domifaddr <name></code> - alternative for the above two commands, only shows IPv4 for one VM
* <code>virsh reset <name></code> - hard reset VM
* <code>virsh destroy <name></code> hard power down of VM
 
If you want to use <code>ssh user@virtualMachine</code> you can setup libvirt NSS module. See: https://wiki.libvirt.org/page/NSS_module
 
You might want also to setup logging for serial console (in case kernel panics or something else).
 
For this we will be using two commands: <code>virsh edit <name></code> (modifying VM XML) and <code>virsh dumpxml <name></code> (dump VM XML for backup). You need to modify <code><serial></code> node by adding <code><log file='/var/log/libvirt/qemu/fedora-riscv-mymagicbox.serial.log'/></code>. Then power down and power up the VM.
 
Alternatively you can use <code>--serial log.file=/.../whatever.serial.log</code> with <code>virt-install</code> command.
 
== Boot under QEMU ==
 
You will get the best results if your QEMU version is 4.0.0 or newer, but any version since 2.12.0 will work.
 
<pre>
qemu-system-riscv64 \
    -nographic \
    -machine virt \
    -smp 8 \
    -m 2G \
    -kernel bbl \
    -initrd initramfs-*.img \
    -object rng-random,filename=/dev/urandom,id=rng0 \
    -device virtio-rng-device,rng=rng0 \
    -append "console=ttyS0 ro root=/dev/vda" \
    -device virtio-blk-device,drive=hd0 \
    -drive file=Fedora-Developer-Rawhide-*-sda1.raw,format=raw,id=hd0 \
    -device virtio-net-device,netdev=usernet \
    -netdev user,id=usernet,hostfwd=tcp::10000-:22
</pre>
 
Once machine is booted you can connect via SSH:
 
<pre>
ssh -p 10000 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@localhost
</pre>
 
== Boot under TinyEMU (RISCVEMU) ==
'''Note (2019 March 10):''' This is not supported anymore until TinyEMU is updated to support external initrd file. Please, use QEMU or libvirt/QEMU.
 
RISCVEMU recently (2018-09-23) was renamed to TinyEMU (https://bellard.org/tinyemu/).
 
TinyEMU allow booting Fedora disk images in TUI and GUI modes. You can experiment using JSLinux (no need to download/compile/etc) here: https://bellard.org/jslinux/
 
Below are instructions how to boot Fedora into X11/Fluxbox GUI mode.
 
'''Step 1'''. Compile TinyEMU:
 
<pre>
wget https://bellard.org/tinyemu/tinyemu-2018-09-23.tar.gz
tar xvf tinyemu-2018-09-23.tar.gz
cd tinyemu-2018-09-23
make
</pre>
 
'''Step 2'''. Setup for booting Fedora:
 
<pre>
mkdir fedora
cd fedora
cp ../temu .
 
# Download pre-built BBL with embedded kernel
wget https://bellard.org/jslinux/bbl64-4.15.bin
 
# Create configuration file for TinyEMU
cat <<EOF > root-riscv64.cfg
/* VM configuration file */
{
    version: 1,
    machine: "riscv64",
    memory_size: 1400,
    bios: "bbl64-4.15.bin",
    cmdline: "loglevel=3 console=tty0 root=/dev/vda rw TZ=${TZ}",
    drive0: { file: "Fedora-Developer-Rawhide-*-sda1.raw" },
    eth0: { driver: "user" },
    display0: {
        device: "simplefb",
        width: 1920,
        height: 1080,
    },
    input_device: "virtio",
}
EOF
 
# Download disk image and unpack in the same directory
</pre>
 
'''Step 3'''. Boot it.
 
<pre>
./temu -rw root-riscv64.cfg
</pre>
 
We need to use <code>-rw</code> if we want our changes to persist in disk image. Otherwise disk image will be loaded as read-only and all changes will not persist after reboot.
 
= Boot the image on physical hardware =
 
== Install on the HiFive Unleashed SD card ==
 
These are instructions for the [https://www.sifive.com/products/hifive-unleashed/ HiFive Unleashed board].
 
The disk image (above) is partitioned, but usually we need an unpartitioned ("naked") filesystem.  There are several ways to get this, but the easiest is:
 
<pre>
$ guestfish -a Fedora-Developer-Rawhide-*-sda.raw \
    run : download /dev/sda1 Fedora-Developer-Rawhide-*-sda1.raw
</pre>
 
This creates a naked ext4 filesystem called <code>*-sda1.raw</code>.  The naked ext4 filesystem can be copied over the second partition of the SD card.
 
You can also build a custom bbl+kernel+initramfs to boot directly into the SD card using [https://github.com/rwmjones/fedora-riscv-kernel these sources].
 
== Install on the HiFive Unleashed using NBD server ==
 
Look at https://github.com/rwmjones/fedora-riscv-kernel in the <code>sifive_u540</code> branch.  This is quite complex to set up so it's best to ask on the <code>#fedora-riscv</code> IRC channel.
 
== Install Fedora GNOME Desktop on SiFive HiFive Unleashed + Microsemi HiFive Unleashed Expansion board ==
 
Detailed instructions are provided by Atish Patra from Western Digital Corporation (WDC). See their GitHub page for details and pictures: https://github.com/westerndigitalcorporation/RISC-V-Linux
 
So far two GPUs are confirmed to be working: Radeon HD 6450 and Radeon HD 5450.
 
= Use the image =
 
Once the system is booted, login as <code>root</code> with <code>riscv</code> as password.
 
X11 with Fluxbox can be started using: <code>startx /usr/bin/startfluxbox</code>. The disk image also includes awesome and i3 for testing. Dillo is available as a basic web browser (no javascript support) and pcmanfm as file manager.
 
To gracefully shutdown just type <code>poweroff</code> into console.
 
If you want less information being displayed during boot then add <code>quiet</code> into <code>kernel_args</code> line, e.g.: <code>console=ttyS0 ro quiet root=/dev/vda</code>

Latest revision as of 14:50, 14 December 2024

The process of installing Fedora RISC-V might be target-dependent. Check out the relevant page for detailed information.

Emulated hardware

Real hardware