Come determinare l'architettura del kernel Linux?


92

uname -mfornisce i686 e uname -mfornisce i686 i386 in output nella macchina Red Hat Enterprise Linux Server versione 5.4 (Tikanga). Devo installare Oracle Database 10g Release 2 su quella macchina. Quindi, come posso decidere se l'architettura del kernel è a 32 bit o 64 bit?


10
È un refuso sulla prima frase: uname -me uname -m?
Tshepang,

Vedi anche il comando Linux per restituire il numero di bit (32 o 64)? . Se uname -mmostra i? 86, hai un sistema a 32 bit.
Gilles,


La domanda Gilles collega a dà una soluzione interessante: getconf WORD_BIT.
Mikel,

7
getconf WORD_BITrestituisce 32 sul mio Ubuntu a 64 bit
minaev

Risposte:


90

i386 e i686 sono entrambi a 32 bit.
x86_64 è a 64 bit

esempio per 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:
Vedi il mio ARM Linux a 32 o 64 bit? per ARM


Che dire di armv7l? In ogni caso, un comando con una semplice risposta booleana sarebbe delizioso.
user7543

1
@ user7543 È ARM a 32 bit, perché non abbiamo ancora ARM a 64 bit. Quando lo facciamo, sarà qualcosa di diverso.
Behrooz,

Sento che dovrei fare la mia wiki della community di risposta ma non so come.
Behrooz, il

1
Prova: uname -m. Questo mostrerà solo l'architettura.
Alexej Magura,


32

@behrooz è corretto. Sfortunatamente unamerichiede di conoscere le architetture. In realtà, stavo cercando un elenco di architetture e ho trovato questo articolo che risponde alla tua domanda. Per quanto riguarda uname -m:

x86_64 GNU / Linux indica che hai un kernel Linux a 64 bit in esecuzione. Se usi vedi i386 / i486 / i586 / i686 è un kernel a 32 bit.

Per determinare se l'hardware è in grado di eseguire un kernel a 64 bit

grep flags /proc/cpuinfo

Cerca quanto segue nell'output (tutti i flag recuperati da questa risposta dello stackoverflow per la stessa domanda)

  • lm flag significa CPU in modalità lunga - CPU a 64 bit
  • tm flag significa Modalità protetta - CPU a 32 bit
  • rm flag significa Modalità reale - CPU a 16 bit

Il flag lm significa semplicemente che la CPU supporta 64 bit o significa che è in esecuzione a 64 bit. Consiglio di fare affidamento sull'arco sapendo che sarà x86_64 per 64 bit o i 86 per 32 bit.
penguin359,

1
@ penguin359 significa che la cpu supporta 64 bit.
xenoterracide,

@xeno quindi non può essere usato per determinare l'architettura del kernel.
penguin359,

@ penguin359 no, non era chiaro nella risposta?
xenoterracide,

1
@ penguin359, no, ma è spesso utile scoprire se il tuo sistema operativo funziona a 64 bit e, in caso contrario, se l'hardware è in grado, imo
xenoterracide

22

(EDIT: questa risposta è ERRATA. Grazie al commento di @ Lizardx)

In Bash, usando l'overflow dei numeri interi:

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

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


3
così intelligente e ci ricorda anche che cos'è l'architettura di chip
code_monk

2
Sebbene elegante, questo purtroppo non è corretto: uname -m == i686 MA if ((1 << 32)); then echo 64bits; fi == 64bits Questo è un kernel PAE, 32 bit, non un kernel 64 bit. La CPU ha 64 bit, tuttavia, amd64. Poiché la domanda era come determinare l'arco del kernel, questa soluzione avrebbe prodotto risultati errati.
Lizardx,

