¿Cómo averiguar qué versión de RHEL estoy usando?

14

Trabajo en un entorno en el que estamos haciendo una transición lenta de máquinas de Red Hat Enterprise Linux 5 a RHEL 6.

Necesito algunos de mis scripts para hacer algo sutilmente diferente en las máquinas RHEL6 a lo que se está haciendo actualmente en las máquinas RHEL5.

La solución pragmática es verificar en tiempo de ejecución y ejecutar algunos comandos en RHEL5, otros en RHEL6 y algunos en ambos.

Un ejemplo práctico de esto es que estamos usando módulos de entorno y mi .bashrcincluye una module load gitlínea, pero en las máquinas RHEL6, este error de comando:

RHEL6 system, git should be installed - not loading module

Buscando en el archivo de módulo encuentro el siguiente código:

set redhatrelease [eval exec "cat /etc/redhat-release"]
if { [regexp -nocase {release 6} $redhatrelease] } {
  puts stderr "\n\t RHEL6 system, git should be installed - not loading module\n"
} else {
  ...
}

Esto parece hacer lo que quiero, pero esperaba algo más corto.

Entonces, ¿cuál es la forma más fácil de distinguir RHEL5 de RHEL6 en un script bash?

Idealmente, debería ser robusto en las diferentes versiones principales, pero tolerar las variaciones en los números de versiones menores.

Mark Booth
fuente
hace lsb_releaseel trabajo? ( -rdebería darte solo el número; intenta también -aver todo lo que esté disponible) Si es así, también es un proveedor cruzado.
derobert
Prueba de características, no de plataformas. Su prueba de plataforma de hoy se interrumpirá cuando salga RHEL7, y puede que se rompa antes de eso cuando salga RHEL 6.siguiente, tal vez porque reenviaron una función EL5 a 6.x para silenciar las quejas sobre su eliminación. Entonces, si su script necesita un gitmódulo Bash, verifique si existe antes de llamarlo. Cuando / si aparece más tarde, los resultados de su verificación cambian, por lo que de repente la función comienza a funcionar, sin ningún esfuerzo adicional.
Warren Young el
@WarrenYoung - Gracias, pero no soy un administrador de sistemas aquí, solo un usuario de una implementación de RHEL administrada centralmente. Todas nuestras máquinas RHEL5 son esencialmente la misma imagen, lo mismo que todas las máquinas RHEL6, por lo que para mí saber que la revisión principal es suficiente. Dado que solo estamos en las etapas de planificación para pasar a RHEL6 ahora, creo que pasará un tiempo antes de que tengamos que preocuparnos por RHEL7. * 8 ')
Mark Booth
@derobert - No, en RHEL5 y 6 también lsb_release -rincluye otro texto, por ejemplo Release: 5.8. Como Dennis Kaarsemaker explica , sin embargo, si se utiliza lsb_release -rsen su lugar, se obtiene sólo el número.
Mark Booth
Consulte también serverfault.com/questions/89654/what-version-of-rhel-am-i-using : hay un consejo para hacerlo con RPM cuando lsb no está instalado.
Dan Pritts

Respuestas:

10

También puedes usar el lsb_releasecomando. Si ya está seguro de que es RHEL, obtener el número de versión principal es:

majversion=$(lsb_release -rs | cut -f1 -d.)
Dennis Kaarsemaker
fuente
Funciona en Centos y Redhat propiamente dicho, falla en la versión Oracle Linux de Redhat. lsb_release no encontrado.
user959690
Esta respuesta parece anticuada ahora. Solo encuentro lsb_releaseen mis máquinas RHEL / CentOS 5. No se encuentra en ninguna parte el 6 o 7.
Dale Anderson
Es posible que deba instalar el paquete redhat-lsb-core.
Dennis Kaarsemaker
15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Esta sería la forma más simple en que puedo pensar.

MelBurslan
fuente
Funciona para cada variación de CentOS y RHEL que tengo en mi inventario del 5 al 7, a diferencia de lo lsb_releaseque parece funcionar solo para 5.
Dale Anderson
4

Utilizar rpm -q |grep redhat-release-server

El /etc/redhat-releasearchivo podría haber sido editado por un administrador que busca instalar software de terceros sin realizar una actualización real del sistema operativo.

BillMal
fuente
1
¿Quiso decir en rpm -qalugar de rpm -q? El uso -qpor sí solo requiere un argumento de consulta.
Dale Anderson
@Dale Anderson, gracias, este es el único que funcionó para mí, en 7.4, y no lo sabía 7.4hasta que corrí con esto-qa
Brian Thomas
2

