Come determinare se un dato Linux è a 32 bit o 64 bit?


470

Quando scrivo uname -a, dà il seguente output.

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

Come posso sapere da ciò che il sistema operativo in questione è a 32 o 64 bit?

Ciò è utile quando si scrivono configurescript, ad esempio: per quale architettura sto costruendo?

Risposte:


735

Prova uname -m. Che è a corto di uname --machinee produce:

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

Altrimenti, non per il kernel Linux, ma per la CPU , si digita:

cat /proc/cpuinfo

o:

grep flags /proc/cpuinfo

Nel parametro "flags", vedrai vari valori: vedi " Cosa significano i flag in / proc / cpuinfo? " Tra questi, uno è chiamato lm: Long Mode( x86-64 : amd64, noto anche come Intel 64, ovvero 64-bit capace)

lm ==> 64-bit processor

O usandolshw (come menzionato di seguito da Rolf di Sassonia ), senza sudo(solo per aggirare la larghezza della cpu):

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

Nota: è possibile avere una CPU a 64 bit con un kernel a 32 bit installato .
(come ysdx menziona nella sua risposta , "Al giorno d'oggi, un sistema può essere multiarch, quindi non ha comunque senso. Potresti voler trovare l'obiettivo predefinito del compilatore")


3
grep flags / proc / cpuinfo ti dice solo se la CPU è a 64 bit. Come capisco la domanda riguardava il sistema operativo. uname -m mi dice solo "i686".
Kim Stebel,

3
Ho un kernel a 32 bit su hardware a 64 bit e ottengo "x86_64" da 'uname -m' (su Debian). La pagina man di uname dice che -m mostra il nome dell'hardware della macchina, quindi sembra corretto.
Tony Meyer,

1
Se ho un kernel a 32 bit in esecuzione su un 64-bit macchina / processore, quale sarebbe uname -i, uname -pe uname -mspettacolo?
ruben2020,

4
e se tm e lm sono entrambi presenti?
Javier Novoa C.

4
@JavierNovoaC. tm (Thermal Monitor) indica il controllo automatico dell'orologio. Non ha nulla a che fare con la distinzione di un processore a 32 bit. Infatti, lm (modalità lunga) è presente se e solo se si dispone di una CPU a 64 bit. Ecco perché dovresti fare affidamento solo su lm. altrimenti la risposta data da Thomas Watnedal è la migliore. Questa risposta è sbagliata e ha indotto in errore molte persone perché i moderatori fanno qualcosa al riguardo.
Issam T.

153

Se avessi in esecuzione una piattaforma a 64 bit, vedresti x86_64 o qualcosa di molto simile nell'output di uname -a

Per eseguire il nome dell'hardware specifico della macchina

uname -m

Puoi anche chiamare

getconf LONG_BIT

che restituisce 32 o 64


4
uname -muscite x86_64 getconf LONG_BITuscite 32Quale è corretto ?? : \
Stephan,

10
Ciò significa che la CPU è a 64 bit, ma su di essa è installato solo un sistema operativo a 32 bit, anche se avresti potuto usarne uno a 64 bit.

1
Steve Kemp ha ragione, quindi fai attenzione (mi viene in mente Mac OS X 10.5 del 2009, dove Mac OS è a 32 bit ma è in grado di eseguire app a 64 bit)
jww

1
Non uname -mè utile per i QP configurein quanto può dare risultati errati. Il getconf LONG_BITottenere la dimensione po 'di default della libreria C che non può essere la dimensione corretta per un determinato, da CC, compilatore.
user3710044

2
getconf LONG_BITpuò fornire 32 ig è stato creato come un'applicazione a 32 bit (in genere kernel a 64 bit che esegue un'area utente a 32 bit).
ysdx,

42

lscpu elencherò queste tra le altre informazioni riguardanti la tua CPU:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

3
Produce le capacità fisiche della CPU, utili, ma non affidabili per l'attuale spazio utente del sistema operativo corrente.
user3710044

33

Un altro comando utile per una facile determinazione è il seguente:

Comando:

getconf LONG_BIT

Risposta:

  • 32, se il sistema operativo è a 32 bit
  • 64, se il sistema operativo è a 64 bit

2
Non è vero nel caso di HP-UX 11.31i su Itanium 64: questo comando restituisce 32.
Gabriel Hautclocq,

