¿Cómo determinar si un Linux dado es de 32 bits o de 64 bits?

470

Cuando escribo uname -a, da el siguiente resultado.

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

¿Cómo puedo saber de esto que el sistema operativo dado es de 32 o 64 bits?

Esto es útil cuando escribo configureguiones, por ejemplo: ¿para qué arquitectura estoy construyendo?

swapnonil
fuente

Respuestas:

735

Tratar uname -m. Que es corto uname --machiney produce:

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

De lo contrario, no para el kernel de Linux, sino para la CPU , escriba:

cat /proc/cpuinfo

o:

grep flags /proc/cpuinfo

En el parámetro "flags", verá varios valores: vea " ¿Qué significan los flags en / proc / cpuinfo? " Entre ellos, uno se llama lm: Long Mode( x86-64 : amd64, también conocido como Intel 64, es decir, 64 bits capaz)

lm ==> 64-bit processor

O usandolshw (como se menciona a continuación por Rolf de Sajonia ), sin sudo(solo para aprovechar el ancho de la CPU):

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

Nota: puede tener una CPU de 64 bits con un núcleo de 32 bits instalado .
(como ysdx menciona en su propia respuesta , "Hoy en día, un sistema puede ser multiarch, por lo que no tiene sentido de todos modos. Es posible que desee encontrar el objetivo predeterminado del compilador")

VonC
fuente
3
grep flags / proc / cpuinfo solo le dice si la CPU es de 64 bits. Según tengo entendido, la pregunta era sobre el sistema operativo. uname -m solo me dice "i686".
Kim Stebel el
3
Tengo un kernel de 32 bits en hardware de 64 bits y obtengo "x86_64" de 'uname -m' (en Debian). La página de manual de uname dice que -m muestra el nombre del hardware de la máquina, por lo que parece correcto.
Tony Meyer
1
Si tengo un núcleo de 32 bits que se ejecuta en una máquina / procesador de 64 bits, lo que haría uname -i, uname -py la uname -mserie?
ruben2020
44
¿Qué pasa si tm y lm están presentes?
Javier Novoa C.
44
@JavierNovoaC. tm (monitor térmico) indica control automático del reloj. No tiene nada que ver con distinguir un procesador de 32 bits. De hecho, lm (modo largo) está presente si y solo si tiene una CPU de 64 bits. Por eso solo debes confiar en lm. de lo contrario, la respuesta dada por Thomas Watnedal es la mejor. Esta respuesta es simplemente incorrecta y ha engañado a muchas personas por favor, los moderadores hacen algo al respecto.
Issam T.
153

Si estuviera ejecutando una plataforma de 64 bits, vería x86_64 o algo muy similar en la salida de uname -a

Para obtener el nombre de hardware específico de su máquina, ejecute

uname -m

Tambien puedes llamar

getconf LONG_BIT

que devuelve 32 o 64

Thomas Watnedal
fuente
44
uname -msalidas x86_64 getconf LONG_BITsalidas 32¿Cuál es la correcta? : \
Stephan
10
Eso significa que la CPU es de 64 bits, pero solo ha instalado un sistema operativo de 32 bits, a pesar de que podría haber utilizado uno de 64 bits.
1
Steve Kemp tiene razón, así que tenga cuidado (Mac OS X 10.5 en MacBooks 2009 me viene a la mente, donde el sistema operativo es de 32 bits pero es capaz de ejecutar aplicaciones de 64 bits)
jww
1
El uname -mno es útil para los QP configureya que puede dar un resultado incorrecto. El getconf LONG_BITobtener el tamaño predeterminado de bits de la biblioteca de C que pueden no ser del tamaño correcto para una especificada, por CC, compilador.
user3710044
2
getconf LONG_BITpuede proporcionar 32 ig. Se ha creado como una aplicación de 32 bits (normalmente, un núcleo de 64 bits que ejecuta un usuario de 32 bits).
ysdx
42

lscpu enumerará estos entre otra información con respecto a su CPU:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
asharma
fuente
3
Emite las capacidades físicas de la CPU, útiles, pero no confiables para el espacio de usuario actual del sistema operativo actual.
user3710044
33

Otro comando útil para una fácil determinación es el siguiente:

Mando:

getconf LONG_BIT

Responder:

  • 32, si el sistema operativo es de 32 bits
  • 64, si el sistema operativo es de 64 bits
