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

Quando uname -a , restituisce il seguente risultato.

 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 questo che il sistema operativo indicato è 32 o 64 bit?

Questo è utile quando si scrivono script di configure , ad esempio: per quale architettura sto costruendo?

Prova uname -m . Che è a corto di uname --machine e 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 

Sotto il 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, cioè 64-bit in grado)

 lm ==> 64-bit processor 

O usando lshw (come accennato in seguito da Rolf of Saxony ), senza sudo (solo per greppare la larghezza della cpu):

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

Nota: è ansible 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 senso comunque. Potresti voler trovare il target predefinito del compilatore”)

Se stavi usando una piattaforma a 64 bit vedresti x86_64 o qualcosa di molto simile nell’output di uname -a

Eseguire il nome dell’hardware della macchina specifico

 uname -m 

Puoi anche chiamare

 getconf LONG_BIT 

che restituisce 32 o 64

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

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

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

Il comando

 $ arch 

è equivalente a

 $ uname -m 

ma è due volte più veloce da digitare

Mi stavo chiedendo su 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 roba compilata per il 64- bit piuttosto che modalità di compatibilità a 32 bit).

I pacchetti Debian hanno bisogno di sapere a quale architettura sono (ovviamente) quando effettivamente creano il pacchetto con tutti i suoi metadati, inclusa l’architettura della piattaforma, quindi c’è uno strumento di packaging che lo produce per altri strumenti di packaging e script da usare, chiamati dpkg-architecture . Comprende sia la configurazione per cui è stato configurato, sia l’host corrente. (Normalmente, tuttavia, sono gli stessi.) 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 

È ansible stampare solo una di queste variabili o eseguire un test sui loro valori con le opzioni della riga di comando su dpkg -architecture.

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

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

Se hai un sistema operativo a 64 bit, invece di i686, hai x86_64 o ia64 nell’output di uname -a . In questo non hai nessuna di queste due corde; hai un sistema operativo a 32 bit (nota che questo non significa che la tua CPU non sia a 64 bit).

Quel sistema è a 32 bit. iX86 in uname significa che è un’architettura a 32 bit. Se fosse 64 bit, sarebbe tornato

 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 

Al giorno d’oggi, un sistema può essere multiarch quindi non ha senso comunque. Potresti voler trovare il target predefinito del compilatore:

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

Puoi provare a compilare un mondo ciao:

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

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'!

Puoi anche controllare usando una variabile d’ambiente:

 echo $HOSTTYPE 

Risultato:

i386 -> 32 bit

x86_64 -> 64 bit

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

In Bash, utilizzando l’overflow integer:

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

È molto più efficiente del richiamo di un altro processo o dell'apertura di file.

getconf usa 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 
 $ grep "CONFIG_64" /lib/modules/*/build/.config # CONFIG_64BIT is not set 

Non posso credere che in tutto questo tempo, nessuno ha menzionato:

 sudo lshw -class cpu 

per ottenere dettagli sulla velocità, quantità, dimensioni e capacità dell’hardware della CPU.

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 

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

In base al fatto che 64 bit di solito è x86_64 e 32 bit è i686 ecc.

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

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

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

Se si sposta 1 a sinistra per 32 e si ottiene 1, il sistema è a 32 bit. Se si sposta 1 a sinistra per 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 .

Per prima cosa devi scaricare Virtual Box. Quindi seleziona un nuovo e un Linux a 32 bit. Quindi avvia Linux usando questo. Se si avvia allora è 32 bit se non lo è, allora è un 64 bit.