Come scoprire quale versione di RHEL sto usando?


14

Lavoro in un ambiente in cui stiamo lentamente spostando le macchine da Red Hat Enterprise Linux 5 a RHEL 6.

Ho bisogno di alcuni dei miei script per fare qualcosa di leggermente diverso sulle macchine RHEL6 rispetto a quello che si sta attualmente facendo sulle macchine RHEL5.

La soluzione pragmatica è quella di verificare in fase di esecuzione ed eseguire alcuni comandi su RHEL5, altri su RHEL6 e alcuni su entrambi.

Un esempio pratico di ciò è che stiamo usando i moduli di ambiente e my .bashrcinclude una module load gitlinea, ma su macchine RHEL6 questo errore di comando:

RHEL6 system, git should be installed - not loading module

Guardando nel file modulo trovo il seguente codice:

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 {
  ...
}

Questo sembra fare quello che voglio, ma speravo in qualcosa di più corto.

Quindi, qual è il modo più semplice per dire RHEL5 da RHEL6 in uno script bash?

Idealmente, dovrebbe essere robusto tra le diverse versioni principali, ma essere tollerante alle variazioni nei numeri di versione minori.


fa lsb_releaseil lavoro? ( -rdovrebbe darti solo il numero; prova anche -aa vedere tutto disponibile) In tal caso, è anche cross-vendor.
derobert,

Verifica funzionalità, non piattaforme. Il test della piattaforma oggi si interromperà quando uscirà RHEL7 e potrebbe interrompersi prima che RHEL 6.next esca, forse perché hanno inoltrato una funzionalità EL5 a 6.x per mettere a tacere i reclami sulla sua rimozione. Quindi, se il tuo script ha bisogno di un gitmodulo Bash, controlli se esiste prima di chiamarlo. Quando / se appare più tardi, i risultati del tuo controllo cambiano, quindi all'improvviso la funzione inizia a funzionare, senza alcuno sforzo aggiuntivo.
Warren Young,

@WarrenYoung - Grazie, ma non sono un amministratore di sistema qui, solo un utente di una distribuzione RHEL gestita centralmente. Tutte le nostre macchine RHEL5 sono essenzialmente la stessa immagine, idem tutte le macchine RHEL6, quindi per me sapere che la revisione principale è sufficiente. Dato che ora siamo solo nelle fasi di pianificazione del passaggio a RHEL6, penso che passerà un po 'di tempo prima che dobbiamo preoccuparci di RHEL7. * 8 ')
Mark Booth,

@derobert - No, su RHEL5 e 6 lsb_release -rinclude anche altro testo, ad es Release: 5.8. Come spiega Dennis Kaarsemaker , se si utilizza lsb_release -rsinvece si ottiene solo il numero.
Mark Booth,

Vedi anche serverfault.com/questions/89654/what-version-of-rhel-am-i-using - c'è un suggerimento per farlo con RPM quando lsb non è installato.
Dan Pritts,

Risposte:


10

Puoi anche usare il lsb_releasecomando. Se sei già sicuro che sia RHEL, ottenere il numero di versione principale è:

majversion=$(lsb_release -rs | cut -f1 -d.)

Funziona su Centos e Redhat in modo corretto, non riesce su Oracle Linux versione di Redhat. lsb_release non trovato.
user959690,

Questa risposta sembra obsoleta ora. Trovo solo lsb_releasesulle mie macchine RHEL / CentOS 5. Non si trova da nessuna parte il 6 o 7.
Dale Anderson,

Potrebbe essere necessario installare il pacchetto redhat-lsb-core.
Dennis Kaarsemaker,

15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Questo sarebbe il modo più semplice che mi viene in mente.


Funziona per ogni variazione di CentOS e RHEL che ho nel mio inventario dal 5 al 7, a differenza di quello lsb_releaseche sembra funzionare solo per 5.
Dale Anderson

4

Uso rpm -q |grep redhat-release-server

Il /etc/redhat-releasefile potrebbe essere stato modificato da un amministratore che cerca di installare software di terze parti senza eseguire un effettivo aggiornamento del sistema operativo.


1
Intendevi rpm -qainvece di rpm -q? L'uso -qda solo richiede un argomento di query.
Dale Anderson,

@Dale Anderson, grazie, questo è l'unico che ha funzionato per me, il 7.4, e non lo sapevo come 7.4fino a quando non ho corso con questo-qa
Brian Thomas,

2

Puoi espanderlo su più distro Linux usando il /etc/issuefile anziché il /etc/redhat-releasefile.


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

rpm -q --queryformat '%{RELEASE}' rpmstampa qualcosa di simile 25.el7. Quindi si tratta solo di prendere le ultime cifre. Testato su RHEL 5,6,7 e Fedora 24.

Come altri hanno sottolineato, lsb-versionpotrebbe non essere installato. Inoltre, esiste almeno un sistema RHEL5 su cui non è redhat-release-serverinstallato il pacchetto.


grazie, questo dovrebbe essere votato perché funziona sempre e restituisce esattamente il numero desiderato.
phiphi,

1

Ecco un altro modo più preciso per ottenere questo risultato. I pacchetti del kernel in RHEL hanno la stringa 'elN' inclusa, dove N rappresenterebbe la versione principale del sistema operativo. Pertanto, è possibile eseguire il comando seguente per identificare la versione di RHEL:

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

Ciò restituirebbe una stringa, "el5", "el6" o "el7", a seconda della stringa corrispondente sull'host specificato.


Sto usando un mix di CentOS e RedHat, versioni 5-7, e la risposta funziona davvero su tutte le versioni: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg

0

Ho finito per usare la risposta di Jordan , ma aggiungendo un tocco personale.

Perché non volevo avere tutti i miei comandi rhel6 insieme e tutti i miei comandi rhel5 insieme, ma interleaved all'interno della loro sezione, e non volevo replicare questo codice ogni volta che volevo cambiare, invece fatto:

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

In questo modo, potrei fare cose come:

# 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

eccetera.



0

Tutti i metodi qui menzionati si basano su file di testo e come tali potrebbero essere fuorvianti. Qualcuno con il giusto accesso può cambiare il contenuto di / etc / redhat-release, / etc / issue, ecc. Anche solo per offuscare queste informazioni. Un metodo più affidabile implicherebbe la conoscenza delle versioni del kernel normalmente fornite da Red Hat su ogni versione di RHEL:

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

invariabilmente fino ad ora, puoi scoprire la versione del kernel in esecuzione eseguendo uname -r. Puoi diventare più fantasioso eseguendo qualcosa sulla falsariga di

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

Questo darebbe le informazioni specifiche sul kernel, come nella tabella sopra. Potresti essere in grado di guidare parallelismi con altre distribuzioni, se usano costantemente versioni del kernel.


2
-1. L'amministratore può decidere di aggiornare il kernel altrettanto facilmente.
Oliver Gondža,

0

RHEL 6 ha aggiunto il file / etc / system-release-cpe. Questo contiene una :stringa separata che potrebbe assomigliare a qualcosa

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

Ora è sufficiente estrarre i campi $ 5 e $ 7 per ottenere la versione RHEL e 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 }')

0

A partire da RHEL 6, il modo più conciso sarebbe:

cat /etc/system-release-cpe | cut -d ':' -f5

Se quello fosse "il più conciso" lo faresti cut -d: -f5 /etc/system-release-cpued eviterai l'UUOC. Tuttavia, la domanda si poneva sulla transizione da RHEL 5 a 6. Se questo funziona solo da RHEL 6 in poi, non riesce a soddisfare i requisiti della domanda?
roaima,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.