Immagino che tutto dipenda da ciò che l'interrogante intende per "64-bit" - significava la dimensione naturale degli interi, ma ora viene spesso usata per indicare la dimensione di indirizzamento.
Toby Speight,

12

Il comando

$ arch    

è equivalente a

$ uname -m

ma è due volte più veloce da digitare


2
D'accordo, ma sono sicuro che la velocità di digitazione non è un problema per la maggior parte degli sviluppatori.
williamcarswell,

2
Questo restituisce i tipi di processo che il kernel può supportare. È possibile e persino ragionevole eseguire uno spazio utente a 32 bit su un kernel a 64 bit.
user3710044

1
Il comando arch non è disponibile su tutti i sistemi unix, mentre dovrebbe essere uname.
Gabriel Hautclocq,

11

Mi stavo chiedendo questo in particolare per la creazione di software in Debian (il sistema Debian installato può essere una versione a 32 bit con un kernel a 32 bit, librerie, ecc., Oppure può essere una versione a 64 bit con elementi compilati per 64- bit anziché modalità di compatibilità a 32 bit).

I pacchetti Debian stessi devono sapere per quale architettura sono (ovviamente) quando creano effettivamente il pacchetto con tutti i suoi metadati, inclusa l'architettura della piattaforma, quindi c'è uno strumento di packaging che lo genera per altri strumenti e script di packaging da usare, chiamato dpkg-architecture . Include sia ciò per cui è configurato per la compilazione, sia l'host corrente. (Normalmente sono uguali.) Esempio di output su una macchina a 64 bit:

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

Puoi stampare solo una di quelle variabili o fare un test sui loro valori con le opzioni della riga di comando per dpkg -architecture.

Non ho idea di come dpkg-architecture deduca l'architettura, ma potresti guardare la sua documentazione o il suo codice sorgente (dpkg-architecture e gran parte del sistema dpkg in generale sono Perl).


Puoi semplicemente usare: dpkg --architectureper ottenere l'architettura del sistema host, che non richiede l' dpkg-devinstallazione del pacchetto.
Mark Longair,

Questo produce dpkg: error: unknown option --architectureper dpkg 1.17.5ubuntu di 14.04. dpkg-architecture (con dpkg-dev installato) funziona bene però.
timurb

2
Il comando dpkg --print-architectureha funzionato su Debian da sempre. Questo funziona ma è limitato a Debian e ai suoi derivati.
user3710044

11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}

2
Funziona ma sembra essere un dettaglio di implementazione di stdio.h su Linux, esistono soluzioni migliori, ad esempio: limits.h, NON UTILIZZARE.
user3710044

10

Se hai un sistema operativo a 64 bit, invece di i686, hai x86_64o ia64nell'output di uname -a. Nel senso che non hai nessuna di queste due stringhe; hai un sistema operativo a 32 bit (tieni presente che ciò non significa che la tua CPU non sia a 64 bit).


1
Questo restituisce i tipi di processo che il kernel può supportare. È possibile e persino ragionevole eseguire uno spazio utente a 32 bit su un kernel a 64 bit.
user3710044

Esistono altri valori unamenell'output che indicano un sistema operativo a 64 bit. Non tutto il mondo è un x86 o Itanium ...
Toby Speight

6

Tale sistema è a 32 bit. iX86 in unamesignifica che è un'architettura a 32 bit. Se fosse a 64 bit, ritornerebbe

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

1
Questo restituisce i tipi di processo che il kernel può supportare. È possibile e persino ragionevole eseguire uno spazio utente a 32 bit su un kernel a 64 bit.
user3710044

6

Al giorno d'oggi, un sistema può essere multiarch, quindi non ha comunque senso. Potresti voler trovare la destinazione predefinita del compilatore:

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

Puoi provare a compilare un mondo ciao:

$ echo 'int main () {return 0; } '| cc -xc - -o pippo
$ file foo
foo: eseguibile LSB a 64 bit ELF, x86-64, versione 1 (SYSV), collegato dinamicamente, interprete /lib64/ld-linux-x86-64.so.2, per GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, non rimosso

1
Dato che cc -v | grep …è comunque specifico del compilatore, si può semplicemente usare cc -dumpmachine, che non richiede grepping ed è supportato non solo da GCC.
Anton Samsonov,

