Zum Hauptinhalt springen

Wie konfiguriert man die Linux-Binärkompatibilität auf FreeBSD?

Veröffentlicht am:
.
10 Minuten Lesezeit
.
Für die englische version

Binäre Kompatibilität besteht zwischen zwei verschiedenen Computerumgebungen, wenn Quellcode, der für eine Umgebung in eine Binärdatei kompiliert wurde, auch in der anderen Umgebung fehlerfrei ausgeführt wird. Dies bedeutet, dass der Entwickler den Code nicht neu kompilieren muss, um ihn in einer anderen Umgebung effektiv auszuführen.

FreeBSD bietet optionale binäre Kompatibilität mit Linux, sodass Benutzer Linux-Binärdateien ohne Modifikation installieren und ausführen können. Die Architekturen i386, amd64 und arm64 werden unterstützt.

Einige Linux-spezifische Betriebssystemfunktionen sind auf FreeBSD noch nicht implementiert. Dies ist oft der Fall bei hardware-spezifischen oder systemverwaltungsbezogenen Funktionen, wie cgroups oder namespaces.

Nach Abschluss dieses Tutorials werden Sie verstehen:

  • Was ist die Bedeutung der binären Kompatibilität?

  • Wie man binäre Kompatibilität mit Linux auf FreeBSD erreicht

  • Wie man weitere Shared Libraries für Linux installiert

  • Wie man Linux-Programme auf einem FreeBSD-Betriebssystem installiert

  • Die Implementierungsdetails der Linux-Kompatibilität in FreeBSD

Was ist die Bedeutung der binären Kompatibilität?

Es gibt zwei Möglichkeiten, die Bedeutung der binären Kompatibilität zu untersuchen. Wenn Sie Software für einen einzigen, spezifischen Zweck entwickeln, möchten Sie vermeiden, eine große Codebasis neu zu kompilieren, um eine Änderung in der Umgebung zu berücksichtigen.

Sie verwenden möglicherweise kommerziell erhältliche Software, die auf einem bestimmten Betriebssystem getestet wurde, aber möglicherweise nicht auf einer Variante dieses Betriebssystems (wie einer anderen Linux-Distribution) funktioniert. Sie können den Code nicht neu kompilieren, und Ihre Umgebung kann sich von der unterscheiden, in der der Anbieter das Programm getestet hat.

Was ist der Nachteil des Neukompilierens?

In einigen Fällen kann das Neukompilieren eine praktikable Lösung sein, aber es ist möglicherweise nicht praktikabel, wenn es um komplexe Anwendungen geht, die mehrere Umgebungen unterstützen müssen. In solchen Situationen hat die wiederholte Neukompilierung folgende Nachteile:

  • Zeitaufwendig und schwierig: Wenn eine separate Umgebung keine binäre Kompatibilität aufweist, können eine Reihe von Problemen auftreten. Diese Probleme können Dateien an verschiedenen Orten oder Bibliotheken mit geringfügigen Unterschieden betreffen. Folglich sind erhebliche Zeit, Mühe und Kenntnisse erforderlich, um sicherzustellen, dass die neue Binärdatei im neuen Umfeld genau funktioniert.

  • Erfordern spezialisierte Fähigkeiten: Das Neukompilieren führt zu neuen Fehlern oder Mängeln, die in der ursprünglichen Version nicht vorhanden waren, insbesondere wenn die zugrunde liegende Architektur oder Plattform geändert wurde. Darüber hinaus kann das Neukompilieren kostspielig sein, insbesondere für Organisationen, die hausintern entwickelte maßgeschneiderte Softwarelösungen verwenden.

Was ist der Vorteil der binären Kompatibilität?

Das Wissen, dass eine alternative Umgebung binärkompatibel ist, gibt die Sicherheit, dass kompilierte ausführbare Dateien, ob intern entwickelt oder von einem Anbieter bereitgestellt, ohne Probleme in der Zielumgebung ausgeführt werden. Die binäre Kompatibilität verringert die Notwendigkeit der Neukompilierung, indem sie Software-Updates ermöglicht, ohne den abhängigen Code zu ändern. Dies spart Zeit und Ressourcen und vereinfacht den Prozess der Softwareaktualisierung.

Dennoch können eine Reihe von Umständen Zweifel an der binären Kompatibilität aufwerfen. Zum Beispiel, wenn eine neue Version eines Betriebssystems veröffentlicht wird, entstehen Bedenken, ob bestehende Anwendungen weiterhin nahtlos funktionieren, was darauf hinweist, ob das Betriebssystem binärkompatibel ist.

Ähnlich, nehmen wir an, das bevorzugte Betriebssystem einer Organisation erreicht das Ende seiner Lebensdauer. In einem solchen Fall ist es unerlässlich, ein alternatives binärkompatibles Betriebssystem zur Verfügung zu haben, um die Notwendigkeit einer Neukompilierung oder eines Anwendungswechsels zu vermeiden. Daher ist es unerlässlich, die binäre Kompatibilität zu berücksichtigen, wenn die OS-Strategie einer Organisation bewertet wird.

Was ist die Linux-Binärkompatibilität auf FreeBSD?

Die Linux-Binärkompatibilität, manchmal als Linuxulator bekannt, ermöglicht es FreeBSD, unveränderte Linux-Binärdateien auszuführen. Linuxulator wurde ursprünglich durch den Wunsch motiviert, Doom auf FreeBSD zu spielen. Von seinen Ursprüngen in FreeBSD 2.1 (1995, für diejenigen, die zu Hause mitverfolgen) wird das Kompatibilitätswerkzeug derzeit von Desktop-Anwendungen wie Steam, Tor und Firefox sowie von Server-Arbeitslasten wie Datenbanken, Programmiersprachen und Caches verwendet.

