Installieren Sie 64-Bit-Programme auf einem 32-Bit-Betriebssystem mit einem 64-Bit-Prozessor


8

Ich bin neugierig. Ist es möglich, ein 64-Bit-Programm auf einem 32-Bit-Betriebssystem mit einem 64-Bit-Prozessor zu installieren?

Ich verwende Linux auf einem Himbeer-Pi 3 und versuche, eine neuere Version von MongoDB zu installieren:

armv7l GNU/Linux
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian

1
Verwenden Sie stattdessen ein 64-Bit-Betriebssystem. Raspbian ist weit hinter der Zeit; 64-Bit-Fedora ist bereits für das RPi3 verfügbar .
Michael Hampton

Antworten:


19

Ist es möglich, ein 64-Bit-Programm auf einem 32-Bit-Betriebssystem mit einem 64-Bit-Prozessor zu installieren?

Im Prinzip ja, aber der Prozessor und das Betriebssystem müssen es unterstützen.

In ARMv8 kann ein 32-Bit-Kernel (Aarch32) keine 64-Bit-Prozesse (Aarch64) ausführen. Dies ist eine Einschränkung des Prozessors.

Es gibt andere Prozessoren, die diese Einschränkung nicht haben. Beispielsweise ist es möglich, x86_64-Prozesse auf einem x86_32-Kernel auf einem x86_64-Prozessor auszuführen, aber nur wenige Kernel unterstützen dies, vermutlich weil es nur einen begrenzten Nutzen hat (meistens speichern Sie a Bit RAM im Kernel durch 32-Bit). Linux unterstützt es nicht, Solaris jedoch.

Sie können Ihr vorhandenes 32-Bit-Betriebssystem beibehalten, wenn Sie einen 64-Bit- Kernel ausführen . Ein Aarch64 Linux-Kernel kann Aarch32-Prozesse ausführen. Raspbian unterstützt dies nicht sofort, daher müssen Sie sowohl ein 32-Bit-Betriebssystem als auch ein 64-Bit-Betriebssystem verwalten. Sie können entweder eines als Hauptbetriebssystem verwenden (dh dasjenige, auf dem Init- und Systemdienste ausgeführt werden) und das andere, um ein bestimmtes Programm mit chroot auszuführen. Siehe Wie führe ich 32-Bit-Programme auf einem 64-Bit-Debian / Ubuntu aus? für einen praktischen Ansatz.

Beachten Sie, dass Sie alle für das 64-Bit-Programm erforderlichen Bibliotheken installieren müssen. Jeder Prozess muss entweder vollständig 32-Bit oder vollständig 64-Bit sein, sodass Sie keine 32-Bit-Bibliothek in einer ausführbaren 64-Bit-Datei verwenden können.

Wenn Sie keine triftigen Gründe haben, ein 32-Bit-System beizubehalten, ist es einfacher, ein 64-Bit-System zu installieren, wenn Sie eine ausführbare 64-Bit-Datei ausführen müssen.

Beachten Sie, dass 64-Bit-Programme nur 32-Bit-Programme nicht mehr als 3 GB virtuellen Speicher adressieren können, was auf einem System mit 1 GB RAM nur von begrenztem Nutzen ist. Sie können Leistungsvorteile durch die zusätzlichen, größeren Register erzielen, aber Sie verlieren auch die Leistung durch die zusätzlichen Speicherzugriffe.


3
@Wildcard Kurz gesagt, der Prozessor befindet sich zu jedem Zeitpunkt entweder im 32-Bit-Modus („Aarch32-Ausführungsstatus“) und erwartet Aarch32-Anweisungen oder im 64-Bit-Modus erwartet er Aarch64-Anweisungen. Die einzige Möglichkeit, den Modus zu wechseln, besteht darin, zwischen Prozess und Kernel (oder Kernel und Hypervisor oder Hypervisor und Monitor) zu wechseln. Das Umschalten in einen Modus mit niedrigeren Berechtigungen kann nicht von 32-Bit auf 64-Bit umschalten, und das Umschalten in einen Modus mit höheren Berechtigungen stellt immer den vorherigen Modus wieder her. Es ist daher unmöglich, einen 32-Bit-Code mit einer höheren Berechtigung als 64-Bit-Code auszuführen.
Gilles 'SO - hör auf böse zu sein'

2
@Wildcard (Forts.) Vermutlich liegt der Grund für diese Einschränkung darin, dass es ziemlich viele Aarch64-spezifische Prozessorzustände gibt und auf den Aarch32-Code nicht zugreifen kann. Beispielsweise kann ein Aarch32-Kernel die Register eines Aarch64-Prozesses nicht speichern.
Gilles 'SO - hör auf böse zu sein'