Dato che la domanda suggerisce che è per uno script di configurazione, questa è probabilmente la risposta più utile e pertinente qui. Farà quello che vuoi in tutti i casi che contano (incluso un chroot utente a 32 bit su un sistema operativo a 64 bit, compilazione incrociata per un'architettura straniera e il resto).
Toby Speight,

5

Rispetto alla risposta "getconf LONG_BIT" .

Ho scritto una semplice funzione per farlo in 'C':

/*
 * 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;
    }
}

Buona idea, il 'getconf'!


5
Un'idea sciocca! Usa CHAR_BIT*sizeof(void*)o __WORDSIZEin C.
ceving l'

3
No, non è sciocco. Potresti avere un eseguibile a 32 bit e vuoi capire se il sistema ne supporrebbe uno a 64 bit, per esempio.
Ludvig A. Norin,

Ottiene la lunghezza predefinita di un long nella libreria GNU-C .. questo funziona!
user3710044

1
In realtà è sbagliato, perché se stai eseguendo uno spazio utente a 32 bit sul kernel 64 bit, o anche uno spazio utente X32, dirà che il sistema operativo è a 32 bit.
Ruslan,

E 'fortemente consigliato di non usare fgets: stackoverflow.com/questions/16323185/...
ceving


3

In Bash, usando l'overflow dei numeri interi:

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

È molto più efficiente che invocare un altro processo o aprire file.


2
Bash è (può essere?) Compilato per usare ints a 64 bit se quel tipo è disponibile, di solito lo è al giorno d'oggi e quindi i sistemi a 32 bit useranno normalmente il tipo "long long"
user3710044

2
bash in Debian è stato compilato per usare l'aritmetica a 64 bit dal 2008 al più tardi, probabilmente prima. Questa risposta è stata interrotta da prima dell'esistenza dello stackoverflow.
Peter Cordes,

3

getconf utilizza il minor numero di chiamate di sistema:

$ 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

2

Se si sposta 1 a sinistra di 32 e si ottiene 1, il sistema è a 32 bit. Se si sposta 1 a sinistra di 64 e si ottiene 1, il sistema è a 64 bit.

In altre parole,

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

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


Stesso problema con bash usando "long longs".
user3710044

Questo ha funzionato per me, perché se restituisce 32 bit allora è confermato al 100% con 32. Se restituisce 64 può essere bash è stato compilato con long long.
JCM,

1

Se uno è fortemente limitato nei file binari disponibili (ad esempio in initramfs), i miei colleghi hanno suggerito:

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

Sui miei sistemi ALT Linux, i586 ha /lib/ld-linux.so.2e x86_64 ha /lib64/ld-linux-x86-64.so.2.


Ne ho TRE, uno per 32 uno per 64 e uno per mx32.
user3710044

Sì, se non restituisce tonnellate di librerie a 64 bit, allora è in esecuzione un sistema operativo a 32 bit: ls -aR | grep 64 | grep -v proc
JCM

1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set

Ho ottenuto due righe, una con essa impostata una senza.
user3710044

1

Non posso credere che in tutto questo tempo nessuno abbia menzionato:

sudo lshw -class cpu

per ottenere dettagli su velocità, quantità, dimensioni e capacità dell'hardware della CPU.


1

Script semplice per ottenere 64 bit o 32 bit

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

1

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

In base al fatto che 64 bit è in genere x86_64e 32 bit è i686ecc.


-6

Per prima cosa devi scaricare Virtual Box. Quindi selezionare nuovo e un Linux a 32 bit. Quindi avviare Linux usando. Se si avvia, allora è a 32 bit, altrimenti non è a 64 bit.


2
Questo è un modo davvero inverosimile per determinare se il sistema è a 32 o 64 bit.
Marlar

Ma è davvero un modo per risolvere questo problema. Quindi lo segnerò.
firo,

Questo mi ricorda un modo per distinguere i numeri pari da dispari: una matematica esaminerebbe il resto dopo averlo diviso per due; un programmatore osserverebbe il bit meno significativo; uno specialista di MS SQL creerebbe due tabelle, una per i numeri pari e una per i dispari, e guarderebbe dove finisce l'input ... figure
Michael Shigorin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.