usuario3207041
fuente
2
No es cierto en el caso de HP-UX 11.31i en Itanium 64: este comando devuelve 32.
Gabriel Hautclocq
Supongo que todo depende de lo que el interlocutor entienda por "64 bits": solía significar el tamaño natural de los enteros, pero ahora a menudo se usa para referirse al tamaño de direccionamiento.
Toby Speight
12

El comando

$ arch    

es equivalente a

$ uname -m

pero es el doble de rápido para escribir

Greg von Winckel
fuente
2
De acuerdo, pero estoy seguro de que la velocidad de escritura no es un problema para la mayoría de los desarrolladores.
williamcarswell
2
Esto devuelve los tipos de proceso que el núcleo puede soportar. Es posible e incluso razonable ejecutar un espacio de usuario de 32 bits en un núcleo de 64 bits.
user3710044
1
El comando arch no está disponible en todos los sistemas unix, mientras que uname debería estarlo.
Gabriel Hautclocq
11

Me preguntaba sobre esto específicamente para construir software en Debian (el sistema Debian instalado puede ser una versión de 32 bits con un núcleo de 32 bits, bibliotecas, etc., o puede ser una versión de 64 bits con material compilado para 64- bit en lugar del modo de compatibilidad de 32 bits).

Los paquetes Debian necesitan saber para qué arquitectura son (por supuesto) cuando realmente crean el paquete con todos sus metadatos, incluida la arquitectura de la plataforma, por lo que hay una herramienta de empaque que lo genera para que otras herramientas de empaque y scripts lo usen, llamado dpkg-architecture . Incluye tanto para qué está configurado para construir, como el host actual. (Normalmente, estos son los mismos). Ejemplo de salida en una 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

Puede imprimir solo una de esas variables o hacer una prueba con sus valores con opciones de línea de comando para dpkg -architecture.

No tengo idea de cómo dpkg-architecture deduce la arquitectura, pero podría ver su documentación o código fuente (dpkg-architecture y gran parte del sistema dpkg en general son Perl).

Reed Hedges
fuente
Simplemente puede usar: dpkg --architecturepara obtener la arquitectura del sistema host, que no requiere la instalación del dpkg-devpaquete.
Mark Longair
Esto produce dpkg: error: unknown option --architecturepara dpkg 1.17.5ubuntu de 14.04. Sin embargo, dpkg-architecture (con dpkg-dev instalado) funciona bien.
timurb
2
El comando dpkg --print-architectureha funcionado en Debian desde siempre. Este funciona pero está limitado a Debian y sus derivados.
user3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
escocés
fuente
2
Funciona pero parece ser un detalle de implementación de stdio.h en Linux, existen mejores soluciones, por ejemplo: limit.h, NO UTILIZAR.
user3710044
10

Si tiene un sistema operativo de 64 bits, en lugar de i686, tiene x86_64o ia64en la salida de uname -a. En eso no tienes ninguna de estas dos cadenas; tiene un sistema operativo de 32 bits (tenga en cuenta que esto no significa que su CPU no sea de 64 bits).

Denis R.
fuente
1
Esto devuelve los tipos de proceso que el núcleo puede soportar. Es posible e incluso razonable ejecutar un espacio de usuario de 32 bits en un núcleo de 64 bits.
user3710044
Hay otros valores en la unamesalida que indican SO de 64 bits. No todo el mundo es un x86 o Itanium ...
Toby Speight
6

Ese sistema es de 32 bits. iX86 en unamesignifica que es una arquitectura de 32 bits. Si fuera de 64 bits, volvería

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
fuente
1
Esto devuelve los tipos de proceso que el núcleo puede soportar. Es posible e incluso razonable ejecutar un espacio de usuario de 32 bits en un núcleo de 64 bits.
user3710044
6

Hoy en día, un sistema puede ser multiarch, por lo que no tiene sentido de todos modos. Es posible que desee encontrar el destino predeterminado del compilador:

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

Puedes intentar compilar un hola mundo:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ file foo
foo: ELF ejecutable LSB de 64 bits, x86-64, versión 1 (SYSV), vinculado dinámicamente, intérprete /lib64/ld-linux-x86-64.so.2, para GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, no despojado
ysdx
fuente
1
Como cc -v | grep …de todos modos es específico del compilador, uno puede usarlo cc -dumpmachine, lo que no requiere grepping y no solo es compatible con GCC.
Anton Samsonov
Dado que la pregunta sugiere que es para un script de configuración, esta es probablemente la respuesta más útil y relevante aquí. Hará lo que desee en todos los casos que sean importantes (incluido un chroot de usuario de 32 bits en un sistema operativo de 64 bits, compilación cruzada para una arquitectura extranjera y el resto).
Toby Speight
5