2
@crellee, Gilles: Sie müssen sich keine exotischen Betriebssysteme ansehen, um Beispiele für 32-Bit-Kernel mit 64-Bit-Userlands zu finden. Die äußerst beliebten Kernel Mac OS X 10.4 "Tiger", 10.5 "Leopard" und 10.6 "Snow Leopard" wurden in der K32- Konfiguration für fast alle Macs ausgeliefert, mit Ausnahme einiger Server-Computer, auf denen Snow Leopards K64 , aber alle gestartet werden durften Sie waren in der Lage, 64-Bit-Userland-Prozesse auszuführen (mit zunehmend weniger Einschränkungen).
Iwillnotexist Idonotexist

3
@Serge: Was Sie beschreiben, gilt für 286 -> 386: Sie können die 32-Bit-Operandengröße im 16-Bit-Real-Modus mit Präfixen verwenden, wobei die Standardoperandengröße 16 beträgt. Intel hat jedoch nicht einmal x86-64 entwickelt. das war AMD (weshalb es manchmal immer noch AMD64 genannt wird). Und nein, Sie können die 64-Bit-Operandengröße im 32-Bit-Modus überhaupt nicht verwenden. REX-Präfixe verwenden die Ein-Byte- inc/ decRegister-Opcodes ( 0x40 .. 0x4F) neu. Im langen Modus (64-Bit-Modus) beträgt die Standardoperandengröße 32, die Standardadressgröße jedoch 64.
Peter Cordes

2
@Wildcard: IDK, wenn der Kernel- / Langmodus-Benutzerbereich im Kompatibilitätsmodus überhaupt eine Entwurfsüberlegung war. Um den Status des Integer-Registers für Kontextwechsel zu speichern, muss sich Solaris (und OS X) noch im Langmodus befinden, um auf r8-r15 und die oberen Hälften von rax-rsi zugreifen zu können. IDK if xsave/ xrstorim kompatiblen Modus kann auch den vollständigen Vektorstatus speichern. Es wird also sicherlich nicht gut unterstützt oder explizit berücksichtigt. Wahrscheinlich werden die Kernel-Einstiegspunkte im 64-Bit-Modus (lang) ausgeführt und wechseln in den 32-Bit-Modus (kompatibel), bevor Sie zum Rest des Kernels wechseln. (x86-Modusschalter nimmt nur ein far jmpund hat keinen Einfluss auf die Registrierung.)
Peter Cordes

5

Auf einigen Architekturen ja. Aber nicht auf ARM oder x86.

Sie könnten QEMU verwenden, um ein 64-Bit-System zu emulieren, möchten dies aber nicht.


Wäre es eine Katastrophe, einen Emulator wie QEMU zum Installieren und Ausführen einer Mongo-Datenbank zu verwenden?
Crellee

Es wäre sehr, sehr langsam. Und es lohnt sich nicht, da das RPi3 nur 1 GB RAM hat. Erstellen Sie stattdessen ein 32-Bit-Paket.
Ignacio Vazquez-Abrams

2
Sie können ein 64-Bit-Programm auf einem 32-Bit-Kernel auf x86 ausführen, wenn der Kernel dies unterstützt. Linux nicht, Solaris jedoch. Am Arm ist das nicht möglich.
Gilles 'SO - hör auf böse zu sein'

@ IgnacioVazquez-Abrams Versuchen Sie dies. Es ist langsam, aber nicht katastrophal. Der Hauptgrund ist, dass qemu die CPU-Emulation nur im Benutzerbereich durchführt und die Kernel-Aufrufe (dh die Wartezeiten) gleich bleiben. Auf Heimsystemen verwende ich für einige Tools gerne Arm- oder Mips-Binärdateien, nur zum Spaß :-) Oder manchmal, wenn keine sehr große CPU-Last vorhanden ist, können einige sicherheitskritische, aber nicht CPU-intensive Tools einige verwenden exotische Architektur, um die Wahrscheinlichkeit von Pufferüberlaufangriffen zu verringern.
Peterh - Wiedereinsetzung Monica

4

Aktualisieren Sie nur Ihren Kernel auf einen 64-Bit-Kernel, damit Sie 64-Bit-Binärdateien ausführen können. Im Wesentlichen wird Ihre gesamte Distribution im 32-Bit-Kompatibilitätsmodus ausgeführt, und Ihr einziger 64-Bit-Mongodb ist der normale Modus.

Aber es hat seinen Preis nicht verdient. Schalten Sie Ihren Mongodb besser auf 32 Bit um. In diesem Fall gibt es jedoch eine Einschränkung, dass Ihre Datenbank nicht größer als 2 GB sein kann, da sie das gesamte Objekt direkt im virtuellen Speicher abbildet. Wenn Ihre Datenbank größer ist, bleibt nur das Kernel-Upgrade übrig. (Danke @duskwuff die Erweiterung!)

Übrigens, wenn Ihre Datenbank keine sehr große Last will oder Sie vorher eine Caching-Lösung verwenden können (zum Beispiel: eine andere, aber 32-Bit-Mongo), könnte eine CPU-Emulation funktionieren. Starten Sie dazu ein Googeln nach "qemu qemu-system-x86_64". Obwohl eine solche Lösung wahrscheinlich einen nicht realisierbaren Arbeitsbedarf hätte und in einer produktiven Umgebung als seltsam angesehen werden könnte.