Der Linuxulator verwendet keine virtuellen Maschinen oder Emulation; vielmehr liefert er Binärdateien mit Kernel-Schnittstellen, die denen eines echten Linux-Kernels entsprechen. Technisch gesehen ist es vergleichbar mit der Art und Weise, wie 32-Bit-FreeBSD-Binärdateien auf dem 64-Bit-FreeBSD-Kernel funktionieren.

Es gibt zwei Hauptmethoden zur Verwendung von Linuxulator:

  • Zuerst wird Linux-Software, die als FreeBSD-Ports und -Pakete bereitgestellt wird, mit dem Befehl pkg installiert.

  • Zweitens bietet LinuxJails einen vollständigen Debian/Ubuntu-Benutzerspeicher.

Ersteres bietet weniger Apps, ist aber benutzerfreundlicher. Der zweite Weg ist mühsamer, aber nützlich für Entwicklungsarbeiten. Beide können gleichzeitig verwendet werden.

FreeBSD behauptet, mit Linux 3.2.0 in 12-STABLE und 4.4.0 in 14-CURRENT kompatibel zu sein.

Hier ist eine Sammlung von Linux-Apps, die verwendet werden, um linux(4) auf amd64 unter 13-STABLE und 14-CURRENT zu testen, oft in einer Ubuntu-Chroot-Umgebung. Im Allgemeinen enthält es größere Codeabschnitte, idealerweise solche mit einer zugänglichen Test-Suite.

