Como determinar se um determinado Linux é de 32 ou 64 bits?

470

Quando digito uname -a, ele fornece a seguinte saída.

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

Como posso saber com isso que o sistema operacional fornecido é 32 ou 64 bits?

Isso é útil ao escrever configurescripts, por exemplo: para qual arquitetura estou construindo?

swapnonil
fonte

Respostas:

735

Tente uname -m. Qual é curto uname --machinee produz:

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

Caso contrário, não para o kernel do Linux, mas para a CPU , você digita:

cat /proc/cpuinfo

ou:

grep flags /proc/cpuinfo

No parâmetro "flags", você verá vários valores: consulte " O que significam os sinalizadores em / proc / cpuinfo? " Entre eles, um é nomeado lm: Long Mode( x86-64 : amd64, também conhecido como Intel 64, ou seja, 64 bits capaz)

lm ==> 64-bit processor

Ou usandolshw (como mencionado abaixo por Rolf da Saxônia ), sem sudo(apenas para manter a largura da CPU):

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

Nota: você pode ter uma CPU de 64 bits com um kernel de 32 bits instalado .
(como ysdx menciona em sua própria resposta : "Atualmente, um sistema pode ser multiarca, para que não faça sentido de qualquer maneira. Você pode encontrar o destino padrão do compilador")

VonC
fonte
3
grep flags / proc / cpuinfo informa apenas se a CPU é de 64 bits. Pelo que entendi a pergunta, era sobre o sistema operacional. uname -m só me diz "i686".
Kim Stebel
3
Eu tenho um kernel de 32 bits no hardware de 64 bits e obtenho "x86_64" de 'uname -m' (no Debian). A página de manual do uname diz que -m mostra o nome do hardware da máquina, portanto parece correto.
Tony Meyer
1
Se eu tiver um kernel de 32 bits em execução em um 64-bit / máquina de processador, o que seria uname -i, uname -pe uname -mshow?
ruben2020
4
e se tm e lm estiverem presentes?
Javier Novoa C. 27/10
4
@JavierNovoaC. tm (Monitor térmico) indica controle automático do relógio. Não tem nada a ver com a distinção de um processador de 32 bits. De fato, lm (modo longo) está presente se e somente se você tiver uma CPU de 64 bits. É por isso que você deve confiar apenas no lm. caso contrário, a resposta dada por Thomas Watnedal é a melhor. Esta resposta está errada e enganou muitas pessoas, por isso os moderadores fazem algo a respeito.
quer
153

Se você estivesse executando uma plataforma de 64 bits, veria x86_64 ou algo muito semelhante na saída de uname -a

Para obter o nome específico do hardware da sua máquina, execute

uname -m

Você também pode ligar

getconf LONG_BIT

que retorna 32 ou 64

Thomas Watnedal
fonte
4
uname -moutputs x86_64 getconf LONG_BIToutputs 32Qual está correto? : \
Stephan
10
Isso significa que a CPU é de 64 bits, mas você instalou apenas um sistema operacional de 32 bits, mesmo que você possa ter usado um de 64 bits.
1
Steve Kemp é certo, por isso tome cuidado (Mac OS X 10.5 em 2009 MacBooks vem à mente, onde o OS é 32 bits, mas a sua capacidade de executar aplicativos de 64 bits)
JWW
1
A uname -mnão é útil para a QP é configurecomo ele pode dar o resultado errado. O getconf LONG_BITtamanho do bit padrão da biblioteca C pode ser o tamanho correto para um CCcompilador especificado por .
User3710044
2
getconf LONG_BITpode fornecer 32 ig, ele foi construído como um aplicativo de 32 bits (normalmente um kernel de 64 bits executando uma terra de usuário de 32 bits).
ysdx 19/09/2015
42

lscpu listará estas entre outras informações sobre sua CPU:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
asharma
fonte
3
Produz os recursos físicos da CPU, úteis, mas não confiáveis ​​para o espaço de usuário atual do SO atual.
User3710044 31/01
33

Outro comando útil para facilitar a determinação é o seguinte:

Comando:

getconf LONG_BIT

Responda:

  • 32, se o SO for 32 bits
  • 64, se o SO for 64 bits
user3207041
fonte
2
Não é verdade no caso do HP-UX 11.31i no Itanium 64: esse comando retorna 32.
Gabriel Hautclocq
Eu acho que tudo depende do que o questionador quer dizer com "64 bits" - costumava significar o tamanho natural dos números inteiros, mas agora é frequentemente usado como o tamanho do endereço.
Toby Speight
12