An Ihrer Stelle würde ich 32-Bit-Mongo verwenden, wenn es für meine Datenbank ausreicht, oder einen 64-Bit-Kernel, wenn dies nicht der Fall ist.


Sinnvoll, aber wie würden Sie Ihren Mongodb auf 32bit umstellen?
Crellee

@crellee apt-get install mongodb:i386oder ähnliches?
Peterh

das wird einen Fehler 'Paket mongodb: i386 kann nicht gefunden werden' zurückgeben
crellee

1
Das Ausführen einer 32-Bit-MongoDB ist eine schlechte Idee. Die Datenbank ist speicherabgebildet. Wenn Sie sie also auf einem 32-Bit-System ausführen, sind Sie auf <2 GB Daten beschränkt.
Abenddämmerung -inaktiv-

Ja, und Sie sind auf die Version 2.4.14 beschränkt, die viele Einschränkungen aufweist.
Crellee

3

Ich würde sagen, es ist nicht unmöglich, aber wirklich schwer zu handhaben. Da ein so 32-Bit-Betriebssystem normalerweise nur mit 32-Bit-Binärdateien und -Bibliotheken gepackt ist (und diese akzeptiert), müssen Sie das System stark optimieren, damit es mit 64-Bit-Binärdateien funktioniert.

Das Hauptproblem bei einem RPI3 ist das Fehlen eines 64-Bit-Kernels (zumindest bei Raspbian).

Lange Rede, kurzer Sinn: Verwenden Sie 32-Bit-Binärdateien, und alles wird gut.

EDIT:

Wenn Sie einen 64-Bit-Kernel verwenden möchten, müssen Sie eine Distribution installieren, die die ARM64-Architektur unterstützt. Sie sollten sich ArchLinux ARM ( hier ) ansehen , es wird jedoch nicht vollständig unterstützt.

Die Informationen, nach denen Sie suchen, befinden sich unten auf der Registerkarte Installation.

Sie können sich auch einen offiziellen Debian-Port ansehen , es gibt jedoch immer noch große Probleme mit dem RPI3-Port. Es liegt also an Ihnen, zu entscheiden, ob sich die Mühe lohnt


Das Problem ist, dass die CPU (vom Kernel) im 32-Bit-Modus gestartet wird, sodass sie wie eine alte 32-Bit-Maschine aussieht. 64-Bit-Register und Anweisungen sind nicht verfügbar.
Johan Myréen

1
Richtig, deshalb brauchst du einen 64-Bit-Kernel (den Thomas erwähnt hat).
Stephen Kitt

Danke für die nette Erklärung. Die Lösung für mich wäre also, ein anderes Betriebssystem auf meinem RPI3 zu installieren?
Crellee

Ich habe gerade meine Antwort aktualisiert.

@Thomas, einige Distributionen unterstützen den kombinierten 32- / 64-Bit-Betrieb, beginnend mit der 32-Bit-Variante. Debian ist zumindest unter x86 ein Beispiel: Sie können die i386Variante installieren. Dazu gehört ein 64-Bit-Kernel, mit dem auch 64-Bit-Bibliotheken und Binärdateien installiert werden können. Die ARM-Unterstützung in Debian erlaubt dies jedoch nicht auf ARM-Systemen (Sie können es jedoch kombiniert installieren arm64und armhf, wenn Sie damit beginnen arm64).
Stephen Kitt

1

Ich habe eine ganze Weile einen 64-Bit-Kernel mit einem 32-Bit-System verwendet (dies ist die Mindestvoraussetzung für die native Ausführung von 64-Bit-ausführbaren Dateien sowie aller erforderlichen 64-Bit-Bibliotheken). Ich würde es nicht empfehlen. Was mich schließlich dazu brachte, ein Upgrade auf ein 64-Bit-System im Großhandel durchzuführen, war die Erkenntnis, dass ALSA-Header, insbesondere in Bezug auf Midi-Ioctl-Aufrufe, nicht größenunabhängig waren, was bedeutet, dass im 32-Bit-Modus kompilierte Inhalte nicht gut mit dem 64-Bit-Kernel zusammenarbeiten würden.

Natürlich kann dies als ein Fehler angesehen werden, der es wert ist, behoben zu werden, aber das Tempo der ALSA-Entwicklung ist so gut wie eingefroren, und ich konnte nicht ein paar Jahre warten, bis die Unterstützung für gemischte Plattformen behoben ist (und auf eine nicht binär kompatible Weise für nicht gemischte ausführbare Dateien), wenn das Interesse an gemischten Plattformen ohnehin schnell schwindet.

Für einige Anwendungen funktioniert das Zeug im gemischten Modus (überraschend viel), aber wenn Sie mehr als den grundlegenden Anteil der Schnittstelle zum Kernel tun, selbst über externe Bibliotheken, ist dies einfach zu optimistisch.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.