|
|
(21 intermediate revisions by 7 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 a disk image = | | = Emulated hardware = |
|
| |
|
| == Tested images ==
| | * [[Architectures/RISC-V/QEMU|QEMU]] |
|
| |
|
| These images have undergone some testing and thus are more likely to work without issues. If you are not sure which image to choose, go with one of these.
| | = Real hardware = |
|
| |
|
| === Download using virt-builder ===
| | SiFive |
|
| |
|
| This is the recommended way to obtain disk images.
| | * [[Architectures/RISC-V/HiFive-Premier-P550|HiFive Premier P550]] |
| | |
| Before you can start using <code>virt-builder</code> for this task, a one-time setup is necessary:
| |
| | |
| <pre>
| |
| $ mkdir -p ~/.config/virt-builder/repos.d/
| |
| $ cat <<EOF >~/.config/virt-builder/repos.d/fedora-riscv.conf
| |
| [fedora-riscv]
| |
| uri=https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/index
| |
| EOF
| |
| </pre>
| |
| | |
| With that out of the way, you can get a list of available RISC-V templates with:
| |
| | |
| <pre>
| |
| $ virt-builder --list | grep riscv64
| |
| fedora-rawhide-developer-20191123.n.0 riscv64 Fedora® Rawhide Developer 20191123.n.0
| |
| fedora-rawhide-minimal-20191123.n.1 riscv64 Fedora® Rawhide Minimal 20191123.n.1
| |
| </pre>
| |
| | |
| Then tell <code>virt-builder</code> to build a custom disk image based on one of the templates:
| |
| | |
| <pre>
| |
| $ virt-builder \
| |
| --arch riscv64 \
| |
| --size 20G \
| |
| --format raw \
| |
| --output Fedora-Developer-Rawhide-20191123.n.0-sda.raw \
| |
| fedora-rawhide-developer-20191123.n.0
| |
| [ 3.6] Downloading: https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20191123.n.0-sda.raw.xz
| |
| [ 6.1] Planning how to build this image
| |
| [ 6.1] Uncompressing
| |
| [ 32.8] Opening the new disk
| |
| [ 38.4] Setting a random seed
| |
| [ 38.4] Setting the machine ID in /etc/machine-id
| |
| [ 38.4] Setting passwords | |
| virt-builder: Setting random password of root to 5PegnZtGMP47bXnw
| |
| [ 39.9] Finishing off | |
| Output file: Fedora-Developer-Rawhide-20191123.n.0-sda.raw
| |
| Output size: 20.0G
| |
| Output format: raw
| |
| Total usable space: 19.7G
| |
| Free space: 14.7G (75%)
| |
| </pre>
| |
| | |
| <code>virt-builder</code> has reasonable defaults, such as generating a random root password for you, but if you want more control you can pass additional arguments to customize the image further: for example, using <code>--format qcow2</code> will cause the output image to be in QCOW2 format. See <code>virt-builder --help</code> for more information.
| |
| | |
| In addition to the disk image, a firmware image (which has to be downloaded separately) is needed as well. To find out the download URL, use:
| |
| | |
| <pre>
| |
| $ virt-builder --arch riscv64 --notes fedora-rawhide-developer-20191123.n.0 | grep fw_payload
| |
| https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20191123.n.0-fw_payload-uboot-qemu-virt-smode.elf
| |
| https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20191123.n.0-fw_payload-uboot-qemu-virt-smode.elf.CHECKSUM
| |
| </pre>
| |
| | |
| Then download it using your favorite HTTP client, for example:
| |
| | |
| <pre>
| |
| $ wget https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/Fedora-Developer-Rawhide-20191123.n.0-fw_payload-uboot-qemu-virt-smode.elf
| |
| </pre>
| |
| | |
| === Download manually ===
| |
| | |
| If using <code>virt-builder</code> is not an option, you can download disk images manually from: https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/
| |
| | |
| Download <code>Fedora-Developer-Rawhide-*.raw.xz</code> as well as the matching <code>Fedora-Developer-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf</code>.
| |
| | |
| == Nightly builds ==
| |
| | |
| You can find them here: http://fedora.riscv.rocks/koji/tasks?state=closed&view=flat&method=createAppliance&order=-id
| |
| | |
| Select the most recent (top) build and download <code>Fedora-Developer-Rawhide-*.raw.xz</code>.
| |
| | |
| These disk images differ from the ones above in that:
| |
| * the firmware is inside the disk image, in the <code>/boot</code> directory;
| |
| * they are completely untested.
| |
| | |
| = Prepare the disk image =
| |
| | |
| These steps are only necessary if you haven't used <code>virt-builder</code>.
| |
| | |
| == 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-*.raw expanded.raw
| |
| $ truncate -s 40G expanded.raw
| |
| $ virt-resize -v -x --expand /dev/sda4 Fedora-Developer-Rawhide-*.raw expanded.raw
| |
| $ virt-filesystems --long -h --all -a expanded.raw
| |
| $ virt-df -h -a expanded.raw
| |
| </pre>
| |
| | |
| 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-*.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-*.raw overlay.qcow2 20G
| |
| $ virt-resize -v -x --expand /dev/sda4 Fedora-Developer-Rawhide-*.raw overlay.qcow2
| |
| $ virt-filesystems --long -h --all -a overlay.qcow2
| |
| </pre>
| |
| | |
| The resulting disk image will only work with QEMU. Make sure you use <code>overlay.qcow2</code> instead of <code>Fedora-Developer-Rawhide-*.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-*.raw --hostname fedora-riscv-mymagicbox
| |
| </pre>
| |
| | |
| == Nightly builds only: extracting firmware (OpenSBI) ==
| |
| | |
| 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 the firmware.
| |
| | |
| This is '''only''' necessary for nightly builds, since for tested images these files are provided as separate downloads alongside the image.
| |
| | |
| Example session:
| |
| | |
| <pre>
| |
| $ guestfish \
| |
| add Fedora-Developer-Rawhide-*.raw : \
| |
| run : \
| |
| mount /dev/sda1 / : \
| |
| ls /opensbi/unstable
| |
| fw_jump.elf
| |
| fw_payload-5.2.0-0.rc7.git0.1.0.riscv64.fc31.riscv64.elf
| |
| fw_payload-uboot-qemu-virt-smode.elf
| |
| $ guestfish \
| |
| add Fedora-Developer-Rawhide-*.raw : run : mount /dev/sda1 / : \
| |
| download /opensbi/unstable/fw_payload-uboot-qemu-virt-smode.elf fw_payload-uboot-qemu-virt-smode.elf
| |
| </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-*.raw -m /dev/sda1 $PWD/a
| |
| $ cp a/opensbi/unstable/fw_payload-uboot-qemu-virt-smode.elf .
| |
| $ guestunmount $PWD/a
| |
| </pre>
| |
| | |
| <pre>
| |
| $ sudo modprobe nbd max_part=8
| |
| $ sudo qemu-nbd -f raw --connect=/dev/nbd1 $PWD/Fedora-Developer-Rawhide-*.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/opensbi/unstable/fw_payload-uboot-qemu-virt-smode.elf .
| |
| $ 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.
| |
| | |
| The steps below assume you have copied both the disk image and the firmware into <code>/var/lib/libvirt/images</code>: this is the location where libvirt usually expects to find disk images, so while using a different location might work it's a good idea to do this and reduce the possibility of issues caused by filesystem permissions and such.
| |
| | |
| Assuming you have QEMU ≥ 4.0.0, libvirt ≥ 5.3.0 and virt-manager ≥ 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/Fedora-Developer-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \
| |
| --import --disk path=/var/lib/libvirt/images/Fedora-Developer-Rawhide-*.raw \
| |
| --network network=default \
| |
| --graphics none
| |
| </pre>
| |
| | |
| If you are stuck with older software (QEMU ≥ 2.12.0, libvirt ≥ 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/Fedora-Developer-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \
| |
| --import --disk path=/var/lib/libvirt/images/Fedora-Developer-Rawhide-*.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 Fedora-Developer-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \
| |
| -object rng-random,filename=/dev/urandom,id=rng0 \
| |
| -device virtio-rng-device,rng=rng0 \
| |
| -device virtio-blk-device,drive=hd0 \
| |
| -drive file=Fedora-Developer-Rawhide-*.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 -o PreferredAuthentications=password -o PubkeyAuthentication=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 ==
| |
| | |
| The disk image can be copied directly to an SD card and run on the [https://www.sifive.com/products/hifive-unleashed/ HiFive Unleashed board].
| |
| | |
| A good way to create the SD card is with this virt-builder command:
| |
| | |
| <pre>
| |
| sudo virt-builder \
| |
| --source https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/index \
| |
| --no-check-signature \
| |
| --arch riscv64 \
| |
| --format raw \
| |
| --hostname testing.example.com \
| |
| --output /dev/sdXXX \
| |
| --root-password password:riscv \
| |
| fedora-rawhide-developer-20200108.n.0
| |
| </pre>
| |
| | |
| == Install on the HiFive Unleashed using NBD server ==
| |
| | |
| You will need a separate machine on the same network which can act as an NBD server. It can be any Linux machine with [https://github.com/qemu/qemu/blob/master/qemu-nbd.c qemu-nbd] or [https://github.com/libguestfs/nbdkit nbdkit] installed.
| |
| | |
| You will first need to get it working on the SD card using the instructions in the previous section.
| |
| | |
| On the HiFive board, install <code>dracut-network</code> and <code>nbd</code>, and rebuild the initramfs with NBD support using these commands:
| |
| <pre>
| |
| dnf install dracut-network nbd
| |
| dracut -m "nbd network base" -v --force
| |
| </pre>
| |
| | |
| Shut down the HiFive board, remove the SD card, and copy the 4th partition from the SD card into a file or partition on the NBD server.
| |
| | |
| == 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 more information being displayed during boot, remove <code>quiet</code> from the <code>append</code> line in <code>/boot/extlinux/extlinux.conf</code>.
| |