Wie kann man feststellen, ob ein bestimmtes Linux 32-Bit oder 64-Bit ist?

470

Wenn ich tippe uname -a, gibt es die folgende Ausgabe.

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux

Wie kann ich daraus erkennen, dass das angegebene Betriebssystem 32 oder 64 Bit ist?

Dies ist nützlich, wenn Sie configureSkripte schreiben , zum Beispiel: Für welche Architektur baue ich?

Swapnonil
quelle

Antworten:

735

Versuchen Sie es uname -m. Welches ist kurz uname --machineund es gibt aus:

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

Andernfalls geben Sie nicht für den Linux-Kernel, sondern für die CPU Folgendes ein:

cat /proc/cpuinfo

oder:

grep flags /proc/cpuinfo

Unter dem Parameter "flags" sehen Sie verschiedene Werte: siehe " Was bedeuten die Flags in / proc / cpuinfo? ". Einer davon heißt lm: Long Mode( x86-64 : amd64, auch bekannt als Intel 64, dh 64-Bit fähig)

lm ==> 64-bit processor

Oder verwenden Sielshw (wie unten von Rolf von Sachsen erwähnt ), ohne sudo(nur um die CPU-Breite zu erfassen):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'

Hinweis: Sie können eine 64-Bit-CPU mit einem 32-Bit-Kernel installieren .
(Wie ysdx in seiner eigenen Antwort erwähnt : "Heutzutage kann ein System ein Multiarch sein, daher macht es sowieso keinen Sinn. Vielleicht möchten Sie das Standardziel des Compilers finden.")

VonC
quelle
3
grep flags / proc / cpuinfo sagt Ihnen nur, ob die CPU 64bit ist. Soweit ich die Frage verstehe, ging es um das Betriebssystem. uname -m sagt mir nur "i686".
Kim Stebel
3
Ich habe einen 32-Bit-Kernel auf 64-Bit-Hardware und bekomme "x86_64" von 'uname -m' (auf Debian). Die Manpage für uname besagt, dass -m den Namen der Maschinenhardware anzeigt, sodass dies korrekt erscheint.
Tony Meyer
1
Wenn ich einen 32-Bit - Kernel auf einem 64-Bit - Rechner / Prozessor ausgeführt wird , was würde uname -i, uname -pund uname -mzeigt?
Ruben2020
4
Was ist, wenn tm und lm beide vorhanden sind?
Javier Novoa C.
4
@ JavierNovoaC. tm (Thermal Monitor) zeigt die automatische Uhrzeitsteuerung an. Es hat nichts mit der Unterscheidung eines 32-Bit-Prozessors zu tun. Tatsächlich ist lm (langer Modus) genau dann vorhanden, wenn Sie eine 64-Bit-CPU haben. Deshalb sollten Sie sich nur auf lm verlassen. Ansonsten ist die Antwort von Thomas Watnedal die beste. Diese Antwort ist einfach falsch und hat viele Leute irregeführt. PLZ-Moderatoren tun etwas dagegen.
Issam T.
153

Wenn Sie eine 64-Bit-Plattform ausführen, wird in der Ausgabe von uname -a x86_64 oder etwas sehr Ähnliches angezeigt

Um Ihren spezifischen Maschinenhardwarennamen auszuführen

uname -m

Sie können auch anrufen

getconf LONG_BIT

was entweder 32 oder 64 zurückgibt

