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
Antworten:
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.
quelle
inc
/dec
Register-Opcodes (0x40 .. 0x4F
) neu. Im langen Modus (64-Bit-Modus) beträgt die Standardoperandengröße 32, die Standardadressgröße jedoch 64.xsave
/xrstor
im 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 einfar jmp
und hat keinen Einfluss auf die Registrierung.)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.
quelle
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.
quelle
apt-get install mongodb:i386
oder ähnliches?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
quelle
i386
Variante 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 installierenarm64
undarmhf
, wenn Sie damit beginnenarm64
).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.
quelle