Wie finde ich heraus, welche RHEL-Version ich verwende?

14

Ich arbeite in einer Umgebung, in der wir langsam Maschinen von Red Hat Enterprise Linux 5 auf RHEL 6 umstellen.

Ich benötige einige meiner Skripte, um auf RHEL6-Maschinen etwas anderes zu tun als derzeit auf RHEL5-Maschinen.

Die pragmatische Lösung besteht darin, zur Laufzeit einige Befehle auf RHEL5, andere auf RHEL6 und einige auf beiden auszuführen.

Ein praktisches Beispiel hierfür ist, dass wir Umgebungsmodule verwenden und my .bashrceine module load gitZeile enthält, auf RHEL6-Computern jedoch die folgenden Befehlsfehler auftreten:

RHEL6 system, git should be installed - not loading module

Im Modulfile finde ich folgenden Code:

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

Dies scheint zu tun, was ich will, aber ich hatte auf etwas Kürzeres gehofft.

Was ist der einfachste Weg, RHEL5 von RHEL6 in einem Bash-Skript zu unterscheiden?

Idealerweise sollte es für verschiedene Hauptversionen robust sein, aber Abweichungen bei kleineren Versionsnummern tolerieren.

Mark Booth
quelle
tut lsb_releaseArbeit? ( -rsollte Ihnen nur die Nummer geben; versuchen Sie auch -a, alle verfügbaren zu sehen) Wenn ja, ist das auch herstellerübergreifend.
Derobert
Testen Sie auf Funktionen, nicht auf Plattformen. Ihr heutiger Plattformtest wird unterbrochen, wenn RHEL7 herauskommt, und wird möglicherweise vorher unterbrochen, wenn RHEL 6.next herauskommt, möglicherweise, weil eine EL5-Funktion auf 6.x weitergeleitet wird, um Beschwerden über das Entfernen zu unterdrücken. Wenn Ihr Skript ein gitBash-Modul benötigt, prüfen Sie, ob es vorhanden ist, bevor Sie es aufrufen. Wenn / falls es später erscheint, ändern sich die Ergebnisse Ihres Schecks, sodass die Funktion plötzlich ohne zusätzlichen Aufwand funktioniert.
Warren Young
@WarrenYoung - Danke, aber ich bin hier kein Sysasmin, sondern nur ein Benutzer einer zentral verwalteten RHEL-Bereitstellung. Alle unsere RHEL5-Maschinen haben im Wesentlichen dasselbe Image wie alle RHEL6-Maschinen. Für mich ist es also ausreichend, die Hauptrevision zu kennen. Da wir uns erst in der Planungsphase des Wechsels zu RHEL6 befinden, wird es wohl eine Weile dauern, bis wir uns um RHEL7 kümmern müssen. * 8 ')
Mark Booth
@derobert - Nein, RHEL5 & 6 lsb_release -renthalten auch anderen Text, z Release: 5.8. Wie Dennis Kaarsemaker jedoch erklärtlsb_release -rs , erhalten Sie nur die Nummer , wenn Sie stattdessen verwenden.
Mark Booth
Siehe auch serverfault.com/questions/89654/what-version-of-rhel-am-i-using - es gibt einen Tipp, wie man es mit RPM macht, wenn lsb nicht installiert ist.
Dan Pritts

Antworten:

10

Sie können auch den lsb_releaseBefehl verwenden. Wenn Sie bereits sicher sind, dass es sich um RHEL handelt, lautet die Hauptversionsnummer:

majversion=$(lsb_release -rs | cut -f1 -d.)
Dennis Kaarsemaker
quelle
Funktioniert mit Centos und Redhat, schlägt mit der Oracle Linux-Version von Redhat fehl. lsb_release nicht gefunden.
user959690
Diese Antwort scheint jetzt veraltet zu sein. Ich finde nur lsb_releaseauf meinen RHEL / CentOS 5 Maschinen. Es ist nirgendwo zu finden am 6. oder 7.
Dale Anderson
Möglicherweise müssen Sie das Paket redhat-lsb-core installieren.
Dennis Kaarsemaker
15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Dies wäre der einfachste Weg, den ich mir vorstellen kann.

MelBurslan
quelle
Arbeitet für jede Variation von CentOS und RHEL i von 5 bis 7 in meinem Inventar habe, im Gegensatz zu lsb_releasedem nur an der Arbeit scheint für 5.
Dale Anderson
4

Verwenden rpm -q |grep redhat-release-server

Die /etc/redhat-releaseDatei könnte von einem Administrator bearbeitet worden sein, der versucht, Software von Drittanbietern zu installieren, ohne ein tatsächliches Betriebssystem-Upgrade durchzuführen.

