Como determinar a arquitetura do kernel Linux?

92

uname -mfornece o i686 e uname -mfornece o i686 i386 na máquina do Red Hat Enterprise Linux Server versão 5.4 (Tikanga). Preciso instalar o Oracle Database 10g Release 2 nessa máquina. Então, como posso decidir se a arquitetura do kernel é 32 bits ou 64 bits?

user2914
fonte
10
Isso é um erro de digitação na primeira frase: uname -me uname -m?
tshepang 2/11/11
Veja também o comando Linux para retornar o número de bits (32 ou 64)? . Se uname -mmostrar i? 86, você tem um sistema de 32 bits.
Gilles
A questão Gilles links para dá uma solução interessante: getconf WORD_BIT.
Mikel
7
getconf WORD_BITretorna 32 no meu Ubuntu de 64 bits
minaev

Respostas:

90

i386 e i686 são ambos de 32 bits.
x86_64 é de 64 bits

exemplo para 64 bits:

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:
Veja o meu linux ARM 32 ou 64 bits? para ARM

Behrooz
fonte
E o armv7l? De qualquer forma, um comando com uma resposta booleana simples seria delicioso.
user7543
1
@ user7543 É o ARM de 32 bits, porque ainda não temos o ARM de 64 bits. Quando o fizermos, será algo diferente.
precisa
Sinto que devo responder minha wiki da comunidade, mas não sei como.
precisa
1
Tente: uname -m. Isso só mostra a arquitetura.
Alexej Magura
32

@behrooz está correto. Infelizmente, unamevocê precisa conhecer arquiteturas. Na verdade, eu estava procurando uma lista de arquiteturas e encontrei este artigo que responde à sua pergunta. Em relação a uname -m:

x86_64 GNU / Linux indica que você tem um kernel Linux de 64 bits em execução. Se você usar, consulte i386 / i486 / i586 / i686, é um kernel de 32 bits.

Para determinar se o hardware é capaz de executar um kernel de 64 bits

grep flags /proc/cpuinfo

Procure o seguinte na saída (todos os sinalizadores recuperados deste fluxo de pilha respondem à mesma pergunta)

  • lm flag significa CPU de modo longo - CPU de 64 bits
  • tm flag significa modo protegido - CPU de 32 bits
  • rm flag significa Modo Real - CPU de 16 bits
xenoterracida
fonte
O sinalizador lm significa simplesmente que a CPU suporta 64 bits ou significa que está sendo executada em 64 bits. Eu recomendo confiar no arco sabendo que será x86_64 para 64 bits ou i? 86 para 32 bits.
Penguin359
1
@ penguin359 significa que o processador suporta 64 bits.
Xenoterracide
O @xeno então não pode ser usado para determinar a arquitetura do kernel.
Penguin359
@ penguin359 não, isso não estava claro na resposta?
Xenoterracide
1
@ penguin359, não, mas é frequentemente útil para descobrir se o seu sistema operacional está em execução 64-bit e se não se o hardware é capaz, imo
xenoterracide
22

(EDIT: esta resposta está errada. Obrigado ao comentário de @ Lizardx)

No Bash, usando excesso de número inteiro:

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

É muito mais eficiente do que invocar outro processo ou abrir arquivos.

