----- Forwarded message from "Richard W.M. Jones" <rjo...@redhat.com> -----

Date: Thu, 4 Jan 2018 11:29:51 +0000
From: "Richard W.M. Jones" <rjo...@redhat.com>
To: sw-...@groups.riscv.org
Subject: [sw-dev] Status of the second bootstrap of Fedora/RISC-V

I've almost reached the end of the allotted time available for
bootstrapping Fedora/RISC-V for a second time, so this is a status
report describing what I found and how far I got.

Background
----------

Fedora is a binary Linux distribution.  I first bootstrapped Fedora on
RISC-V at the end of 2016 (the "first bootstrap").
https://fedoraproject.org/wiki/Architectures/RISC-V

To do a Linux distro sanely we need full ABI guarantees at least
between userspace and the kernel, so that involves mainly glibc and
the kernel, and at that time the ABI was changing which meant we would
need to go through the very costly process of re-bootstrapping
everything multiple times.  So after porting a large percentage (I
think about 1/3rd) of all Fedora packages to the (then-) old glibc, I
stopped work on it for about a year.

glibc is supposed to go upstream in a few months from now, and that
will guarantee a stable ABI between userspace and the kernel, allowing
us to sanely build a Linux distro.  I therefore put aside some time
now to practice bootstrapping Fedora again (the "second bootstrap").
When glibc finally goes upstream we will need to do the third and
final bootstrap, and from that point on older Fedora/RISC-V releases
will be used to build each new Fedora release.

Bootstrapping stages
--------------------

[These are historically named and based on the stages we used for
aarch64.]

stages 1 & 2: QEMU and cross-compiler are built from riscv-qemu and
riscv-tools.
https://github.com/rwmjones/fedora-riscv-bootstrap/blob/1858bd496378ddcce88a63c5ceda5483d7b4fdbe/Makefile#L21
https://github.com/rwmjones/fedora-riscv-bootstrap/blob/1858bd496378ddcce88a63c5ceda5483d7b4fdbe/Makefile#L71

stage 3: We build a minimal Fedora/x86_64 chroot and remove all x86_64
ELF binaries and libraries.  Using the hosted cross-compiler we build
RISC-V binaries and libraries and to replace the x86 ones.  We then
build a disk image from the chroot (it has many other hacky aspects to
it) and boot it under qemu.
https://github.com/rwmjones/fedora-riscv-bootstrap/blob/1858bd496378ddcce88a63c5ceda5483d7b4fdbe/Makefile#L117

The stage 3 disk image is just enough to run ‘rpmbuild’ and ‘gcc’ and
a small handful of other tools, which is just enough to build RPMs.
https://github.com/rwmjones/fedora-riscv-bootstrap/blob/1858bd496378ddcce88a63c5ceda5483d7b4fdbe/Makefile#L1386

stage 4: Using only RPMs generated from stage 3 we build a pristine
disk image.  This disk image contains only files controlled by RPMs
[actually there are two additional files needed: /init and a poweroff
binary, both eventually will be replaced by systemd].
https://github.com/rwmjones/fedora-riscv-bootstrap/blob/1858bd496378ddcce88a63c5ceda5483d7b4fdbe/Makefile#L1420

Using the stage 4 disk image we then build the rest of the Fedora
packages.  This requires some manual intervention, usually to break
circular chains of dependencies of which there are many.  There is
also an autobuilder which can build packages from Fedora
alphabetically or by shadowing the Fedora Koji build system.

The autobuilder will need rewriting at some point since it can be made
much more efficient now that we have working networking.

Status of the second bootstrap
------------------------------

I spent about 10 working days on this, and got a large part of the way
through stage 3.  You can see the status and download built packages
here: https://github.com/rwmjones/fedora-riscv-bootstrap
There is also a stage3 disk image here: http://oirase.annexia.org/riscv/

The eagle-eyed will notice that I'm still building some Fedora 24/25
packages (latest is Fedora 27).  This is because those packages
contain all the fixes from the first time around so it's convenient to
use them for the moment.  Even with these packages it should be
sufficient to build Fedora 27 in stage 4 (particularly as packages get
replaced with the new versions as we go along).

Unfortunately I did not yet get a working stage 4 disk image.  A glibc
RPM is required for stage 4 since almost all packages depend on it,
but the glibc build is hanging at some point for unclear reasons.
Debugging anything inside the stage 3 QEMU instance is a recipe for
pain and also debugging tools don't work inside stage 3.

QEMU user networking (with virtio-net virtual device) worked fine for
me, but I wasn't able to compile enough dependencies to get dhcp to
work.

Problems
--------

There is definitely a problem with GCC miscompiling with -O2 (which
can be worked around using -O0).  It affected at least 4 packages, but
I was not able to produce any sort of minimal test case or common
cause.  The issue is being tracked in:
https://github.com/riscv/riscv-gcc/issues/100

There is some bug in the kernel which causes it to hit a BUG_ON in
fs/buffer.c.  Latest status is:
https://groups.google.com/a/groups.riscv.org/d/msg/sw-dev/v05FjcGC1EI/atXXUAcsCgAJ

Poweroff does not work, however I was able to work around it:
https://groups.google.com/a/groups.riscv.org/forum/#!topic/sw-dev/8ps3VtdXpBk

The following bug affects iputils.  I didn't try the upstream fix yet:
https://github.com/riscv/riscv-binutils-gdb/issues/108

A notable problem was building python2 which has multiple build issues
(although python3 was fine).  Luckily Fedora has greatly reduced its
dependence on python2 and no important system packages should depend
on it in F27.  In fact for the third bootstrap I may not even bother
with python2.

I wasn't able to get SMP to work, but unless mttcg also works SMP
wouldn't be helpful anyway.

Future
------

As discussed in the first section, my plan now is to wait until the
glibc changes are accepted upstream and released (hopefully in glibc
2.27).  At that point I will go for the third and final bootstrap.

Rich.

----- End forwarded message -----

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
_______________________________________________
devel mailing list -- devel@lists.fedoraproject.org
To unsubscribe send an email to devel-le...@lists.fedoraproject.org

Reply via email to