O comando

$ arch    

é equivalente a

$ uname -m

mas é duas vezes mais rápido para digitar

Greg von Winckel
fonte
2
Concordo, mas tenho certeza que a velocidade de digitação não é um problema para a maioria dos desenvolvedores.
Williamcarswell
2
Isso retorna os tipos de processo que o kernel pode suportar. É possível e até razoável executar um espaço de usuário de 32 bits em um kernel de 64 bits.
User3710044 31/01
1
O comando arch não está disponível em todos os sistemas unix, enquanto uname deve estar.
Gabriel Hautclocq
11

Eu estava pensando sobre isso especificamente para a construção de software no Debian (o sistema Debian instalado pode ser uma versão de 32 bits com um kernel de 32 bits, bibliotecas etc.) ou pode ser uma versão de 64 bits com material compilado para o sistema 64-bit. em vez do modo de compatibilidade de 32 bits).

Os próprios pacotes Debian precisam saber para qual arquitetura eles são (é claro) quando eles realmente criam o pacote com todos os seus metadados, incluindo a arquitetura da plataforma, para que exista uma ferramenta de empacotamento que o produza para outras ferramentas e scripts de empacotamento, chamados arquitetura dpkg . Inclui tanto o que ele está configurado para construir, quanto o host atual. (Normalmente, eles são os mesmos.) Exemplo de saída em uma máquina de 64 bits:

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

Você pode imprimir apenas uma dessas variáveis ​​ou fazer um teste em relação a seus valores com as opções de linha de comando para dpkg -architecture.

Não tenho idéia de como o dpkg-architecture deduz a arquitetura, mas você pode ver a documentação ou o código fonte (dpkg-architecture e grande parte do sistema dpkg em geral são Perl).

Reed Hedges
fonte
Você pode apenas usar: dpkg --architecturepara obter a arquitetura do sistema host, que não requer a instalação do dpkg-devpacote.
27612 Mark Longair
Isso produz dpkg: error: unknown option --architecturepara o dpkg 1.17.5ubuntu de 14.04. O dpkg-architecture (com o dpkg-dev instalado) funciona bem.
timurb
2
O comando dpkg --print-architecturetrabalhou no Debian desde sempre. Este funciona, mas está limitado ao Debian e seus derivados.
User3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
escocês
fonte
2
Funciona, mas parece ser um detalhe de implementação do stdio.h no Linux, existem soluções melhores, por exemplo: limits.h, NÃO USE.
User3710044
10

Se você possui um sistema operacional de 64 bits, em vez do i686, possui x86_64ou ia64na saída de uname -a. Na medida em que você não possui nenhuma dessas duas strings; você possui um sistema operacional de 32 bits (observe que isso não significa que sua CPU não é de 64 bits).

Denis R.
fonte
1
Isso retorna os tipos de processo que o kernel pode suportar. É possível e até razoável executar um espaço de usuário de 32 bits em um kernel de 64 bits.
User3710044
Existem outros valores na unamesaída que indicam o SO de 64 bits. Nem todo o mundo é um x86 ou Itanium ...
Toby Speight
6

Esse sistema é de 32 bits. iX86 in unamesignifica que é uma arquitetura de 32 bits. Se fosse de 64 bits, retornaria

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
Louis Gerbarg
fonte
1
Isso retorna os tipos de processo que o kernel pode suportar. É possível e até razoável executar um espaço de usuário de 32 bits em um kernel de 64 bits.
User3710044
6

Atualmente, um sistema pode ser multiarca, por isso não faz sentido. Você pode encontrar o destino padrão do compilador:

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

Você pode tentar compilar um olá mundo:

$ echo 'int main () {retorno 0; } '| cc -xc - -o foo
$ file foo
foo: Executável ELF de 64 bits LSB, x86-64, versão 1 (SYSV), vinculado dinamicamente, intérprete /lib64/ld-linux-x86-64.so.2, para GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, não retirado
ysdx
fonte
1
Já que cc -v | grep …é específico do compilador, pode-se usar apenas cc -dumpmachine, o que não requer grepping e é suportado não apenas pelo GCC.
Anton Samsonov
Dado que a pergunta sugere que seja para um script de configuração, esta é provavelmente a resposta mais útil e relevante aqui. Ele fará o que você deseja em todos os casos importantes (incluindo um chroot de usuário de 32 bits em um sistema operacional de 64 bits, compilação cruzada para uma arquitetura estrangeira e o restante).
Toby Speight
5

