Comment savoir quelle version de RHEL j'utilise?

14

Je travaille dans un environnement où nous effectuons une transition lente des machines de Red Hat Enterprise Linux 5 vers RHEL 6.

J'ai besoin de certains de mes scripts pour faire quelque chose de subtilement différent sur les machines RHEL6 de ce qui se fait actuellement sur les machines RHEL5.

La solution pragmatique consiste à vérifier au moment de l'exécution et à exécuter certaines commandes sur RHEL5, d'autres sur RHEL6 et certaines sur les deux.

Un exemple pratique de ceci est que nous utilisons des modules d'environnement et my .bashrcinclut une module load gitligne, mais sur les machines RHEL6, cette erreur de commande:

RHEL6 system, git should be installed - not loading module

En regardant dans le module, je trouve le code suivant:

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

Cela semble faire ce que je veux, mais j'espérais quelque chose de plus court.

Alors, quelle est la façon la plus simple de distinguer RHEL5 de RHEL6 dans un script bash?

Idéalement, il devrait être robuste sur différentes versions principales, mais être tolérant aux variations des numéros de version mineurs.

Mark Booth
la source
ça lsb_releasemarche? ( -rdevrait vous donner juste le numéro; essayez également -ade voir tout ce qui est disponible). Si c'est le cas, il s'agit également de fournisseurs croisés.
derobert
Testez les fonctionnalités, pas les plates-formes. Votre test de plate-forme aujourd'hui se cassera lorsque RHEL7 sortira, et peut se casser avant cela quand RHEL 6.next sort, peut-être parce qu'ils transfèrent une fonctionnalité EL5 vers 6.x pour faire taire les plaintes concernant sa suppression. Donc, si votre script a besoin d'un gitmodule Bash, vous vérifiez s'il existe avant de l'appeler. Quand / s'il apparaît plus tard, les résultats de votre vérification changent, donc soudainement la fonctionnalité commence à fonctionner, sans effort supplémentaire.
Warren Young
@WarrenYoung - Merci, mais je ne suis pas un sysasmin ici, juste un utilisateur d'un déploiement RHEL géré de manière centralisée. Toutes nos machines RHEL5 sont essentiellement la même image, idem pour toutes les machines RHEL6, donc pour moi, savoir que la révision majeure est suffisante. Étant donné que nous ne sommes actuellement qu'au stade de la planification du passage à RHEL6, je pense qu'il faudra un certain temps avant de nous inquiéter de RHEL7. * 8 ')
Mark Booth
@derobert - Non, sur RHEL5 & 6 lsb_release -rcomprend également d'autres textes, par exemple Release: 5.8. Comme l' explique Dennis Kaarsemaker , si vous utilisez à la lsb_release -rsplace, vous obtenez juste le numéro.
Mark Booth
Voir aussi serverfault.com/questions/89654/what-version-of-rhel-am-i-using - il y a une astuce pour le faire avec RPM lorsque lsb n'est pas installé.
Dan Pritts

Réponses:

10

Vous pouvez également utiliser la lsb_releasecommande. Si vous êtes déjà certain que c'est RHEL, obtenir le numéro de version principal est:

majversion=$(lsb_release -rs | cut -f1 -d.)
Dennis Kaarsemaker
la source
Fonctionne sur Centos et Redhat, échoue sur la version Oracle Linux de Redhat. lsb_release introuvable.
user959690
Cette réponse semble désormais dépassée. Je ne trouve que lsb_releasesur mes machines RHEL / CentOS 5. Il est introuvable le 6 ou le 7
Dale Anderson
Vous devrez peut-être installer le package redhat-lsb-core.
Dennis Kaarsemaker
15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Ce serait la façon la plus simple à laquelle je peux penser.

MelBurslan
la source
Fonctionne pour chaque variation de CentOS et RHEL que j'ai dans mon inventaire de 5 à 7, contrairement à lsb_releasece qui ne semble fonctionner que pour 5.
Dale Anderson
4

Utilisation rpm -q |grep redhat-release-server

Le /etc/redhat-releasefichier aurait pu être modifié par un administrateur cherchant à installer un logiciel tiers sans effectuer une mise à niveau du système d'exploitation réelle.

