Jak dowiedzieć się, jakiej wersji RHEL używam?

14

Pracuję w środowisku, w którym powoli przenosimy maszyny z Red Hat Enterprise Linux 5 na RHEL 6.

Potrzebuję niektórych moich skryptów, aby zrobić coś subtelnie innego na maszynach RHEL6 niż to, co jest obecnie wykonywane na maszynach RHEL5.

Pragmatycznym rozwiązaniem jest sprawdzenie w czasie wykonywania i uruchomienie niektórych poleceń na RHEL5, innych na RHEL6 i niektórych na obu.

Praktycznym przykładem tego jest to, że używamy modułów środowiska, a mój .bashrczawiera module load gitwiersz, ale na maszynach RHEL6 to polecenie powoduje błędy:

RHEL6 system, git should be installed - not loading module

Przeglądając plik modułu, znajduję następujący kod:

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

Wydaje się, że robi to, co chcę, ale liczyłem na coś krótszego.

Więc jaki jest najłatwiejszy sposób, aby powiedzieć RHEL5 z RHEL6 w skrypcie bash?

Idealnie powinien być solidny w różnych głównych wersjach, ale tolerować zmiany w mniejszych numerach wydań.

Mark Booth
źródło
nie lsb_releasedziała? ( -rpowinien podać ci tylko numer; spróbuj także -azobaczyć wszystko, co jest dostępne). Jeśli tak, to również między sprzedawcami.
derobert
Testuj funkcje, a nie platformy. Twój test platformy dzisiaj zakończy się, gdy RHEL7 wyjdzie, i może się przerwać, kiedy RHEL 6.następnie wyjdzie, być może dlatego, że przekazali funkcję EL5 do wersji 6.x, aby wyciszyć skargi na jej usunięcie. Tak więc, jeśli twój skrypt potrzebuje gitmodułu Bash, przed wywołaniem sprawdzasz, czy istnieje. Kiedy pojawi się / jeśli pojawi się później, wyniki czeku zmieniają się, więc nagle funkcja zaczyna działać, bez dodatkowego wysiłku.
Warren Young,
@WarrenYoung - Dzięki, ale nie jestem tu sysasminem, tylko użytkownikiem centralnie zarządzanego wdrożenia RHEL. Wszystkie nasze maszyny RHEL5 są zasadniczo tym samym obrazem, podobnie jak wszystkie maszyny RHEL6, więc dla mnie wystarczająca jest wiedza na temat głównej wersji. Biorąc pod uwagę, że jesteśmy dopiero na etapie planowania przejścia na RHEL6, myślę, że minie trochę czasu, zanim będziemy musieli się martwić o RHEL7. * 8 ')
Mark Booth
@derobert - Nie, na RHEL5 i 6 lsb_release -rzawiera także inny tekst, np Release: 5.8. Jak wyjaśnia Dennis Kaarsemaker , jeśli użyjesz lsb_release -rszamiast tego, otrzymasz tylko numer.
Mark Booth
Zobacz także serverfault.com/questions/89654/what-version-of-rhel-am-i-using - istnieje wskazówka dotycząca robienia tego z RPM, gdy lsb nie jest zainstalowany.
Dan Pritts,

Odpowiedzi:

10

Możesz także użyć lsb_releasepolecenia. Jeśli jesteś już pewien, że to RHEL, uzyskanie głównego numeru wersji to:

majversion=$(lsb_release -rs | cut -f1 -d.)
Dennis Kaarsemaker
źródło
Działa poprawnie na Centos i Redhat, zawiesza się w wydaniu Redhat Oracle Linux. Nie znaleziono lsb_release.
user959690
Ta odpowiedź wydaje się teraz nieaktualna. Znajduję tylko lsb_releasena moich maszynach RHEL / CentOS 5. Nigdzie nie można go znaleźć 6 lub 7.
Dale Anderson
Może być konieczne zainstalowanie pakietu redhat-lsb-core.
Dennis Kaarsemaker
15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

To byłby najprostszy sposób, jaki mogę wymyślić.

MelBurslan
źródło
Działa dla każdej odmiany CentOS i RHEL, które mam w moim ekwipunku od 5 do 7, w przeciwieństwie do tych, lsb_releasektóre wydają się działać tylko dla 5.
Dale Anderson
4

Posługiwać się rpm -q |grep redhat-release-server

/etc/redhat-releasePlik może być edytowany przez administratora chce zainstalować oprogramowanie innych firm bez wykonywania rzeczywistej uaktualnienie systemu operacyjnego.