AppPaketArchVerteilungNotizen
adomadom_linux_ubuntu_64_3.3.3amd64Ubuntu 18.04.4 LTSAus tarball installiert
aptapt-1.6.12ubuntu0.1amd64Ubuntu 18.04.4 LTSMuss APT:: Cache-Start 251658240; zu /etc/apt/apt.conf.d/00aptitude hinzufügen.
Apache HTTPDapache2-2.4.29-1ubuntu4.13amd64Ubuntu 18.04.4 LTS"unsupported setsockopt level 6 optname 9" (TCP_DEFER_ACCEPT)
Bravebrave-browser-1.20.103 : chromium:88.0.4324.152amd64Ubuntu 20.04 LTSEs funktioniert. Aber es gibt einige Warnungen: getsockopt, socket AF_NETLINK. Es wurde mit folgenden Flags getestet: --no-sandbox --no-zygote --test-type --v=0
BusyBoxbusybox-static-1:1.27.2-2ubuntu3.2amd64Ubuntu 18.04.4 LTS
BusyBoxbusybox-static-1:1.30.1-4ubuntu6arm64Ubuntu 20.04 LTS
Chromegoogle-chrome-stable-87.0.4280.88-1amd64Ubuntu 18.04.5 LTSBenötigt die Optionen "--no-sandbox --no-zygote --in-process-gpu"; "--no-zygote" erforderlich für Widevine.
Chromiumchromium-browser87.0.4280.66-0ubuntu0.18.04.1amd64Ubuntu 18.04.5 LTSErfordert die Optionen "--no-sandbox --no-zygote --in-process-gpu"; "--no-zygote" erforderlich für Widevine
Dwarf Fortressdwarf-fortress-0.47.04-1amd64Ubuntu 20.04 LTSInstalliert mit "apt install dwarf-fortress"; die Version aus dem Tarball hat einige Probleme mit den SDL-Bibliotheken
Element Messengerelement-desktop-1.7.21amd64Ubuntu 20.04 LTSEs funktioniert. Aber es gibt einige Warnungen: getsockopt, socket AF_NETLINK. Es wurde mit den folgenden Flags getestet: --no-sandbox --no-zygote --test-type --v=0
EMACSemacs25-25.2+1-6amd64Ubuntu 18.04.4 LTS
Firefoxfirefox-77.0.1+build1-0ubuntu0.18.04.1amd64Ubuntu 18.04.4 LTSFunktioniert auf 13-CURRENT seit r367288
Firestorm ViewerPhoenix_Firestorm-Releasex64_x86_64_6.3.9.58205amd64Ubuntu 20.04.1 LTSFunktioniert mit Intel-Grafik. Funktioniert nicht mit Nvidia, es sei denn, Sie können linux-nvidia-libs oder so etwas patchen.
glxgearsmesa-utils-8.4.0-1amd64Ubuntu 18.04.4 LTSBenötigt mindestens drm-devel-kmod-5.4.62.g20201109, sonst stürzt es sofort ab
golanggolang-2:1.13~1ubuntu2amd64Ubuntu 20.04.3 LTSZum Testen: cd /usr/share/go/test && go run run.go -v
grepgrep-3.1-2build1amd64Ubuntu 18.04.4 LTS
irssiirssi-1.0.5-1ubuntu4.2amd64Ubuntu 18.04.4 LTS
Konsolekonsole-4:17.12.3-1ubuntu1amd64Ubuntu 18.04.4 LTSBenötigt /home und /net nullfs-Mounts; "ioctl fd=9, cmd=0x5441 ('T',65) ist nicht implementiert"
mcmc-3:4.8.19-1amd64Ubuntu 18.04.4 LTSioctl fd=0, cmd=0x541c ('T',28) ist nicht implementiert
MathematicaMathematica_12.1.1_LINUX.shamd64Ubuntu 18.04.4 LTS
MariaDBmariadb-server-10.1-1:10.1.44-0 ubuntu0.18.04.1amd64Ubuntu 18.04.4 LTSProtokolliert Warnungen über innodb_use_native_aio, das nicht unterstützt wird (fehlendes io_setup(2)) und das Setzen der Thread-Nice-Werte nicht möglich ist (wahrscheinlich wegen Linux-Systemaufrufen). master ruft einfach native setpriority(2) auf, die Linux-TIDs nicht nachschlägt)
Mongomongodb-1:3.6.3-0ubuntu1.1amd64Ubuntu 18.04.4 LTSScheint gut zu funktionieren, abgesehen von einem "Fehler beim Überprüfen des Verzeichnisses '/sys/block': Datei oder Verzeichnis nicht gefunden" in den Protokollen
MySQLmysql-server-5.7-5.7.30-0 ubuntu0.18.04.1amd64Ubuntu 18.04.4 LTSProtokollwarnungen (fallocate(32, FALLOC_FL_PUNCH_HOLE
nethacknethack-console-3.6.0-4amd64Ubuntu 18.04.4 LTS
nethacknethack-console-3.6.1-1arm64Ubuntu 20.04 LTS
ninjaninja-build-1.10.0-1build1arm64Ubuntu 20.04 LTSAlle 362 Tests bestehen
Node.jsnodejs-8.10.0~dfsg-2ubuntu0.4amd64Ubuntu 18.04.4 LTSScheint gut zu funktionieren, jedoch sind die Ergebnisse von "make test" noch ausstehend, irgendwann scheinen die auf Googletest basierenden V8-Regressions-Tests bei epoll_wait(2) direkt nach EnvironmentTest hängen zu bleiben. ExitHandlerTest
OpenJDKopenjdk-11-jre-headless:amd64-11.0.7+10-2ubuntu2~18.04amd64Ubuntu 18.04.4 LTS
PostgreSQLpostgresql-12.3amd64Ubuntu 18.04.4 LTSAus einem Tarball installiert, damit Regressionstests (make check) durchgeführt werden können; "Alle 192 Tests bestanden."
PostgreSQLpostgresql-13.3arm64Ubuntu 20.04 LTSAus einem Tarball installiert, damit Regressionstests (make check) durchgeführt werden können; "Alle 201 Tests bestanden."
Pythonpython3-3.6.7-1~18.04amd64Ubuntu 18.04.4 LTS11 Testfehler, ein Hänger; zum Testen: apt install libpython3.6-testsuite && python3.6 -m test -vW -x test_socket; Sie müssen wahrscheinlich fehlende Python-Module nach Bedarf installieren
Pythonpython3-3.8.2-1ubuntu1arm64Ubuntu 20.04 LTS387 Tests bestanden, 12 Tests fehlgeschlagen, 22 Tests übersprungen
Redisredis-5:5.0.7-2amd64Ubuntu 20.04 LTS
RipcordRipcord-0.4.26amd64Ubuntu 20.04 LTSMuss das AppImage-Bundle entpacken, kann die Binärdatei aber wie erwartet ausführen
screenscreen-4.6.2-1ubuntu1amd64Ubuntu 18.04.4 LTS
Spotifyspotify-client-1:1.1.42.622.gbd112320-37amd64Ubuntu 18.04.5 LTSAlsaDriver-Thread-Prozess verbraucht viel CPU
Spotifyspotify-client-1.1.42.622.gbd112320amd64Ubuntu 20.04 LTSEs funktioniert. Aber es gibt einige Warnungen: getsockopt und socket AF_NETLINK
sshopenssh-client-1:7.6p1-4ubuntu0.3amd64Ubuntu 18.04.4 LTS
sshdopenssh-server-1:7.6p1-4ubuntu0.3amd64Ubuntu 18.04.4 LTSFehlende keyctl(2), setfsgid(2); ioctl fd=4, cmd=0x5441 ('T',65) ist nicht implementiert
sudosudo-1.8.21p2-3ubuntu1.2amd64Ubuntu 18.04.4 LTS
tmuxtmux-2.6-3ubuntu0.2amd64Ubuntu 18.04.4 LTSEs gibt eine seltsame Interaktion zwischen FreeBSD- und Linux-Instanzen, die gleichzeitig laufen; ioctl fd=8, cmd=0x5441 ('T',65) ist nicht implementiert
Toontown Rewrittenttr-live-v2.6.8amd64Ubuntu 20.04.1 LTSFunktioniert mit Intel-Grafik, funktioniert nicht mit Nvidia, es sei denn, wir können den linux-nvidia-libs-Port zum Laufen bringen, um mit Ubuntu-Userlands zu funktionieren. AMD-Grafik wurde nicht getestet. Einige Dinge werden nicht korrekt dargestellt.
Vimvim-2:8.0.1453-1ubuntu1.3amd64Ubuntu 18.04.4 LTS
Vivaldivivaldi-stable_3.4.2066.106-1_amd64amd64Ubuntu 20.04.1 LTS
X-AIR-EditX-AIR-Edit_LINUX_V1.7amd64Ubuntu 20.04.01 LTSFix um 7a718f293a1

Tabelle 1. Unter FreeBSD 13-STABLE und 14-CURRENT getestete Linux-Apps

Starten Sie noch heute kostenlos mit Zenarmor

Wie aktiviert man die Linux-Binärkompatibilität?

Die Linux-Binärkompatibilität ist standardmäßig nicht auf FreeBSD aktiviert. Um die Linux-Binärkompatibilität beim Booten zu aktivieren, müssen Sie den folgenden Befehl ausführen, um die Zeile zur Konfigurationsdatei /etc/rc.conf hinzuzufügen:

echo 'linux_enable="YES"'  >>  /etc/rc.conf

Nachdem Sie die Linux-Binärkompatibilität auf Ihrem FreeBSD aktiviert haben, können Sie es ohne Neustart starten, indem Sie den folgenden Befehl ausführen:

service linux start

Unter /compat/linux wird das Skript /etc/rc.d/linux essentielle Kernel-Module laden und Dateisysteme einhängen, die von Linux-Programmen angefordert werden. Es reicht aus, damit statisch verlinkte Linux-Binärdateien funktionieren. Sie werden ähnlich wie native FreeBSD-Binärdateien gestartet. Sie verhalten sich fast identisch wie native Prozesse und können wie gewohnt nachverfolgt und debuggt werden.

Dies ist analog dazu, wie 32-Bit-Binärdateien keine 64-Bit-nativen Bibliotheken verwenden können. Man kann diese Bibliotheken von einer bestehenden Linux-Installation mit derselben Architektur übertragen, sie aus FreeBSD-Paketen installieren oder sie mit debootstrap (aus sysutils/debootstrap) installieren, unter anderem Methoden.

Wie installiert man das CentOS-Basissystem aus FreeBSD-Paketen?

Die einfachste Methode zur Installation von Linux-Bibliotheken besteht darin, das Paket oder den Port emulators/linux_base-c7 zu installieren, das das auf CentOS 7 basierende Basissystem in /compat/linux einrichtet. Sie können die folgenden Schritte befolgen:

  1. Installieren Sie das Paket emulators/linux_base-c7, indem Sie den folgenden Befehl ausführen:

    pkg install linux_base-c7

    Sie sollten die Ausgabe ähnlich wie unten angegeben sehen:

    Updating FreeBSD repository catalogue...
    Fetching packagesite.pkg: 100% 6 MiB 2.3MB/s 00:03
    Processing entries: 100%
    FreeBSD repository update completed. 32289 packages processed.
    All repositories are up to date.
    The following 1 package(s) will be affected (of 0 checked):
    New packages to be INSTALLED:
    linux_base-c7: 7.9.2009_1

    Number of packages to be installed: 1

    The process will require 232 MiB more space.
    35 MiB to be downloaded.

    Proceed with this action? [y/N]: y

    [1/1] Fetching linux_base-c7-7.9.2009_1.pkg: 100% 35 MiB 2.5MB/s 00:15
    Checking integrity... done (0 conflicting)
    [1/1] Installing linux_base-c7-7.9.2009_1...
    [1/1] Extracting linux_base-c7-7.9.2009_1: 100%
    =====
    Message from linux_base-c7-7.9.2009_1:
    --
    Some programs need linprocfs mounted on /compat/linux/proc. Add the following line to /etc/fstab:

    linprocfs /compat/linux/proc linprocfs rw 0 0
    Then run "mount /compat/linux/proc".
    Some programs need linsysfs mounted on /compat/linux/sys. Add the
    following line to /etc/fstab:

    linsysfs /compat/linux/sys linsysfs rw 0 0

    Then run "mount /compat/linux/sys".

    Some programs need tmpfs mounted on /compat/linux/dev/shm. Add the
    following line to /etc/fstab:

    tmpfs /compat/linux/dev/shm tmpfs rw,mode=1777 0 0

    Then run "mount /compat/linux/dev/shm".
  2. Sie können die folgenden Zeilen zu /etc/fstab hinzufügen, um linprocfs, linsysfs und tmpfs zu unterstützen:

    linprocfs /compat/linux/proc linprocfs rw 0 0
    linsysfs /compat/linux/sys linsysfs rw 0 0
    tmpfs /compat/linux/dev/shm tmpfs rw,mode=1777 0 0
  3. Um linprocfs, linsysfs und tmpfs zu mounten, führen Sie die folgenden Befehle aus:

    mount /compat/linux/proc
    mount /compat/linux/sys
    mount /compat/linux/dev/shm

FreeBSD bietet Pakete für mehrere binäre Linux-Programme an. Sie können den folgenden Befehl ausführen, um Sublime Text 4 zusammen mit allen benötigten Linux-Bibliotheken zu installieren:

pkg install linux-sublime-text4

Sie könnten eine Ausgabe ähnlich der folgenden sehen:

Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 90 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
adwaita-icon-theme: 40.1.1
at-spi2-core: 2.44.1
atk: 2.38.0
......................................
wayland: 1.21.0
xkeyboard-config: 2.34_2
xorg-fonts-truetype: 7.7_1
xorgproto: 2022.1

Number of packages to be installed: 90

The process will require 527 MiB more space.
134 MiB to be downloaded.

Proceed with this action? [y/N]: y
[1/90] Fetching linux-c7-cairo-gobject-1.15.12_1.pkg: 100% 13 KiB 13.7kB/s 00:01
[2/90] Fetching libxcb-1.15.pkg: 100% 1 MiB 1.1MB/s 00:01
[3/90] Fetching linux-c7-libxkbcommon-0.7.1_1.pkg: 100% 159 KiB 163.0kB/s 00:01
[4/90] Fetching linux-c7-cyrus-sasl-lib-2.1.26_5.pkg: 100% 170 KiB 174.1kB/s 00:01
[5/90] Fetching libglvnd-1.6.0.pkg: 100% 343 KiB 351.3kB/s 00:01
[6/90] Fetching libpthread-stubs-0.4.pkg: 100% 2 KiB 2.0kB/s 00:01
[7/90] Fetching linux-c7-fribidi-1.0.2_1.pkg: 100% 79 KiB 80.5kB/s 00:01
......................
[88/90] Extracting linux-c7-gtk3-3.22.30_4: 100%
[89/90] Installing desktop-file-utils-0.26_1...
[89/90] Extracting desktop-file-utils-0.26_1: 100%
Building cache database of MIME types
[90/90] Installing linux-sublime-text4-4142...
[90/90] Extracting linux-sublime-text4-4142: 100%
Building cache database of MIME types
Compiling glib schemas
No schema files found: doing nothing.
Generating gdk-pixbuf modules cache
Building the Shared MIME-Info database cache
Running fc-cache to build fontconfig cache...
Generating GIO modules cache
Generating GTK icon cache for /usr/local/share/icons/hicolor
Generating GTK icon cache for /usr/local/share/icons/Adwaita
=====
Message from wayland-1.21.0:
--
Wayland requires XDG_RUNTIME_DIR to be defined to a path that will
contain "wayland-%d" unix(4) sockets. This is usually handled by
consolekit2 (via ck-launch-session) or pam_xdg (via login).
=====
Message from linux-c7-dri-18.3.4_4:
--
This package needs linsysfs mounted on /compat/linux/sys. Add the
following line to /etc/fstab:

linsysfs /compat/linux/sys linsysfs rw 0 0

Then run "mount /compat/linux/sys".
=====
Message from libxkbcommon-1.4.1:
--
If arrow keys don't work under X11 switch to legacy rules e.g.,

For sh/bash/ksh/zsh run and (optionally) add into ~/.profile:
export XKB_DEFAULT_RULES=xorg

For csh/tcsh run and (optionally) add into ~/.login:
setenv XKB_DEFAULT_RULES xorg
=====
Message from dejavu-2.37_1:

--
Make sure that the freetype module is loaded. If it is not, add the following line to the "Modules" section of your X Windows configuration file:

Load "freetype"

Add the following line to the "Files" section of X Windows configuration file:
FontPath "/usr/local/share/fonts/dejavu/"

Note: your X Windows configuration file is typically /etc/X11/XF86Config if you are using XFree86, and /etc/X11/xorg.conf if you are using X.Org.

Wie installiert man das Basis-System von Debian / Ubuntu mit debootstrap?

Die Verwendung von sysutils/debootstrap ist eine alternative Methode zur Bereitstellung von Linux-Shared-Libraries. Dies bietet den Vorteil einer vollständigen Debian- oder Ubuntu-Distribution.

Debootstrap wird verwendet, um Ubuntu auf einer Maschine zu installieren, ohne dass eine Installations-DVD benötigt wird, sowie um eine andere Ubuntu-Variante in einer Chroot-Umgebung auszuführen. Dies ermöglicht es Ihnen, ein vollständiges (minimales) Ubuntu-System zu Testzwecken zu generieren. Durch das Ausführen von SCRIPT bootstrapped debootstrap ein minimales Ubuntu-System von SUITE in TARGET aus MIRROR.

Sie können die Anweisungen befolgen, um das Debian/Ubuntu-Betriebssystem auf Ihrem FreeBSD 13-Knoten zu installieren:

  1. Aktivieren Sie die Linux-Binärkompatibilität, indem Sie die folgenden Befehle ausführen:

    echo 'linux_enable="YES"'  >>  /etc/rc.conf
  2. Um die Einstellungen zur Linux-Binärkompatibilität dauerhaft zu machen, konfigurieren Sie die Bootstrap-Konfigurationsdatei des FreeBSD-Systems /boot/loader.conf wie unten angegeben:

    linux_load="YES"
    linux64_load="YES"
    fdescfs_load="YES"
    linprocfs_load="YES"
    tmpfs_load="YES"
    linsysfs_load="YES"
  3. Schreiben Sie ein Befehls-Skript zum Starten und Stoppen des Ubuntu-Basissystems, indem Sie die folgenden Befehle ausführen.

    touch /usr/local/etc/rc.d/ubuntu
    chmod +x /usr/local/etc/rc.d/ubuntu
    nano /usr/local/etc/rc.d/ubuntu
  4. Fügen Sie die folgenden Shell-Skript-Zeilen in das Skript ein:

    #!/bin/sh
    #
    # PROVIDE: ubuntu
    # REQUIRE: archdep mountlate
    # KEYWORD: nojail
    #
    . /etc/rc.subr
    name="ubuntu"
    desc="Ubuntu for FreeBSD Linux Binary Compatibility"
    rcvar="ubuntu_enable"
    start_cmd="${name}_start"
    stop_cmd=":"

    unmounted()
    {
    [ `stat -f "%d" "$1"` == `stat -f "%d" "$1/.."` -a `stat -f "%i" "$1"` != `stat -f "%i" "$1/.."` ]
    }

    ubuntu_start()
    {
    local _tmpdir
    load_kld -e 'linux(aout|elf)' linux
    case `sysctl -n hw.machine_arch` in
    amd64)
    load_kld -e 'linux64elf' linux64
    ;;
    esac
    if [ -x "/compat/ubuntu/sbin/ldconfigDisabled" ]; then
    _tmpdir=`mktemp -d -t linux-ldconfig`
    /compat/ubuntu/sbin/ldconfig -C ${_tmpdir}/ld.so.cache
    if ! cmp -s "${_tmpdir}/ld.so.cache" "/compat/ubuntu/etc/ld.so.cache"; then
    cat "${_tmpdir}/ld.so.cache" > "/compat/ubuntu/etc/ld.so.cache"
    fi
    rm -rf ${_tmpdir}
    fi
    load_kld pty
    if [ `sysctl -ni kern.elf64.fallback_brand` -eq "-1" ]; then
    sysctl kern.elf64.fallback_brand=3 > /dev/null
    fi
    if [ `sysctl -ni kern.elf32.fallback_brand` -eq "-1" ]; then
    sysctl kern.elf32.fallback_brand=3 > /dev/null
    fi
    sysctl compat.linux.emul_path="/compat/ubuntu"
    unmounted "/compat/ubuntu/dev" && (mount -o nocover -t devfs devfs "/compat/ubuntu/dev" || exit 1)
    unmounted "/compat/ubuntu/dev/fd" && (mount -o nocover,linrdlnk -t fdescfs fdescfs "/compat/ubuntu/dev/fd" || exit 1)
    unmounted "/compat/ubuntu/dev/shm" && (mount -o nocover,mode=1777 -t tmpfs tmpfs "/compat/ubuntu/dev/shm" || exit 1)
    unmounted "/compat/ubuntu/home" && (mount -t nullfs /home "/compat/ubuntu/home" || exit 1)
    unmounted "/compat/ubuntu/proc" && (mount -o nocover -t linprocfs linprocfs "/compat/ubuntu/proc" || exit 1)
    unmounted "/compat/ubuntu/sys" && (mount -o nocover -t linsysfs linsysfs "/compat/ubuntu/sys" || exit 1)
    unmounted "/compat/ubuntu/tmp" && (mount -t nullfs /tmp "/compat/ubuntu/tmp" || exit 1)
    unmounted /dev/fd && (mount -o nocover -t fdescfs fdescfs /dev/fd || exit 1)
    unmounted /proc && (mount -o nocover -t procfs procfs /proc || exit 1)
    true
    }

    load_rc_config $name
    run_rc_command "$1"
  5. Sie können ein ZFS-Dataset für das Verzeichnis der Linux-Kompatibilität erstellen, indem Sie den nächsten Befehl ausführen. Dieser Schritt ist optional. ZFS-Dataset ermöglicht die Nutzung von Snapshots, das sichere Löschen von Dateien ohne Überschreitung von Mountpoints und, falls erforderlich, das sichere Löschen des gesamten Volumes.

    zfs create -o compression=on -o mountpoint=/compat zroot/compat
  6. Führen Sie den nächsten Befehl aus, um die Ordner des Ubuntu-Betriebssystems zu erstellen:

    mkdir -p /compat/ubuntu/{dev/fd,dev/shm,home,proc,sys,tmp}
  7. Aktivieren Sie das Ubuntu-Chroot-Gefängnis und stellen Sie sicher, dass es beim Booten automatisch aktiviert wird, indem Sie den folgenden Befehl ausführen:

    sysrc ubuntu_enable=YES
  8. Um das Ubuntu-Betriebssystem in seiner Chroot-Umgebung zu starten, führen Sie den folgenden Befehl aus:

    service ubuntu start

    Dies wird die folgende Ausgabe anzeigen:

    compat.linux.emul_path: /compat/linux -> /compat/ubuntu
  9. Um debootstrap zu installieren, das verwendet wird, um Ubuntu-Basissysteme herunterzuladen und zu installieren, indem das Ubuntu-Ziel angegeben wird, wie zum Beispiel jammy für Jammy Jellyfish, was Version 22.04 LTS von Ubuntu ist, führen Sie den folgenden Befehl aus:

    pkg install debootstrap

    Sie sollten die Ausgabe ähnlich wie unten angegeben sehen:

    Updating FreeBSD repository catalogue...
    FreeBSD repository is up to date.
    All repositories are up to date.
    The following 18 package(s) will be affected (of 0 checked):
    New packages to be INSTALLED:
    bash: 5.2.15
    debootstrap: 1.0.128
    gmp: 6.2.1
    gnugrep: 3.8
    gnupg: 2.3.8
    gnutls: 3.7.8_1
    libassuan: 2.5.5
    libgcrypt: 1.9.4_1
    libgpg-error: 1.46
    libksba: 1.6.2
    libtasn1: 4.19.0
    nettle: 3.8.1
    npth: 1.6
    p11-kit: 0.24.1_1
    pinentry: 1.2.1
    pinentry-curses: 1.2.1
    sqlite3: 3.40.1,1
    ubuntu-keyring: 2021.03.26

    Number of packages to be installed: 18

    The process will require 54 MiB more space.
    12 MiB to be downloaded.

    Proceed with this action? [y/N]:
    [1/18] Fetching pinentry-curses-1.2.1.pkg: 100% 32 KiB 33.0kB/s 00:01
    [2/18] Fetching gnugrep-3.8.pkg: 100% 250 KiB 255.9kB/s 00:01
    -----------
    [17/18] Installing gnupg-2.3.8...
    [17/18] Extracting gnupg-2.3.8: 100%
    [18/18] Installing debootstrap-1.0.128...
    [18/18] Extracting debootstrap-1.0.128: 100%
    =====
    Message from debootstrap-1.0.128:
    --
    To successfully create an installation of Debian or Ubuntu debootstrap requires the following kernel modules to be loaded:

    linux64 fdescfs linprocfs linsysfs tmpfs

    To install Ubuntu 18.04 LTS (Bionic Beaver) into /compat/ubuntu, run as root:

    debootstrap bionic /compat/ubuntu
  10. Führen Sie den folgenden Befehl aus, um das Basissystem von Ubuntu 22.04 in das Linux-Kompatibilitätsverzeichnis herunterzuladen und zu installieren:

    debootstrap --arch=amd64 --no-check-gpg jammy /compat/ubuntu

    Sie sollten die folgenden Zeilen am Ende der Ausgabe sehen:

    I: Configuring python3-yaml...
    I: Configuring netplan.io...
    I: Configuring ubuntu-advantage-tools...
    I: Configuring networkd-dispatcher...
    I: Configuring kbd...
    I: Configuring console-setup-linux...
    I: Configuring console-setup...
    I: Configuring ubuntu-minimal...
    I: Configuring libc-bin...
    I: Configuring ca-certificates...
    I: Base system installed successfully.
    tipp

    Wenn Sie einen Permission denied-Fehler erhalten, versuchen Sie, chmod 744 /usr/local/sbin/debootstrap auszuführen, um den Fehler zu beheben.

  11. Starten Sie das Ubuntu-Chroot-Jail neu, indem Sie den folgenden Befehl ausführen:

    service ubuntu restart

    Sie sollten die folgende Ausgabe sehen:

  12. Betreten Sie das chroot-Gefängnis, um weitere Operationen auf das Ubuntu-Basisdateisystem zu beschränken, indem Sie den nächsten Befehl ausführen. Wenn Ubuntu eine Benachrichtigung über eine fehlende Gruppen-ID anzeigt, können Sie diese einfach ignorieren. Sie werden bemerken, dass sich die Eingabeaufforderung geändert hat.

    chroot /compat/ubuntu /bin/bash
  13. Sie können die Zeitzone einstellen, indem Sie den nxt-Befehl ausführen:

    echo "%b\n" "0.0 0 0.0\n0\nUTC" >> /etc/adjtime
    dpkg-reconfigure tzdata
  14. Um den apt-Paketmanager zu reparieren, führen Sie den folgenden Befehl aus:

    printf "APT::Cache-Start 251658240;" > /etc/apt/apt.conf.d/00aptitude
  15. Sie können Repositories hinzufügen, indem Sie den folgenden Befehl ausführen:

    echo "deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list
  16. Um Ubuntu-Pakete zu aktualisieren, können Sie die folgenden Befehle ausführen:

    apt update
    apt list --upgradable
    apt upgrade
    apt autoremove
    apt clean
  17. Um das Ubuntu-Chroot-Gefängnis zu verlassen, führen Sie den nächsten Befehl aus:

    exit

Sie haben jetzt die Linux-Binärkompatibilität in FreeBSD aktiviert und Ubuntu auf seinem Basissystem installiert. Sie können Ubuntu- und Debian-Anwendungen und -Binaries installieren, indem Sie das Ubuntu-Chroot-Gefängnis betreten und den apt-Paketmanager verwenden.

Es ist möglich, in /compat/linux zu debootstrapen, jedoch wird geraten, dies zu vermeiden, um Dateikonflikte mit FreeBSD-Ports und -Paketen zu verhindern. Stattdessen leiten Sie den Verzeichnisnamen vom Namen der Distribution oder Version ab, wie zum Beispiel /compat/ubuntu. Wenn die bootstrapped Instanz Linux-Shared-Libraries anbieten soll, ohne explizit chroot oder jails zu verwenden, kann der Kernel darauf verwiesen werden, indem der compat.linux.emul_path sysctl geändert und die folgende Zeile zu /etc/sysctl.conf hinzugefügt wird:

compat.linux.emul_path="/compat/ubuntu"

Dieser sysctl regelt den Pfadübersetzungsmechanismus des Kernels. Bitte beachten Sie, dass Änderungen daran Probleme für Linux-Programme verursachen könnten, die aus FreeBSD-Paketen installiert wurden, da viele dieser Apps noch 32-Bit sind, während Ubuntu anscheinend die Unterstützung für 32-Bit-Bibliotheken einstellt.

Wie entfernt man das Ubuntu-Betriebssystem und die Linux-Binärkompatibilität von FreeBSD?

Das Ubuntu-Basissystem in der Linux-Binärkompatibilität von FreeBSD kann bei Bedarf sicher gelöscht werden, indem zuerst der automatische Start des Ubuntu-Basissystems deaktiviert, dann FreeBSD neu gestartet und schließlich das Ubuntu-Basissystemverzeichnis entfernt oder das ZFS-Volume zerstört wird. Zur zusätzlichen Sicherheit wird empfohlen, ohne Überkreuzen von Mountpunkten zu entfernen. FreeBSD wird abstürzen und die mit FreeBSD verbundenen Datenträgerdienste werden einen Core-Dump erzeugen, wenn das Ubuntu-Basissystem läuft, während versucht wird, es zu löschen.

  1. Deaktivieren Sie die Linux-Binärkompatibilität, indem Sie /etc/rc.conf bearbeiten:

    linux_enable="NO"
  2. Entfernen Sie die folgenden Zeilen, die zum Aktivieren von Linux-Bina aus der Datei /boot/loader.conf hinzugefügt wurden.

    linux_load="YES"
    linux64_load="YES"
    fdescfs_load="YES"
    linprocfs_load="YES"
    tmpfs_load="YES"
    linsysfs_load="YES"
  3. Starten Sie den FreeBSD-Knoten neu:

    reboot
  4. Löschen Sie das Ubuntu-Betriebssystem, indem Sie die folgenden Befehle ausführen:

    cd /compat
    rm -rf ubuntu

Was sind die fortgeschrittenen Linux-Kompatibilitätsthemen?

Die Linux-Kompatibilitätsschicht wird auf FreeBSD weiterhin entwickelt. Einige Programme benötigen das Einhängen bestimmter Dateisysteme. Dies wird standardmäßig vom Skript /etc/rc.d/linux behandelt, kann jedoch durch Hinzufügen der folgenden Zeile zu /etc/rc.conf deaktiviert werden:

linux_mounts_enable="NO"

Dateisysteme, die vom rc-Skript gemountet werden, funktionieren nicht für Linux-Prozesse unter chroots oder jails; konfigurieren Sie sie bei Bedarf in /etc/fstab:

devfs /compat/linux/dev devfs rw,late 0 0
tmpfs /compat/linux/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0
fdescfs /compat/linux/dev/fd fdescfs rw,late,linrdlnk 0 0
linprocfs /compat/linux/proc linprocfs rw,late 0 0
linsysfs /compat/linux/sys linsysfs rw,late 0 0

Da die Linux-Binärkompatibilitätsschicht jetzt sowohl 32-Bit- als auch 64-Bit-Linux-Binärdateien (auf 64-Bit-x86-Hosts) unterstützt, ist es nicht mehr praktikabel, Emulationsfunktionen statisch in einen benutzerdefinierten Kernel zu verlinken.

Wie installiert man zusätzliche Bibliotheken manuell?

Nachdem die Linux-Binärkompatibilität hergestellt wurde, wenn ein Linux-Programm über fehlende Shared Libraries klagt, finden Sie heraus, welche Shared Libraries die Linux Binärdatei benötigt, und installieren Sie sie manuell.

ldd kann von einem Linux-System mit derselben CPU-Architektur verwendet werden, um herauszufinden, welche gemeinsam genutzten Bibliotheken ein Programm benötigt. Zum Beispiel, um zu sehen, welche Shared Libraries linuxdoom benötigt, verwenden Sie den folgenden Befehl auf einem Linux-System mit installiertem Doom:

ldd linuxdoom
libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29

Kopieren Sie dann alle Dateien in der letzten Spalte der Ausgabe des Linux-Systems in /compat/linux auf der FreeBSD-Maschine. Erstellen Sie symbolische Verbindungen zu den Namen in der ersten Spalte, nachdem Sie sie kopiert haben. Dieses Beispiel wird die folgenden FreeBSD-Systemdateien generieren:

/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

Wenn bereits eine Linux-Shared-Bibliothek mit einer Hauptversionsnummer vorhanden ist, die mit der ersten Spalte der ldd-Ausgabe übereinstimmt, muss sie nicht in die in der letzten Spalte erwähnte Datei übertragen werden, da die vorhandene Bibliothek funktionieren sollte. Es wird jedoch empfohlen, die Shared Library zu kopieren, wenn es sich um eine neuere Version handelt. Wenn der symbolische Link auf die neue Version verweist, kann die alte gelöscht werden.

Diese Bibliotheken existieren zum Beispiel bereits auf dem FreeBSD-System:

/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27

ldd zeigt an, dass eine Binärdatei eine neuere Version benötigt:

libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29

Da die aktuelle Bibliothek nur ein oder zwei Versionen hinterherhinkt, sollte die Anwendung auch mit der etwas veralteten Version noch funktionieren. Es ist jedoch sicher, die aktuelle libc.so-Datei durch die aktualisierte Datei zu ersetzen:

/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -> libc.so.4.6.29

In den meisten Fällen ist es nur beim ersten Mal notwendig, die gemeinsam genutzten Bibliotheken zu finden, auf die die Linux-Binärdateien angewiesen sind, wenn eine Linux-Software auf FreeBSD installiert wird. Nach einiger Zeit wird das System über eine ausreichende Sammlung von Linux-Shared-Libraries verfügen, um frisch installierte Linux-Binaries ohne weiteren Aufwand auszuführen.

Wie markiert man Linux ELF-Binärdateien?

Der FreeBSD-Kernel verwendet viele Techniken, um zu erkennen, ob die auszuführende Binärdatei eine Linux-Binärdatei ist:

  • es untersucht die Marke im ELF-Dateikopf

  • sucht nach bekannten ELF-Interpreter-Pfaden,

  • untersucht ELF-Notizen.

Standardmäßig werden unmarkierte ELF-Executables als Linux angesehen. Wenn alle diese Ansätze fehlschlagen, kann die Ausführung der Binärdatei zu einer Fehlermeldung führen:

% ./my-linux-elf-binary
ELF binary type not known
Abort

brandelf ermöglicht es dem FreeBSD-Kernel, zwischen einer FreeBSD ELF-Binärdatei und einer Linux-Binärdatei zu unterscheiden. Sie können den nächsten Befehl zu diesem Zweck ausführen:

brandelf -t Linux my-linux-elf-binary

Wie installiert man eine auf RPM basierende Linux-Anwendung?

Installieren Sie das Paket oder den Port archivers/rpm4, bevor Sie eine auf RPM basierende Linux-Anwendung installieren. Sobald installiert, kann root .rpm-Dateien mit den folgenden Befehlen installieren:

cd /compat/linux
rpm2cpio < /path/to/linux.archive.rpm | cpio -id

Verwenden Sie brandelf für die installierten ELF-Binärdateien, falls erforderlich. Dies wird eine saubere Deinstallation behindern.

Wie konfiguriert man den Hostnamen-Resolver?

Wenn DNS nicht funktioniert oder der folgende Fehler auftritt:

resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword

Sie können /compat/linux/etc/host.conf wie folgt konfigurieren:

order hosts, bind
multi on

Dies weist darauf hin, dass zuerst /etc/hosts durchsucht wird, gefolgt von DNS. Linux-Anwendungen verwenden /etc/host.conf, wenn /compat/linux/etc/host.conf nicht existiert, und beklagen sich über die inkompatible FreeBSD-Syntax. Entfernen Sie bind, wenn in /etc/resolv.conf kein Nameserver eingetragen ist.