Con respecto a la respuesta "getconf LONG_BIT" .

Escribí una función simple para hacerlo en '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;
    }
}

Buena idea, el 'getconf'!

kaiwan
fuente
55
Idea tonta! Uso CHAR_BIT*sizeof(void*)o __WORDSIZEen C.
ceving
3
No, no es tonto. Es posible que tenga un ejecutable de 32 bits y desee averiguar si el sistema admitiría uno de 64 bits, por ejemplo.
Ludvig A. Norin
Obtiene la longitud predeterminada de un largo en la biblioteca GNU-C ... ¡este funciona!
user3710044
1
De hecho, está mal, porque si está ejecutando un espacio de usuario de 32 bits en un núcleo de 64 bits, o incluso un espacio de usuario X32, dirá que el sistema operativo es de 32 bits.
Ruslan
Se recomienda encarecidamente no utilizar fgets: stackoverflow.com/questions/16323185/…
desde el
4

También puede verificar usando una variable de entorno:

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
fuente
1
Esta es una variable integrada porque /bin/bashno es una variable de entorno. Si ya eres dependiente de Bash, esto funciona bien. Sin embargo, el resultado puede ser i386, i486, i586, i686y otros así que tenga cuidado.
user3710044
3

En Bash, usando el desbordamiento de enteros:

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

Es mucho más eficiente que invocar otro proceso o abrir archivos.

rev. Luchostein
fuente
2
Bash se compila (¿puede ser?) Para usar entradas de 64 bits si ese tipo está disponible, por lo general lo es hoy en día, por lo que los sistemas de 32 bits normalmente usarán el tipo "largo largo"
user3710044
2
bash en Debian ha sido compilado para usar aritmética de 64 bits desde 2008 a más tardar, probablemente antes de eso. Esta respuesta se ha roto desde antes de que existiera stackoverflow.
Peter Cordes
3

getconf usa la menor cantidad de llamadas al 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
usuario5859111
fuente
2

Si desplaza 1 a la izquierda por 32 y obtiene 1, su sistema es de 32 bits. Si desplaza 1 a la izquierda por 64 y obtiene 1, su sistema es de 64 bits.

En otras palabras,

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
fuente
Mismo problema con bash usando "longs largos".
user3710044
Esto funcionó para mí, porque si devuelve 32 bits, entonces está 100% confirmado ejecutando 32. Si devuelve 64, bash podría compilarse con largos largos.
JCM
1

Si uno está severamente limitado en binarios disponibles (por ejemplo, en initramfs), mis colegas sugirieron:

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

En mis sistemas ALT Linux, i586 tiene /lib/ld-linux.so.2y x86_64 tiene /lib64/ld-linux-x86-64.so.2.

Michael Shigorin
fuente
Tengo TRES de esos, uno para 32 uno para 64 y uno para mx32.
user3710044
Sí, si no devuelve toneladas de bibliotecas de 64 bits, entonces está ejecutando un sistema operativo 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
fuente
Tengo dos líneas, una con él y otra sin él.
user3710044
1

No puedo creer que en todo este tiempo, nadie haya mencionado:

sudo lshw -class cpu

para obtener detalles sobre la velocidad, cantidad, tamaño y capacidades del hardware de la CPU.

Rolf de Sajonia
fuente
1

Script simple para obtener 64 bits o 32 bits

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

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

Basado en el hecho de que generalmente es de 64 bits x86_64y de 32 bits, i686etc.

79man
fuente
-6

Primero tienes que descargar Virtual Box. Luego seleccione nuevo y un Linux de 32 bits. Luego arranque el linux usándolo. Si arranca, entonces es de 32 bits, si no es así, es de 64 bits.

Vikram Thaman
fuente
2
Esta es una forma muy descabellada de determinar si el sistema es de 32 o 64 bits.
marlar
Pero es realmente una forma de resolver este problema. Entonces lo marcaré.
firo
Esto me recuerda una forma de distinguir los números pares de los impares: una matemática vería el resto después de dividirlo entre dos; un programador miraría el bit menos significativo; un especialista en MS SQL crearía dos tablas, una para números pares y otra para números impares, y vería dónde termina la entrada ... cifras
Michael Shigorin