Com relação à resposta "getconf LONG_BIT" .

Eu escrevi uma função simples para fazê-lo em '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;
    }
}

Boa ideia, o 'getconf'!

kaiwan
fonte
5
Idéia boba! Use CHAR_BIT*sizeof(void*)ou __WORDSIZEem C.
ceving 11/07/12
3
Não, não é bobo. Você pode ter um executável de 32 bits e deseja descobrir se o sistema suportaria um de 64 bits, por exemplo.
precisa
Obtém o comprimento padrão de um longo na biblioteca GNU-C .. este funciona!
User3710044
1
Na verdade, está errado, porque se você estiver executando o espaço do usuário de 32 bits no kernel de 64 bits, ou mesmo o espaço do usuário X32, dirá que o sistema operacional é de 32 bits.
Ruslan
É altamente recomendável não usar fgets: stackoverflow.com/questions/16323185/…
ceving 24/03/17
4

Você também pode verificar usando uma variável de ambiente:

echo $HOSTTYPE

Resultado:

i386 -> 32 bits

x86_64 -> 64 bits

Extraído de: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

LinuxMaintwo
fonte
1
Essa é uma variável incorporada, pois /bin/bashnão é uma variável de ambiente. Se você já é dependente do Bash, isso funciona bem. No entanto, o resultado pode ser i386, i486, i586, i686e outros por isso tome cuidado.
usar o seguinte comando
3

No Bash, usando excesso de número inteiro:

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

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

Luchostein
fonte
2
Bash é (pode ser?) Compilado para ints uso de 64 bits se esse tipo está disponível, geralmente é nos dias de hoje e assim por sistemas de 32 bits normalmente usar o tipo "long long"
user3710044
2
O bash no Debian foi compilado para usar a aritmética de 64 bits desde 2008, o mais tardar, provavelmente antes disso. Esta resposta foi interrompida desde antes da existência do stackoverflow.
Pedro Cordes
3

O getconf usa o menor número de chamadas do 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
user5859111
fonte
2

Se você alternar 1 deixado por 32 e você obtém 1, seu sistema é de 32 bits. Se você alternar 1 deixado por 64 e obtiver 1, seu sistema será de 64 bits.

Em outras palavras,

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

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

Sandeep Giri
fonte
O mesmo problema com o bash usando "long longs".
User3710044
Isso funcionou para mim, porque se ele retornar 32 bits, será 100% confirmado executando 32. Se ele retornar 64, o bash foi compilado com longos longos.
JCM
1

Se alguém está severamente limitado nos binários disponíveis (por exemplo, no initramfs), meus colegas sugeriram:

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

Nos meus sistemas ALT Linux, o i586 possui /lib/ld-linux.so.2e o x86_64 possui /lib64/ld-linux-x86-64.so.2.

Michael Shigorin
fonte
Eu tenho três desses, um para 32, um para 64 e um para mx32.
User3710044
Sim, se ele não retornar toneladas de bibliotecas de 64 bits, estará executando o SO de 32 bits: ls -aR | grep 64 | grep -v proc
JCM
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
alex
fonte
Eu tenho duas linhas, uma com ela definida e outra sem.
User3710044
1

Não acredito que, durante todo esse tempo, ninguém tenha mencionado:

sudo lshw -class cpu

para obter detalhes sobre a velocidade, quantidade, tamanho e recursos do hardware da CPU.

Rolf da Saxônia
fonte
1

Script simples para obter 64 ou 32 bits

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

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

Com base no fato de que 64 bits é geralmente x86_64e 32 bits é i686etc.

79man
fonte
-6

Primeiro você precisa baixar o Virtual Box. Em seguida, selecione um novo e um Linux de 32 bits. Então inicie o linux usando-o. Se inicializar, será de 32 bits, se não for, será de 64 bits.

Vikram Thaman
fonte
2
Essa é uma maneira realmente absurda de determinar se o sistema é de 32 ou 64 bits.
Marlar
Mas é realmente uma maneira de resolver esse problema. Então eu vou marcar isso.
firo
Isso me lembra uma maneira de distinguir números pares de ímpares: uma matemática olhava o restante depois de dividi-lo por dois; um programador examinaria o bit menos significativo; especialista em um MS SQL iria criar duas tabelas, uma para números pares e um para o estranho, e olhar onde a entrada acaba ... figuras
Michael Shigorin