Luchostein
fonte
3
tão inteligente e também nos lembra que a arquitetura de chip tem tudo a ver
code_monk
2
Embora elegante, infelizmente isso não está correto: uname -m == i686 MAS if ((1 << 32)); echo 64bits; fi == 64bits Este é um kernel PAE, 32 bits, não um kernel de 64 bits. A CPU é capaz de 64 bits, no entanto, amd64. Como a questão era como determinar o arco do kernel, essa solução geraria resultados incorretos.
Lizardx
1
nota ((é um Bashismo e não definido pela POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny
Eu tentei isso em algumas arquiteturas de 32 bits e isso pensa que é de 64 bits.
Dannyw
Isso pode funcionar((1<<32)-1)
Ivijan Stefan Stipić
15

Para o Debian :

No meu PC

    ~> dpkg --print-architecture
    amd64
    ~> dpkg --print-estrangeiras-arquiteturas
    i386

My Raspberry Pi 2

    ~> dpkg --print-architecture
    armhf
Артем Телешев
fonte
1
isso funciona melhor ao determinar a arquitetura do pacote a ser usada com checkinstall, thx!
Poder de Aquário
Obrigado. Eu estava procurando por algo que descartasse os nomes da arquitetura "padrão" "amd64" / "i386" em vez de apenas "x86_64". Ninguém usa essa terminologia ao nomear liberações pré-compiladas.
Cliff
12

A maneira mais simples é executar:

getconf LONG_BIT

que produzirá 64 ou 32, dependendo de 32 ou 64 bits.

por exemplo:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64
dannyw
fonte
2
Esta resposta é enganosa. Se você habilitar o suporte a multiarch e instalar o kernel de 64 bits em uma instalação de 32 bits, getconf LONG_BITserá impresso 32que você está executando o kernel de 64 bits.
kenn
2

use syscap do projeto Formake

O syscap permite analisar muitas propriedades do sistema e testar dependências. É um script de shell portátil.

Obtenha arquitetura da CPU:

syscap info -arch

Obtenha o nome e a versão do kernel:

syscap info -kernel -kernver
Alex
fonte
1

Outra maneira é verificar a arquitetura para a qual um arquivo de sistema foi compilado, como

$ 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
minaev
fonte
1
Essa é a arquitetura do sistema, que nem sempre é a arquitetura do kernel. Veja esta resposta em SU para obter mais variações.
Gilles
Teoricamente, eles podem diferir, mas existe uma chance de eles se incompatibilizarem em qualquer instalação da vida real?
Minaev 5/05
Algumas distribuições fornecem um kernel amd64 na versão x86. Não sei quantas pessoas as usam, verifiquei o popcon do Debian, mas ele não se correlaciona entre as várias estatísticas. Acho que o principal caso de uso é ter um sistema operacional principal de 32 bits e executar um sistema operacional de 64 bits em um chroot ou em uma VM.
Gilles
@ Gilles Você vai adorar o que vai ler sobre a nova arquitetura x32. Se não for tarde demais, é claro. wiki.debian.org/X32Port
Behrooz
0

Ou você pode usar a maneira como o comando uname internamente faz se você deseja implementar algumas coisas por conta própria:

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

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

Aqui está outro método usando uname.

De man uname:

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

# uname -i x86_64 #

clusterdude
fonte
Até que dê "desconhecido"
Dagelf
0

Se você está procurando uma linha única, esta é a solução mais confiável que eu descobri que retorna 64 ou 32 . Não importa se você está executando o ARM ou não, e deve funcionar em qualquer sistema usando o bash ou sh .

Cuidado, isso pressupõe que o sistema seja de 32 ou 64 bits. Veja minha explicação abaixo se você precisar detectar a arquitetura 8-16 ou algum outro bit.

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

O que está acontecendo aqui?
A lógica é muito simples e tudo se resume a como os computadores armazenam números inteiros assinados. Uma arquitetura de 32 bits possui apenas 32 bits que pode ser usada para armazenar números inteiros assinados, enquanto uma arquitetura de 64 bits possui 64 bits! Em outras palavras, o conjunto de números inteiros que podem ser armazenados é finito. Metade deste conjunto representa números negativos e metade representa números positivos. O número inteiro assinado igual a -1 é representado como o maior número que pode ser armazenado em um determinado número de bits para essa arquitetura. Em um sistema de 32 bits, -1 pode ser representado pelo valor hexadecimal 0xFFFFFFFF (que é de 32 bits binários, todos iguais a 1). Em um sistema de 64 bits, 0xFFFFFFFF traduz para 4.294.967.295, base 10, enquanto 0xFFFFFFFFFFFFFFFFFF é a representação para -1). Você pode ver como isso seria facilmente dimensionado para sistemas de 8 ou 16 bits, que seriam iguais a -1 em 0xFF e 0xFFFF,

b_laoshi
fonte