Wie bestimme ich die Linux-Kernel-Architektur?


92

uname -mGibt i686 und uname -mi686 i386-Ausgabe in Red Hat Enterprise Linux Server Version 5.4 (Tikanga). Ich muss Oracle Database 10g Release 2 auf diesem Computer installieren. Wie kann ich entscheiden, ob die Kernel-Architektur 32-Bit oder 64-Bit ist?


10
Ist das ein Tippfehler im ersten Satz: uname -mund uname -m?
Tshepang

Siehe auch Linux-Befehl zur Rückgabe der Bitanzahl (32 oder 64)? . Wenn uname -mi? 86 zeigt, haben Sie ein 32-Bit-System.
Gilles


Die Frage Gilles Links zu gibt eine interessante Lösung: getconf WORD_BIT.
Mikel

7
getconf WORD_BITgibt 32 auf meinem 64-Bit-Ubuntu zurück
minaev

Antworten:


90

i386 und i686 sind beide 32-Bit.
x86_64 ist 64-Bit

Beispiel für 64 Bit:

behrooz@behrooz:~$ uname -a  
Linux behrooz 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 **x86_64** GNU/Linux

EDIT:
Siehe mein Linux ARM 32 oder 64 Bit? für ARM


Was ist mit armv7l? In jedem Fall wäre ein Befehl mit einer einfachen booleschen Antwort lecker.
User7543

1
@ user7543 Es ist ARM 32-Bit, da wir noch kein 64-Bit-ARM haben. Wenn wir das tun, wird es etwas anderes sein.
Behrooz

Ich habe das Gefühl, ich sollte mein Antwort-Community-Wiki erstellen, weiß aber nicht wie.
Behrooz

1
Versuchen: uname -m. Das zeigt nur die Architektur.
Alexej Magura


32

@behrooz ist richtig. Leider unamemüssen Sie Architekturen kennen. Eigentlich suchte ich nach einer Liste von Architekturen und fand diesen Artikel , der Ihre Frage beantwortet. In Bezug auf uname -m:

x86_64 GNU / Linux zeigt an, dass ein 64-Bit-Linux-Kernel ausgeführt wird. Wenn Sie i386 / i486 / i586 / i686 verwenden, handelt es sich um einen 32-Bit-Kernel.

Feststellen, ob auf der Hardware ein 64-Bit-Kernel ausgeführt werden kann

grep flags /proc/cpuinfo

Achten Sie in der Ausgabe auf Folgendes (alle Flags, die von dieser Stackoverflow-Antwort für dieselbe Frage abgerufen wurden )

  • lm Flag bedeutet Langmodus-CPU - 64-Bit-CPU
  • tm Flag bedeutet Geschützter Modus - 32-Bit-CPU
  • rm Flag bedeutet Real Mode - 16 Bit CPU

Bedeutet das lm-Flag einfach, dass die CPU 64-Bit unterstützt, oder bedeutet es, dass sie in 64-Bit ausgeführt wird? Ich empfehle, mich auf den Arch zu verlassen und zu wissen, dass er x86_64 für 64-Bit oder i? 86 für 32-Bit sein wird.
Pinguin359

1
@ Penguin359 bedeutet, dass die CPU 64-Bit unterstützt.
Xenoterracide

@xeno kann also nicht verwendet werden, um die Kernelarchitektur zu bestimmen.
Pinguin359

@ penguin359 nein, war das in der antwort unklar?
Xenoterracide

1
@ penguin359, nein, aber es ist oft nützlich herauszufinden, ob Ihr Betriebssystem 64-Bit
ausführt

22

(BEARBEITEN: Diese Antwort ist FALSCH. Dank @ Lizardx Kommentar)

In Bash mit Integer-Überlauf:

if ((1<<32)); then
  echo 64bits
else
  echo 32bits
fi

Es ist viel effizienter, als einen anderen Prozess aufzurufen oder Dateien zu öffnen.


3
so clever und erinnert uns auch daran, worum es bei der Chip-Architektur geht
code_monk

2
Obwohl elegant, ist dies leider nicht korrekt: uname -m == i686 ABER wenn ((1 << 32)); then echo 64bits; fi == 64bits Dies ist ein PAE-Kernel, 32-Bit, kein 64-Bit-Kernel. Die CPU ist jedoch 64-Bit-fähig, amd64. Da die Frage lautete, wie der Kernel-Arch ermittelt werden soll, würde diese Lösung zu falschen Ergebnissen führen.
Lizardx

