2012-04-13 768 views
7

Necesito escribir un script bash donde debo verificar si el kernel de Linux es de 32 bits o de 64 bits.Cómo verificar el kernel de 32 bits/64 bits para Linux

estoy usando uname -a mando, y me da x86_64 resultado. Pero creo que no puedo usarlo de forma genérica porque el resultado puede diferir si alguien usa arquitectura no x86.

¿Cómo verificar el kernel de 32 bits/64 bits para Linux?

+0

Cuando dices "instalación", ¿te refieres al kernel? Porque puede usar un kernel de 64 bits con una instalación de 32 bits. –

+0

Sí ... Kernel ... Gracias – VJS

Respuesta

-2

Grep para '64' en la salida de uname

uname -a | grep 64 
+2

Si el kernel fue compilado 64 veces, esto causará un falso positivo. Lo mismo si el nombre del servidor es 'blade64A'. –

+1

Usar 'uname -i | grep 64' en su lugar. –

+0

@David Schwartz: Soy un poco nuevo en esto y no pensé. Podrías por favor explicar un poco. Gracias una tonelada !! – VJS

5

podrías consultar en el sistema para el tamaño de un long int:

getconf LONG_BIT 

pero no estoy seguro si esto es totalmente portátil a todas las diferentes arquitecturas

1

Busque el indicador lm (modo largo) en/proc/cpuinfo. Si esto es cierto, significa que tienes un procesador de 64 bits. Un simple grep debería darle esta información.

En cuanto a la versión del kernel, siempre puede grep en la uname -a información. Mejor sería encontrar la fuente del programa uname para que podamos descartar la discrepancia debida a un nombre de host malicioso.

+2

Esto solo funcionará en i386/x86_64. Una vez trabajé en una máquina POWER y allí el formato de '/ proc/cpuinfo' era completamente diferente, mucho más compacto y no tenía banderas como estas. –

+0

@above/proc/cpuinfo da la cantidad de bits físicos y bits virtuales. ¿Recibe esta información mientras trabaja en una máquina de poder? El siguiente paso para nosotros es dar sentido a esta información. Estoy probando mi parte. Una cosa más: creo que podemos usar el tamaño de int en C para determinar el tamaño de palabra de la máquina. –

+0

@prathmeshkallurkar Ya no tengo acceso a esa máquina, pero recuerdo que la información fue muy breve, como 4 líneas por CPU, solo nombres de modelos y apenas nada más. Incluso si tuviera información sobre los bits disponibles, ciertamente estaba en un formato diferente al de x86. –

1

Se me ocurrió lo siguiente. Supone que se usa init (algunas distribuciones se han cambiado a otros cargadores, pero debería ser fácil obtener una lista de las que se usan con frecuencia) y que usa ELF, no a.out u otro formato ejecutable exótico hoy en día. Parecen ser supuestos cabales para la mayoría de los sistemas, pero probablemente se rompan en sistemas embebidos, etc. Aún así, la idea general debería ser posible de adaptar (consiga el proceso init o equivalente y verifique su bitness usando file). Si está ejecutando como root, en lugar de ir a través de la ruta del archivo, puede usar file $(sudo readlink -e /proc/1/exe) (PID 1 es init es probablemente más portátil que suponer nada sobre su ruta).

if file /sbin/init | fgrep 'ELF 64-bit' &>/dev/null; then 
    echo "64-bit" 
else 
    echo "not 64-bit" 
fi 
+0

El problema con este enfoque es que es posible usar ejecutables de 32 bits cuando se ejecuta un núcleo de 64 bits. – Job

+0

@Job Tienes razón, pero 'init' (PID 1) se ejecuta como el primer proceso, por lo que creo que sí determina la fragilidad del sistema como un todo. –

+0

Bueno, creo que técnicamente debería ser posible incluso para 'init' ser de 32 bits en un kernel de 64 bits, pero en cualquier sistema" normal "su enfoque debería estar bien, supongo. – Job

15

La pregunta es más bien: ¿qué piensas lograr sabiendo si tienes 32 o 64? ¿Cuáles son las consecuencias de estar en un entorno hipotético de 128 bits? ¿Y qué parte está siendo probada para N-bitness? Una CPU puede admitir la ejecución en modo de 64 bits, pero el entorno es de 32 bits. Además, el entorno en sí mismo puede ser un modo mixto; considere ejecutar un kernel de 64 bits con un espacio de usuario de 32 bits (hecho en un puñado de RISCs clásicos). Y luego, ¿qué pasa si el espacio de usuario no es de un formato homogéneo bitness/ejecutable? Es por eso que getconf LONG_BIT es igualmente inútil de usar, ya que depende de cómo se compiló.

$ /rt64/usr/bin/getconf LONG_BIT 
64 
$ /usr/bin/getconf LONG_BIT 
32 
$ file /usr/bin/getconf /rt64/usr/bin/getconf 
/usr/bin/getconf:  ELF 32-bit MSB executable, SPARC32PLUS, V8+ Required, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 
/rt64/usr/bin/getconf: ELF 64-bit MSB executable, SPARC V9, relaxed memory ordering, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped 
$ uname -m 
sparc64 
0

Depend lo que está buscando, no tengo máquina instalada en 32 bits en proc 64 bits, todos por encima de 32 bits volvería en mi caso

Pero si miro el hardware, en lshw Ubuntu (lshw -c cpu), la descripción de la CPU muestra claramente que tengo una CPU de 64 bits, así que podría haber instalado una versión de Ubuntu de 64 bits.

/proc/cpuinfo también es una buena fuente de información sobre el hardware, como las banderas lm representan el modo largo.

Que tengas un buen día. Jack.

Cuestiones relacionadas