Thomas Watnedal
quelle
4
uname -mAusgänge x86_64 getconf LONG_BITAusgänge 32Welches ist richtig? : \
Stephan
10
Das heißt, die CPU ist 64-Bit, aber Sie haben nur ein 32-Bit-Betriebssystem darauf installiert, obwohl Sie ein 64-Bit-Betriebssystem hätten verwenden können.
1
Steve Kemp hat recht, seien Sie also vorsichtig (Mac OS X 10.5 unter MacBooks 2009 fällt mir ein, wo das Betriebssystem 32-Bit ist, aber 64-Bit-Apps
ausführen kann
1
Das uname -mist nicht sinnvoll , für die QP ist , configurewie es das falsche Ergebnis geben kann. Sie getconf LONG_BITerhalten die Standardbitgröße der C-Bibliothek, die möglicherweise nicht die richtige Größe für einen angegebenen CCCompiler hat.
user3710044
2
getconf LONG_BITkann 32 ig bereitstellen, es wurde als 32-Bit-Anwendung erstellt (normalerweise 64-Bit-Kernel, auf dem ein 32-Bit-Benutzerland ausgeführt wird).
ysdx
42

lscpu listet diese unter anderem Informationen zu Ihrer CPU auf:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
Asharma
quelle
3
Gibt die physischen Fähigkeiten der CPU aus, die für den aktuellen Benutzerbereich des aktuellen Betriebssystems nützlich, aber nicht zuverlässig sind.
user3710044
33

Ein weiterer nützlicher Befehl zur einfachen Bestimmung lautet wie folgt:

Befehl:

getconf LONG_BIT

Antworten:

  • 32, wenn das Betriebssystem 32 Bit ist
  • 64, wenn das Betriebssystem 64 Bit ist
Benutzer3207041
quelle
2
Nicht wahr im Fall von HP-UX 11.31i auf Itanium 64: Dieser Befehl gibt 32 zurück.
Gabriel Hautclocq
Ich denke, alles hängt davon ab, was der Fragesteller mit "64-Bit" meint - früher bedeutete es die natürliche Größe von ganzen Zahlen, aber jetzt wird es oft verwendet, um stattdessen die Adressierungsgröße zu bezeichnen.
Toby Speight
12

Der Befehl

$ arch    

ist äquivalent zu

$ uname -m

ist aber doppelt so schnell zu tippen

Greg von Winckel
quelle
2
Einverstanden, aber ich bin sicher, dass die Schreibgeschwindigkeit für die meisten Entwickler kein Problem darstellt.
Williamcarswell
2
Dies gibt die Prozesstypen zurück, die der Kernel unterstützen kann. Es ist möglich und sogar sinnvoll, einen 32-Bit-Benutzerbereich auf einem 64-Bit-Kernel auszuführen.
user3710044
1
Der Befehl arch ist nicht auf jedem Unix-System verfügbar, während uname sein sollte.
Gabriel Hautclocq
11

Ich habe mich darüber speziell für das Erstellen von Software in Debian gewundert (das installierte Debian-System kann eine 32-Bit-Version mit einem 32-Bit-Kernel, Bibliotheken usw. sein, oder es kann eine 64-Bit-Version mit für das 64- kompilierten Dingen sein. Bit statt 32-Bit-Kompatibilitätsmodus).

Debian-Pakete selbst müssen (natürlich) wissen, für welche Architektur sie sind, wenn sie das Paket mit all seinen Metadaten, einschließlich der Plattformarchitektur, tatsächlich erstellen. Daher gibt es ein Verpackungstool, das es für andere zu verwendende Verpackungstools und Skripte ausgibt dpkg-architektur . Es enthält sowohl das, wofür es erstellt wurde, als auch den aktuellen Host. (Normalerweise sind diese jedoch gleich.) Beispielausgabe auf einem 64-Bit-Computer:

DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_OS=linux
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu

Sie können nur eine dieser Variablen drucken oder einen Test mit ihren Werten mit Befehlszeilenoptionen für dpkg -architecture durchführen.

Ich habe keine Ahnung, wie die dpkg-Architektur die Architektur herleitet, aber Sie können sich die Dokumentation oder den Quellcode ansehen (die dpkg-Architektur und ein Großteil des dpkg-Systems im Allgemeinen sind Perl).

Reed Hedges
quelle
Sie können einfach Folgendes verwenden dpkg --architecture, um die Hostsystemarchitektur abzurufen, für die das dpkg-devPaket nicht installiert werden muss.
Mark Longair
Dies ergibt dpkg: error: unknown option --architecturefür dpkg 1.17.5ubuntu vom 14.04. Die dpkg-Architektur (mit installiertem dpkg-dev) funktioniert jedoch einwandfrei.
Timurb
2
Der Befehl dpkg --print-architecturehat seit Ewigkeiten an Debian gearbeitet. Dieser funktioniert, ist aber auf Debian und seine Derivate beschränkt.
user3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
schottisch
quelle
2
Funktioniert, scheint aber ein Implementierungsdetail von stdio.h unter Linux zu sein. Es gibt bessere Lösungen, z. B.: Limits.h, NICHT VERWENDEN.
user3710044
10

Wenn Sie ein 64-Bit-Betriebssystem anstelle von i686 haben, haben Sie x86_64oder ia64in der Ausgabe von uname -a. Insofern haben Sie keine dieser beiden Zeichenfolgen; Sie haben ein 32-Bit-Betriebssystem (beachten Sie, dass dies nicht bedeutet, dass Ihre CPU nicht 64-Bit ist).

Denis R.
quelle
1
Dies gibt die Prozesstypen zurück, die der Kernel unterstützen kann. Es ist möglich und sogar sinnvoll, einen 32-Bit-Benutzerbereich auf einem 64-Bit-Kernel auszuführen.
user3710044
Es gibt andere Werte in der unameAusgabe, die auf ein 64-Bit-Betriebssystem hinweisen. Nicht die ganze Welt ist ein x86 oder Itanium ...
Toby Speight
6

Dieses System ist 32bit. iX86 in unamebedeutet, dass es sich um eine 32-Bit-Architektur handelt. Wenn es 64 Bit wäre, würde es zurückkehren

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 x86_64 i686 x86_64 x86_64 GNU/Linux
Louis Gerbarg
quelle
1
Dies gibt die Prozesstypen zurück, die der Kernel unterstützen kann. Es ist möglich und sogar sinnvoll, einen 32-Bit-Benutzerbereich auf einem 64-Bit-Kernel auszuführen.
user3710044
6

Heutzutage kann ein System ein Multiarch sein, daher macht es sowieso keinen Sinn. Möglicherweise möchten Sie das Standardziel des Compilers finden:

$ cc -v 2> & 1 | grep ^ Ziel
Ziel: x86_64-pc-linux-gn

Sie können versuchen, eine Hallo-Welt zusammenzustellen:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ file foo
foo: ELF 64-Bit-LSB-ausführbare Datei, x86-64, Version 1 (SYSV), dynamisch verknüpft, Interpreter /lib64/ld-linux-x86-64.so.2, für GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, nicht entfernt
ysdx
quelle
1
Da cc -v | grep …es sowieso compilerspezifisch ist, kann man nur verwenden cc -dumpmachine, was kein Grepping erfordert und nicht nur von GCC unterstützt wird.
Anton Samsonov
Da die Frage darauf hindeutet, dass es sich um ein Konfigurationsskript handelt, ist dies hier wahrscheinlich die nützlichste und relevanteste Antwort. Es wird in allen wichtigen Fällen das tun, was Sie wollen (einschließlich eines 32-Bit-Benutzer-Chroots auf einem 64-Bit-Betriebssystem, Cross-Compilieren für eine fremde Architektur und den Rest).
Toby Speight
5

In Bezug auf die Antwort "getconf LONG_BIT" .

Ich habe eine einfache Funktion dazu in 'C' geschrieben:

/*
 * check_os_64bit
 *
 * Returns integer:
 *   1 = it is a 64-bit OS
 *   0 = it is NOT a 64-bit OS (probably 32-bit)
 *   < 0 = failure
 *     -1 = popen failed
 *     -2 = fgets failed
 *
 * **WARNING**
 * Be CAREFUL! Just testing for a boolean return may not cut it
 * with this (trivial) implementation! (Think of when it fails,
 * returning -ve; this could be seen as non-zero & therefore true!)
 * Suggestions?
 */
static int check_os_64bit(void)
{
    FILE *fp=NULL;
    char cb64[3];

    fp = popen ("getconf LONG_BIT", "r");
    if (!fp)
       return -1;

    if (!fgets(cb64, 3, fp))
        return -2;

    if (!strncmp (cb64, "64", 3)) {
        return 1;
    }
    else {
        return 0;
    }
}

Gute Idee, die 'getconf'!

Kaiwan
quelle
5
Dumme Idee! Verwenden Sie CHAR_BIT*sizeof(void*)oder __WORDSIZEin C.
ceving
3
Nein, es ist nicht albern. Möglicherweise verfügen Sie über eine ausführbare 32-Bit-Datei und möchten herausfinden, ob das System beispielsweise eine 64-Bit-Datei unterstützt.
Ludvig A. Norin
Ruft die Standardlänge eines Longs in der GNU-C-Bibliothek ab. Dieser funktioniert!
user3710044
1
Es ist in der Tat falsch, denn wenn Sie einen 32-Bit-Benutzerbereich auf einem 64-Bit-Kernel oder sogar einen X32-Benutzerbereich ausführen, wird das Betriebssystem 32-Bit sein.
Ruslan
Es wird dringend empfohlen, nicht zu verwenden fgets: stackoverflow.com/questions/16323185/…
ceving
4

Sie können dies auch mithilfe einer Umgebungsvariablen überprüfen:

echo $HOSTTYPE

Ergebnis:

i386 -> 32 Bit

x86_64 -> 64 Bit

Auszug aus: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

LinuxMaintwo
quelle
1
Dies ist eine integrierte Variable, da /bin/bashes sich nicht um eine Umgebungsvariable handelt. Wenn Sie bereits von Bash abhängig sind, funktioniert dies einwandfrei. Jedoch kann das Ergebnis sein i386, i486, i586, i686und andere , so vorsichtig sein.
user3710044
3

Verwenden Sie in Bash einen Ganzzahlüberlauf:

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

Es ist viel effizienter als das Aufrufen eines anderen Prozesses oder das Öffnen von Dateien.

Luchostein
quelle
2
Bash wird (kann?) Kompiliert, um 64-Bit-Ints zu verwenden, wenn dieser Typ verfügbar ist. Dies ist heutzutage normalerweise der
Fall,
2
bash in Debian wurde kompiliert, um spätestens seit 2008 64-Bit-Arithmetik zu verwenden, wahrscheinlich früher. Diese Antwort wurde gebrochen, bevor es einen Stapelüberlauf gab.
Peter Cordes
3

getconf verwendet die wenigsten Systemaufrufe:

$ strace getconf LONG_BIT | wc -l
253

$ strace arch | wc -l
280

$ strace uname -m | wc -l
281

$ strace grep -q lm /proc/cpuinfo | wc -l
301
user5859111
quelle
2

Wenn Sie 1 um 32 nach links verschieben und 1 erhalten, ist Ihr System 32-Bit. Wenn Sie 1 um 64 nach links verschieben und 1 erhalten, ist Ihr System 64-Bit.

Mit anderen Worten,

if echo $((1<<32)) gives 1 then your system is 32 bit.

if echo $((1<<64)) gives 1 then your system is 64 bit.

Sandeep Giri
quelle
Gleiches Problem mit Bash mit "Long Longs".
user3710044
Dies hat bei mir funktioniert, denn wenn es 32 Bit zurückgibt, wird die Ausführung von 32 zu 100% bestätigt. Wenn es 64 zurückgibt, wurde Bash möglicherweise mit langen Longs kompiliert.
JCM
1

Wenn die verfügbaren Binärdateien (z. B. in initramfs) stark eingeschränkt sind, schlugen meine Kollegen vor:

$ ls -l /lib*/ld-linux*.so.2

Auf meinen ALT Linux-Systemen hat i586 /lib/ld-linux.so.2und x86_64 /lib64/ld-linux-x86-64.so.2.

Michael Shigorin
quelle
Ich habe drei davon, eine für 32, eine für 64 und eine für mx32.
user3710044
Ja, wenn nicht Tonnen von 64-Bit-Bibliotheken zurückgegeben werden, läuft das 32-Bit-Betriebssystem: ls -aR | grep 64 | grep -v proc
JCM
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
Alex
quelle
Ich habe zwei Zeilen, eine mit einer ohne.
user3710044
1

Ich kann nicht glauben, dass in all dieser Zeit niemand erwähnt hat:

sudo lshw -class cpu

um Details über die Geschwindigkeit, Menge, Größe und Fähigkeiten der CPU-Hardware zu erhalten.

Rolf von Sachsen
quelle
1

Einfaches Skript, um 64-Bit oder 32-Bit zu erhalten

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi
Lakshmikandan
quelle
1

[ -z `uname -m | grep 64` ] && echo "32-bit" || echo "64-bit"

Basierend auf der Tatsache, dass 64-Bit normalerweise x86_64und 32-Bit ist i686usw.

79man
quelle
-6

Zuerst müssen Sie Virtual Box herunterladen. Wählen Sie dann neues und ein 32-Bit-Linux. Dann booten Sie das Linux damit. Wenn es bootet, ist es 32 Bit, wenn es nicht bootet, ist es ein 64 Bit.

Vikram Thaman
quelle
2
Dies ist eine sehr weit hergeholte Methode, um festzustellen, ob das System 32- oder 64-Bit ist.
Marlar
Aber es ist wirklich ein Weg, um dieses Problem zu lösen. Also werde ich es markieren.
Firo
Dies erinnert mich an eine Möglichkeit, gerade Zahlen von ungeraden zu unterscheiden: Eine Mathematik würde den Rest betrachten, nachdem sie durch zwei geteilt wurde; ein Programmierer würde das niedrigstwertige Bit betrachten; Ein MS SQL-Spezialist würde zwei Tabellen erstellen, eine für gerade Zahlen und eine für ungerade, und schauen, wo die Eingabe endet ... Zahlen
Michael Shigorin