1
note ((ist ein Bashismus und nicht von POSIX definiert. mywiki.wooledge.org/Bashism#Conditionals
Steven Penny

Ich habe dies auf einigen 32-Bit-Architekturen versucht und dies hält es für 64-Bit.
Dannyw

Das kann funktionieren((1<<32)-1)
Ivijan Stefan Stipić

15

Für Debian :

Auf meinem PC

    ~> dpkg --print-Architektur
    amd64
    ~> dpkg --print-foreign-architecture
    i386

Mein Himbeer Pi 2

    ~> dpkg --print-Architektur
    armhf

1
Dies funktioniert am besten, wenn Sie die Paketarchitektur bestimmen, die mit checkinstall, thx!
Aquarius Power

Danke. Ich habe nach etwas gesucht, das die "Standard" -Architekturnamen "amd64" / "i386" und nicht nur "x86_64" fallen lässt. Niemand verwendet diese Terminologie, wenn er vorkompilierte Releases benennt.
Cliff

12

Der einfachste Weg ist zu laufen:

getconf LONG_BIT

Dies gibt 64 oder 32 aus, je nachdem, ob es sich um 32 oder 64 Bit handelt.

z.B:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Diese Antwort ist irreführend. Wenn Sie die Multiarch-Unterstützung aktivieren und den 64-Bit-Kernel installieren, getconf LONG_BITwird die 32-Bit-Installation gedruckt, 32obwohl Sie den 64-Bit-Kernel ausführen .
Kenn

2

Verwenden Sie syscap aus dem Formake-Projekt

Mit syscap können viele Systemeigenschaften überprüft und Abhängigkeiten getestet werden. Es ist ein portables Shell-Skript.

Holen Sie sich die CPU-Architektur:

syscap info -arch

Kernelnamen und -version abrufen:

syscap info -kernel -kernver

1

Eine andere Möglichkeit besteht darin, die Architektur zu überprüfen, für die eine Systemdatei kompiliert wurde, z

$ file /usr/bin/ld
/usr/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

1
Das ist die Systemarchitektur, die nicht immer die Kernelarchitektur ist. Weitere Variationen finden Sie in dieser Antwort bei SU .
Gilles

Theoretisch mögen sie sich unterscheiden, aber besteht die Möglichkeit, dass sie bei einer realen Installation nicht übereinstimmen?
minaev

Einige Distributionen enthalten einen amd64-Kernel für die x86-Version. Ich weiß nicht, wie viele Leute sie benutzen, ich habe Debian Popcon überprüft, aber es korreliert nicht zwischen den verschiedenen Statistiken. Ich denke, der Hauptanwendungsfall ist ein 32-Bit-Hauptbetriebssystem und das Ausführen eines 64-Bit-Betriebssystems in einer Chroot oder einer VM.
Gilles

@ Gilles Du wirst es lieben, was du über die neue x32-Architektur liest. Wenn ich nicht zu spät bin, natürlich. wiki.debian.org/X32Port
Behrooz

0

Oder Sie können die Methode verwenden, die der Befehl uname intern ausführt, wenn Sie einige Dinge selbst implementieren möchten:

#include <sys/utsname.h>
#include <stdio.h>

int main() {
    struct utsname name;
    uname(&name);
    printf("%s\n",name.machine);
    return 0;
}

0

Hier ist eine andere Methode mit uname.

Von man uname:

... -i, --hardware-platform print the hardware platform or "unknown" ...

# uname -i x86_64 #


Bis es "unbekannt" gibt
Dagelf

0

Wenn Sie nach einem einfachen Einzeiler suchen, ist dies die zuverlässigste Lösung, die ich gefunden habe und die 64 oder 32 zurückgibt . Es ist egal, ob Sie ARM ausführen oder nicht, und es sollte auf jedem System funktionieren, das bash oder sh verwendet .

Beachten Sie, dass dies voraussetzt, dass das System entweder 32-Bit oder 64-Bit ist. Siehe meine Erklärung unten, wenn Sie 8-16-Bit-Architektur oder eine andere Bit-Architektur erkennen müssen.

[$ ((0xffffffff)) -eq -1] && echo 32 || echo 64

Was ist hier los?
Die Logik ist sehr einfach und alles läuft darauf hinaus, wie Computer signierte Ganzzahlen speichern. Eine 32-Bit-Architektur hat nur 32 Bit, die zum Speichern von Ganzzahlen mit Vorzeichen verwendet werden können, während eine 64-Bit-Architektur 64 Bit hat! Mit anderen Worten, die Menge der Ganzzahlen, die gespeichert werden können, ist endlich. Die Hälfte dieses Satzes steht für negative Zahlen und die Hälfte für positive Zahlen. Die Ganzzahl mit Vorzeichen gleich -1 wird als die größte Zahl dargestellt, die in einer bestimmten Anzahl von Bits für diese Architektur gespeichert werden kann. Auf einem 32-Bit-System kann -1 durch den Hexadezimalwert 0xFFFFFFFF dargestellt werden (der 32 Binärbits entspricht, wobei alle 1 entsprechen). Auf einem 64-Bit-System wird 0xFFFFFFFF in 4.294.967.295 (Basis 10) übersetzt, während 0xFFFFFFFFFFFFFF die Darstellung für -1 ist. Sie können sehen, wie dies leicht für Systeme mit 8 oder 16 Bit skaliert werden kann, die bei 0xFF und 0xFFFF gleich -1 sind.

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.