BillMal
quelle
1
Meinten Sie rpm -qastatt rpm -q? Für die Verwendung ist -qein Abfrageargument erforderlich.
Dale Anderson
@ Dale Anderson, danke, dies ist die einzige, die für mich funktioniert hat, am 7.4., Und ich wusste es nicht, 7.4bis ich das mit-qa
Brian Thomas
2

Sie können dies für mehrere Linux-Distributionen erweitern, indem Sie die /etc/issueDatei anstelle der /etc/redhat-releaseDatei verwenden.

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

rpm -q --queryformat '%{RELEASE}' rpmdruckt so etwas wie 25.el7. Dann geht es nur noch darum, die letzte (n) Ziffer (n) zu nehmen. Getestet auf RHELs 5,6,7 und Fedora 24.

Wie bereits erwähnt, lsb-versiondarf nicht installiert werden. Zusätzlich gibt es mindestens ein RHEL5-System, auf dem das redhat-release-serverPaket nicht installiert ist.

user7610
quelle
danke, das sollte upvoted werden, da es immer funktioniert und genau die gewünschte nummer zurückgibt.
Phiphi
1

Hier ist ein weiterer, genauerer Weg, um dieses Ergebnis zu erzielen. In den Kernelpaketen von RHEL ist die Zeichenfolge 'elN' enthalten, wobei N die Hauptversion des Betriebssystems darstellen würde. So könnte man den folgenden Befehl ausführen, um die Version von RHEL zu identifizieren:

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

Dies würde eine Zeichenfolge "el5", "el6" oder "el7" zurückgeben, abhängig von der übereinstimmenden Zeichenfolge auf dem angegebenen Host.

Brād Axe
quelle
Ich verwende eine Mischung aus CentOS und RedHat, Version 5-7, und die Antwort funktioniert tatsächlich auf allen Versionen: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg
0

Am Ende habe ich Jordanms Antwort verwendet, aber eine eigene Wendung hinzugefügt.

Weil ich nicht alle meine rhel6-Befehle und alle meine rhel5-Befehle zusammen haben wollte, sondern mich innerhalb eines eigenen Abschnitts verschachtelte, und ich wollte diesen Code nicht jedes Mal replizieren müssen, wenn ich wechseln wollte, sondern ich Tat dies:

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

Auf diese Weise könnte ich Dinge tun wie:

# 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
quelle
0

Alle hier genannten Methoden basieren auf Textdateien und können daher irreführend sein. Jemand mit dem richtigen Zugriff kann den Inhalt von / etc / redhat-release, / etc / issue usw. ändern, um diese Informationen nur zu verschleiern. Eine zuverlässigere Methode wäre, die Kernel-Releases zu kennen, die normalerweise von Red Hat für jede RHEL-Version bereitgestellt werden:

  • RHEL4 verwendet den Kernel 2.6.9-X
  • RHEL5 verwendet den Kernel 2.6.18-X
  • RHEL6 verwendet den Kernel 2.6.32-X
  • RHEL7 verwendet den Kernel 3.10.0-X

Bisher können Sie die aktuelle Kernel-Version immer durch Ausführen von ermitteln uname -r. Sie werden vielleicht schicker, wenn Sie etwas nach dem Vorbild von ausführen

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

Dies würde die spezifischen Informationen über den Kernel liefern, wie in der obigen Tabelle. Sie können möglicherweise Parallelen zu anderen Distributionen herstellen, wenn diese durchgängig Kernel-Releases verwenden.

Brād Axe
quelle
2
-1. Der Administrator kann genauso einfach entscheiden, den Kernel zu aktualisieren.
Oliver Gondža,
0

RHEL 6 hat die Datei / etc / system-release-cpe hinzugefügt. Dieser enthält eine durch :Trennzeichen getrennte Zeichenfolge, die ungefähr so ​​aussehen kann

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

Jetzt genügt es, die Felder $ 5 und $ 7 zu ziehen, um die RHEL-Version und die RHEL-Variante zu erhalten.

# 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
quelle
0

Ab RHEL 6 wäre der prägnanteste Weg:

cat /etc/system-release-cpe | cut -d ':' -f5
trinth
quelle
Wenn das "am präzisesten" wäre, würden Sie cut -d: -f5 /etc/system-release-cpudie UUOC meiden. Die Frage lautete jedoch, ob der Wechsel von RHEL 5 zu 6 erfolgen soll. Wenn dies erst ab RHEL 6 funktioniert, werden die Fragenanforderungen dann nicht nicht nicht erfüllt?
Roaima