BillMal
la source
1
Voulez-vous dire rpm -qaau lieu de rpm -q? L'utilisation -qseule nécessite un argument de requête.
Dale Anderson
@Dale Anderson, merci, c'est le seul qui a fonctionné pour moi, sur 7.4, et je ne le savais pas tant 7.4que je n'ai pas couru avec-qa
Brian Thomas
2

Vous pouvez développer cela pour plusieurs distributions Linux en utilisant le /etc/issuefichier au lieu du /etc/redhat-releasefichier.

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

rpm -q --queryformat '%{RELEASE}' rpm imprime quelque chose comme 25.el7 . Il suffit ensuite de prendre le (s) dernier (s) chiffre (s). Testé sur RHEL 5,6,7 et Fedora 24.

Comme d'autres l'ont souligné, lsb-versionpeut ne pas être installé. En outre, il existe au moins un système RHEL5 sur lequel le redhat-release-serverpackage n'est pas installé.

user7610
la source
merci, cela devrait être surévalué, car cela fonctionne toujours et renvoie exactement le nombre souhaité.
phiphi
1

Voici une autre façon, plus précise, d'obtenir ce résultat. Les paquets du noyau dans RHEL ont la chaîne 'elN' incluse, où N représenterait la version principale du système d'exploitation. Ainsi, on pourrait exécuter la commande suivante pour identifier la version de RHEL:

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

Cela retournerait une chaîne, "el5", "el6" ou "el7", selon la chaîne correspondante sur l'hôte donné.

Hache de Brād
la source
J'utilise un mélange de CentOS et RedHat, versions 5-7, et la réponse fonctionne réellement sur toutes les versions: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg
0

J'ai fini par utiliser la réponse de Jordan , mais en ajoutant ma propre touche.

Parce que je ne voulais pas avoir toutes mes commandes rhel6 ensemble et toutes mes commandes rhel5 ensemble, mais entrelacées dans leur propre section, et je ne voulais pas avoir à répliquer ce code chaque fois que je souhaitais changer, au lieu de cela, je a fait ceci:

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 cette façon, je pourrais faire des choses comme:

# 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
la source
0

Toutes les méthodes mentionnées ici reposent sur des fichiers texte et, en tant que telles, peuvent être trompeuses. Quelqu'un avec le bon accès peut changer le contenu de / etc / redhat-release, / etc / issue, etc. même pour simplement obscurcir ces informations. Une méthode plus fiable impliquerait de connaître les versions du noyau généralement fournies par Red Hat sur chaque version de RHEL:

  • RHEL4 utilise le noyau 2.6.9-X
  • RHEL5 utilise le noyau 2.6.18-X
  • RHEL6 utilise le noyau 2.6.32-X
  • RHEL7 utilise le noyau 3.10.0-X

invariablement jusqu'à présent, vous pouvez découvrir la version du noyau en cours d'exécution en exécutant uname -r. Vous pouvez devenir plus chic en exécutant quelque chose le long des lignes de

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

Cela donnerait les informations spécifiques sur le noyau, comme dans le tableau ci-dessus. Vous pourriez être en mesure de générer des parallèles avec d'autres distributions, si elles utilisent systématiquement les versions du noyau.

Hache de Brād
la source
2
-1. L'administrateur peut décider de mettre à jour le noyau tout aussi facilement.
Oliver Gondža
0

RHEL 6 a ajouté le fichier / etc / system-release-cpe. Il contient une :chaîne séparée qui peut ressembler à quelque chose

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

Maintenant, il suffit de tirer les champs $ 5 et $ 7 pour obtenir la version RHEL et 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
la source
0

À partir de RHEL 6, la manière la plus concise serait:

cat /etc/system-release-cpe | cut -d ':' -f5
trinth
la source
Si cela devait être "le plus concis", vous feriez cut -d: -f5 /etc/system-release-cpuet évitez l'UUOC. Cependant, la question portait sur la transition de RHEL 5 à 6. Si cela ne fonctionne qu'à partir de RHEL 6, cela ne satisfait-il pas aux exigences de la question?
roaima