Puede ampliar esto para múltiples distribuciones de Linux utilizando el /etc/issuearchivo en lugar del /etc/redhat-releasearchivo.

Brian W
fuente
2
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)

rpm -q --queryformat '%{RELEASE}' rpmimprime algo así 25.el7. Entonces es solo cuestión de tomar los últimos dígitos. Probado en RHELs 5,6,7 y Fedora 24.

Como otros señalaron, lsb-versionno se puede instalar. Además, hay al menos un sistema RHEL5 que no tiene el redhat-release-serverpaquete instalado.

user7610
fuente
gracias, esto debería ser votado, ya que siempre funciona y devuelve exactamente el número deseado.
phiphi
1

Aquí hay otra forma más precisa de obtener este resultado. Los paquetes del kernel en RHEL tienen la cadena 'elN' incluida, donde N representaría la versión principal del sistema operativo. Por lo tanto, se podría ejecutar el siguiente comando para identificar la versión de RHEL:

# uname -r | sed 's/^.*\(el[0-9]\+\).*$/\1/'

Esto devolvería una cadena, "el5", "el6" o "el7", dependiendo de la cadena coincidente en el host dado.

Brād Axe
fuente
Estoy usando una combinación de CentOS y RedHat, versiones 5-7, y la respuesta realmente funciona en todas las versiones: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg
0

Terminé usando la respuesta de Jordan , pero añadiendo un giro propio.

Debido a que no quería tener todos mis comandos rhel6 juntos y todos mis comandos rhel5 juntos, pero intercalado dentro de su propia sección, y no quería tener que replicar este código cada vez que deseaba cambiar, en su lugar hice esto:

if   grep -q -i "release 6" /etc/redhat-release ; then
  rhel6only=1
elif grep -q -i "release 5" /etc/redhat-release ; then
  rhel5only=1
else
  echo "Running neither RHEL6.x nor RHEL 5.x !"
fi

De esa manera, podría hacer cosas como:

# JDK
[ $rhel5only ] && module load java/6
[ $rhel6only ] && module load java/7

# Eclipse
module load eclipse

# Python
[ $rhel5only ] && module load python/2
[ $rhel6only ] && module load python/3

etc.

Mark Booth
fuente
0

Todos los métodos mencionados aquí se basan en archivos de texto, y como tal podrían ser engañosos. Alguien con el acceso correcto puede cambiar el contenido de / etc / redhat-release, / etc / issue, etc. incluso para ofuscar esta información. Un método más confiable implicaría conocer las versiones del kernel que generalmente proporciona Red Hat en cada versión de RHEL:

  • RHEL4 usa el kernel 2.6.9-X
  • RHEL5 usa el kernel 2.6.18-X
  • RHEL6 usa el kernel 2.6.32-X
  • RHEL7 usa el kernel 3.10.0-X

invariablemente hasta ahora, puede encontrar la versión del kernel en ejecución ejecutando uname -r. Puede ser más elegante ejecutando algo en la línea de

uname -r | awk -F- '{print $1}'

Esto daría la información específica sobre el núcleo, como en la tabla anterior. Es posible que pueda manejar paralelos con otras distribuciones, si usan constantemente versiones de kernel.

Brād Axe
fuente
2
-1. El administrador puede decidir actualizar el kernel con la misma facilidad.
Oliver Gondža
0

RHEL 6 ha agregado el archivo / etc / system-release-cpe. Contiene una :cadena separada que puede verse como

# cat /etc/system-release-cpe
cpe:/o:redhat:enterprise_linux:6computenode:ga:computenode

Ahora es suficiente extraer los campos $ 5 y $ 7 para obtener la versión RHEL y la variante RHEL.

# will be 7 or 6, does not work for 5 as file is missing there
RHEL_VERSION_MAJOR=$(cat /etc/system-release-cpe | awk -F: '{ print $5 }' | grep -o ^[0-9]*)
RHEL_VARIANT=$(cat /etc/system-release-cpe | awk -F: '{ print $7 }')
user7610
fuente
0

A partir de RHEL 6, la forma más concisa sería:

cat /etc/system-release-cpe | cut -d ':' -f5
noveno
fuente
Si eso fuera "más conciso", lo haría cut -d: -f5 /etc/system-release-cpuy evitaría el UUOC. Sin embargo, la pregunta era acerca de la transición de RHEL 5 a 6. Si esto solo funciona desde RHEL 6 en adelante, ¿no falla en satisfacer los requisitos de la pregunta?
roaima