it-swarm.it

Come determinare l'architettura del kernel Linux?

uname -m fornisce i686 e uname -m fornisce l'output i686 i386 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?

105
user2914

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

esempio per 64 bit:

[email protected]:~$ 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 my linux ARM 32 o 64 bit? per ARM

99
Behrooz

È semplice! Utilizzare il comando Arch.

49
PHPst

@ behrooz è corretto. Sfortunatamente uname richiede di conoscere le architetture. In realtà, stavo cercando un elenco di architetture e ho trovato questo articolo che risponde alla tua domanda. Riguardo a 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 indica CPU in modalità lunga - CPU a 64 bit
  • tm flag indica la modalità protetta - CPU a 32 bit
  • Il flag rm indica la modalità reale - CPU a 16 bit
32
xenoterracide

(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.

21
Luchostein

Per Debian:

Sul mio PC

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

My Raspberry Pi 2

 ~> dpkg --print-architecture 
 armhf 

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:

[email protected]:~$ getconf LONG_BIT
64
13
dannyw

usa syscap da Formake project

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

Ottieni l'architettura della CPU:

syscap info -Arch

Ottieni il nome e la versione del kernel:

syscap info -kernel -kernver
2
Alex

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
minaev

Oppure puoi usare il modo di fare internamente il comando name 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
Meow

Ecco un altro metodo usando uname.

A partire dal man uname:

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

# uname -i x86_64#

0
clusterdude

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

Attenzione, questo presupporrà che il sistema sia a 32 o 64 bit. Vedi la mia spiegazione di seguito se è necessario rilevare l'architettura a 8-16 o qualche altro 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 corrisponderebbero rispettivamente a -1 a 0xFF e 0xFFFF.

0
b_laoshi