Building a Linuxulator userland from source
- Reply: Gleb Popov : "Re: Building a Linuxulator userland from source"
- Reply: Alexander Leidinger : "Re: Building a Linuxulator userland from source"
- Reply: Felix Palmen : "Re: Building a Linuxulator userland from source"
- Reply: Cy Schubert : "Re: Building a Linuxulator userland from source"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 18 Aug 2023 06:23:24 UTC
Hi all,
for the last two weeks, I've been working on a spike in ports which now
reached a state where I want to show it to and discuss it with fellow
ports hackers.
First, a link to my feature branch (warning, will be rebased every now
and then):
<https://github.com/Zirias/zfbsd-ports/commits/linux>
The goal is to create a replacement for the now antiquated linux-c7
userland. While the classic approach would be to find another Linux
distribution that's not too much of a moving target and start
"repackaging" that, I want to try something different: Build the
required packages from source.
** Why
It will be quite some work to do this, I'm not really sure about it yet
(and how it would compare to the repackaging approach), so feasibility
is yet to be decided. But I hope to get at least these two advantages:
- Provide the newest GNU libs (glibc, libstdc++, ...) built against
exactly the Linux version emulated by the FreeBSD version this will
run on. This should make it possible to run a lot more Linux binaries
without relying on e.g. Linux jails.
- When binaries don't work for missing Linux libraries, make it somewhat
easy to add them, maybe based on already existing FreeBSD ports.
** State
I just reached a state where I can build a working Linux-native GNU
toolchain (binutils, glibc, gcc) for C and C++ on aarch64, amd64 and
i386. From here on, it should be simpler, there are already two ports in
my branch (archivers/linux-bzip2 and archivers/linux-xz) using that
native toolchain for building.
** How
The native toolchain is built by a cross toolchain, the packages for
this cross-toolchain are prefixed "lxcross-". For building this cross
toolchain, bootstrapping versions of binutils and gcc are needed to
build the initial glibc, these versions are suffixed "-bootstrap".
lxcross ports set PREFIX to ${LXCROSSBASE}, which defaults to
${LOCALBASE}/linux-cross. lxcross-*-bootstrap ports set PREFIX to
${LXBOOTSTRAP}, this one defaults to ${LXCROSSBASE}/bootstrap.
** Open issues
This is an unordered list off my head, so most likely incomplete.
- Some trickery with PREFIX is currently needed. The ports framework
expects PREFIX to be used as is by the upstream build system. This
won't hold for building Linux packages, PREFIX must be /compat/linux
for that, but passed to the upstream build system in DESTDIR.
- LIB_DEPENDS don't work, which could probably be solved in the
framework. Right now, I'm using a hacky workaround to define
LINLIB_DEPENDS and add it to both RUN_ and BUILD_DEPENDS.
- A lot of smaller things that *should* be provided by the framework,
some of them probably by USES=linux, are currently copy&pasted to
every port needing them. I wanted to keep it simple while first trying
to get it to work, so the framework isn't touched yet at all.
- Some stage-qa checks get confused, some (e.g. checking that everything
is stripped) don't work.
- In my tests, "poudriere testport" failed at least on i386, because it
mounts linprocfs on /compat/linux/proc and then tries to remove
/compat/linux (remove pre-existing PREFIX). To test the ports, I had
to slightly modify the testport script for now.
- For the Linux headers, there should be a metaport picking the Linux
version based on ${OSVERSION}. This doesn't exist yet, Linux 4.4.x is
always used.
- Building the final linux-gcc ports, I get weird error messages
directly to poudriere's terminal (they do NOT appear in the build
log!) like this:
ELF interpreter /usr/lib/ld-linux.so.2 not found, error 2
I have no idea where this comes from, so far I couldn't identify any
negative effect though.
Acknowledgement: I found quite some useful info for doing this in the
"Linux from Scratch" book. Of course you can't just follow the book
(very different scenario, it assumes building on Linux and not doing any
staging/packaging), but it *does* have some helpful hints.
Cheers, Felix
--
Felix Palmen <zirias@FreeBSD.org> {private} felix@palmen-it.de
-- ports committer -- {web} http://palmen-it.de
{pgp public key} http://palmen-it.de/pub.txt
{pgp fingerprint} 6936 13D5 5BBF 4837 B212 3ACC 54AD E006 9879 F231