BillMal
źródło
1
Miałeś na myśli rpm -qazamiast rpm -q? -qSamo użycie wymaga argumentu zapytania.
Dale Anderson
@Dale Anderson, dziękuję, to jedyny, który pracował dla mnie, na 7.4, i nie wiedziałem o tym, 7.4dopóki nie uruchomiłem tego z-qa
Brianem Thomasem
2

Możesz rozwinąć tę kwestię dla wielu dystrybucji Linuksa, używając /etc/issuepliku zamiast /etc/redhat-releasepliku.

Brian W.
źródło
2
major_version=$(rpm -q --queryformat '%{RELEASE}' rpm | grep -o [[:digit:]]*\$)

rpm -q --queryformat '%{RELEASE}' rpmdrukuje coś podobnego 25.el7. W takim razie wystarczy wziąć ostatnią cyfrę (cyfry). Testowane na RHEL 5,6,7 i Fedora 24.

Jak zauważyli inni, lsb-versionmoże nie zostać zainstalowany. Ponadto istnieje co najmniej jeden system RHEL5, który nie ma redhat-release-serverzainstalowanego pakietu.

użytkownik7610
źródło
dziękuję, należy to ocenić, ponieważ zawsze działa i dokładnie zwraca żądaną liczbę.
phiphi
1

Oto kolejny, bardziej precyzyjny sposób na uzyskanie tego wyniku. Pakiety jądra w RHEL zawierają ciąg „elN”, gdzie N reprezentuje główną wersję systemu operacyjnego. Dlatego można uruchomić następującą komendę, aby zidentyfikować wersję RHEL:

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

Zwróci to ciąg „el5”, „el6” lub „el7”, w zależności od pasującego ciągu na danym hoście.

Brād Axe
źródło
Używam mieszanki CentOS i RedHat, wersje 5-7, a odpowiedź faktycznie działa na wszystkich wersjach: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg
0

Skończyło się na tym, że użyłem odpowiedzi Jordana , ale dodałem własny zwrot.

Ponieważ nie chciałem mieć wszystkich moich poleceń rhel6 razem i wszystkich moich poleceń rhel5 razem, ale przeplatałem się we własnej sekcji i nie chciałem replikować tego kodu za każdym razem, gdy chciałem się przełączyć, zamiast tego zrobił to:

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

W ten sposób mogłem robić takie rzeczy jak:

# 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

itp.

Mark Booth
źródło
0

Wszystkie wymienione tu metody opierają się na plikach tekstowych i jako takie mogą wprowadzać w błąd. Ktoś z odpowiednim dostępem może zmienić zawartość / etc / redhat-release, / etc / issue itp., Nawet po prostu zaciemniając tę ​​informację. Bardziej niezawodna metoda polegałaby na znajomości wydań jądra zwykle dostarczanych przez Red Hat w każdej wersji RHEL:

  • RHEL4 używa jądra 2.6.9-X
  • RHEL5 używa jądra 2.6.18-X
  • RHEL6 używa jądra 2.6.32-X
  • RHEL7 używa jądra 3.10.0-X

niezmiennie do tej pory możesz dowiedzieć się, która wersja jądra jest uruchomiona uname -r. Możesz stać się bardziej elegancki, uruchamiając coś w stylu

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

Dałoby to konkretne informacje o jądrze, jak w powyższej tabeli. Możesz być w stanie doprowadzić równoległe do innych dystrybucji, jeśli konsekwentnie używają wydań jądra.

Brād Axe
źródło
2
-1. Administrator może równie łatwo zaktualizować jądro.
Oliver Gondža
0

RHEL 6 dodał plik / etc / system-release-cpe. Zawiera :rozdzielony ciąg, który może wyglądać podobnie

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

Teraz wystarczy pobrać pola 5 i 7 USD, aby uzyskać wersję RHEL i wariant 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 }')
użytkownik7610
źródło
0

Począwszy od RHEL 6, najbardziej zwięzłym sposobem byłoby:

cat /etc/system-release-cpe | cut -d ':' -f5
trinth
źródło
Jeśli cut -d: -f5 /etc/system-release-cpumiałoby to być „najbardziej zwięzłe”, zrobiłbyś to i unikał UUOC. Pytanie dotyczyło jednak przejścia z wersji RHEL 5 na 6. Jeśli to działa tylko od wersji RHEL 6, czy nie spełnia wymagań dotyczących pytania?
roaima