1
nota ((è un Bashismo e non definito da POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny,

Ho provato questo su alcune architetture a 32 bit e questo pensa che sia a 64 bit.
Dannyw,

Questo può funzionare((1<<32)-1)
Ivijan Stefan Stipić il

15

Per Debian :

Sul mio PC

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

My Raspberry Pi 2

    ~> dpkg --print-architecture
    armhf

1
funziona meglio quando si determina l'architettura del pacchetto da usare con checkinstall, grazie!
Aquarius Power

Grazie. Ho cercato qualcosa che eliminasse i nomi di architettura "standard" "amd64" / "i386" anziché solo "x86_64". Nessuno usa questa terminologia per nominare le versioni precompilate.
Cliff

12

Il modo più semplice è eseguire:

getconf LONG_BIT

che produrrà 64 o 32 a seconda che si tratti di 32 o 64 bit.

per esempio:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Questa risposta è fuorviante. Se si abilita il supporto multiarch e si installa il kernel a 64 bit su 32 bit, l'installazione getconf LONG_BITverrà stampata 32sebbene si stia eseguendo il kernel a 64 bit.
gennaio

2

usa syscap dal progetto Formake

syscap consente di sondare molte proprietà del sistema e testare le dipendenze. È uno script di shell portatile.

Ottieni l'architettura della CPU:

syscap info -arch

Ottieni il nome e la versione del kernel:

syscap info -kernel -kernver

1

Un altro modo è verificare l'architettura per cui è stato compilato un file di sistema, come

$ 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
Questa è l'architettura di sistema, che non è sempre l'architettura del kernel. Vedi questa risposta su SU per ulteriori variazioni.
Gilles,

Teoricamente, possono differire, ma c'è una possibilità che non corrispondano a nessuna installazione reale?
minaev

Alcune distribuzioni forniscono un kernel amd64 nella versione x86. Non so quante persone li usano, ho controllato Debian popcon ma non è correlato tra le varie statistiche. Penso che il caso d'uso principale sia avere un sistema operativo principale a 32 bit e eseguire un sistema operativo a 64 bit in un chroot o in una macchina virtuale.
Gilles,

@Gilles Amerai ciò che leggerai sulla nuova architettura x32, se non sono troppo tardi, ovviamente. wiki.debian.org/X32Port
Behrooz,

0

Oppure puoi usare il modo di fare internamente il comando uname se vuoi implementare qualcosa da solo:

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

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

0

Ecco un altro metodo che utilizza uname.

Da man uname:

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

# uname -i x86_64 #


Fino a quando non dà "sconosciuto"
Dagelf il

0

Se stai cercando un semplice one-liner, questa è la soluzione più affidabile che ho trovato che restituisce 64 o 32 . Non importa se stai usando ARM o no, e dovrebbe funzionare su qualsiasi sistema usando bash o sh .

Attenzione, questo presupporrà che il sistema sia a 32 o 64 bit. Vedere la mia spiegazione di seguito se è necessario rilevare l'architettura a 8-16 o qualche altra bit.

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

Cosa sta succedendo qui?
La logica è molto semplice e tutto si riduce al modo in cui i computer memorizzano numeri interi firmati. Un'architettura a 32 bit ha solo 32 bit che può utilizzare per memorizzare numeri interi con segno mentre un'architettura a 64 bit ha 64 bit! In altre parole, l'insieme di numeri interi che è possibile memorizzare è finito. La metà di questo set rappresenta numeri negativi e la metà rappresenta numeri positivi. L'intero con segno uguale a -1 è rappresentato come il numero più grande che può essere memorizzato in un determinato numero di bit per quell'architettura. Su un sistema a 32 bit, -1 può essere rappresentato dal valore esadecimale 0xFFFFFFFF (che è 32 bit binari, tutti uguali a 1). Su un sistema a 64 bit, 0xFFFFFFFF si traduce in 4.294.967.295, base 10 mentre 0xFFFFFFFFFFFFFFFF è la rappresentazione per -1). Puoi vedere come questo si ridimensionerebbe facilmente anche per i sistemi a 8 o 16 bit che equivarrebbero a -1 a 0xFF e 0xFFFF,

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.