Як дізнатися, яку версію RHEL я використовую?


14

Я працюю в середовищі, коли ми повільно переходимо на машини з Red Hat Enterprise Linux 5 на RHEL 6.

Мені потрібні декілька моїх сценаріїв, щоб зробити щось тонко відмінне на машинах RHEL6 від того, що зараз робиться на машинах RHEL5.

Прагматичне рішення полягає в тому, щоб перевірити час виконання та запустити деякі команди на RHEL5, інші на RHEL6 та деякі з обох.

Практичним прикладом цього є те, що ми використовуємо модулі середовища, і мій .bashrcвключає module load gitрядок, але на машинах RHEL6 ця команда помилки:

RHEL6 system, git should be installed - not loading module

Дивлячись у файл модуля, я знаходжу такий код:

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

Це, здається, робить те, що я хочу, але я сподівався на щось коротше.

Отже, який найпростіший спосіб сказати RHEL5 від RHEL6 у сценарії bash?

В ідеалі він повинен бути надійним для різних основних версій, але бути толерантним до змін незначної кількості релізів.


робить lsb_releaseроботу? ( -rслід вказати лише номер; спробуйте також -aпереглянути все, що є в наявності) Якщо це так, це також перехресний постачальник.
дероберт

Тест на функції, а не платформи. Тест вашої платформи сьогодні зламається, коли RHEL7 вийде, і може зламатися до цього, коли з'явиться RHEL 6.next, можливо, тому, що вони перенесли функцію EL5 до 6.x, щоб заглушити скарги на її видалення. Отже, якщо вашому сценарію потрібен gitмодуль Bash, ви перевіряєте, чи існує він, перш ніж викликати його. Коли / якщо вона з’явиться пізніше, результати вашої перевірки змінюються, тому раптом функція почне працювати без зайвих зусиль.
Воррен Янг

@WarrenYoung - Дякую, але я тут не систематик, а лише користувач центрального управління RHEL. Усі наші машини RHEL5 по суті є однаковими зображеннями, як і для всіх машин RHEL6, тому для мене, знаючи, основна редакція є достатньою. З огляду на те, що зараз ми перебуваємо лише на етапах планування переходу до RHEL6, я думаю, пройде ще якийсь час, перш ніж нам доведеться турбуватися про RHEL7. * 8 ')
Марк Бут

@derobert - Ні, в RHEL5 & 6 також lsb_release -rвходить інший текст, наприклад Release: 5.8. Як пояснює Денніс Каарсемейкер , якщо ви скористаєтесь lsb_release -rsнатомість, ви отримаєте просто число.
Марк Бут

Дивіться також serverfault.com/questions/89654/what-version-of-rhel-am-i-using - є порада зробити це з RPM, коли lsb не встановлений.
Dan Pritts

Відповіді:


10

Ви також можете використовувати lsb_releaseкоманду. Якщо ви вже впевнені, що RHEL, основний номер версії:

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

Працює над Centos і Redhat належним чином, не вдається при випуску Redhat Oracle Linux. lsb_release не знайдено.
user959690

Ця відповідь здається застарілою. Я знаходжу лише lsb_releaseна своїх машинах RHEL / CentOS 5. Його ніде не можна знайти 6 або 7.
Дейл Андерсон

Можливо, вам доведеться встановити пакет Redhat-lsb-core.
Денніс Каарсемейкер

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

Це був би найпростіший спосіб, про який я можу придумати.


Працює для кожної модифікації CentOS та RHEL у мене в інвентарі від 5 до 7, на відміну від lsb_releaseяких, здається, працює лише для 5.
Дейл Андерсон

4

Використовуйте rpm -q |grep redhat-release-server

/etc/redhat-releaseФайл може бути відредагований з допомогою адміністратора , дивлячись встановити програмне забезпечення сторонніх виробників без виконання фактичного оновлення операційної системи.


1
Ви мали на увазі rpm -qaзамість rpm -q? Використання -qсаме по собі вимагає аргументу запиту.
Дейл Андерсон

@Dale Anderson, дякую, це єдиний, хто працював на мене, 7.4, і я цього не знав, 7.4поки я не запускав це-qa
Брайан Томас

2

Ви можете розширити це для кількох дистрибутивів Linux, використовуючи /etc/issueфайл замість /etc/redhat-releaseфайлу.


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

rpm -q --queryformat '%{RELEASE}' rpmдрукує щось подібне 25.el7. Тоді важливо взяти останню цифру. Тестували на RHEL 5,6,7 та Fedora 24.

Як вказували інші, lsb-versionйого не можна встановлювати. Крім того, існує принаймні одна система RHEL5, на якій не встановлено redhat-release-serverпакет.


спасибі, це слід підвищити, оскільки це завжди працює і точно повертає потрібне число.
phiphi

1

Ось ще один, більш точний спосіб отримати цей результат. Пакети ядра в RHEL містять рядок 'elN', де N буде представляти основну версію ОС. Таким чином, для ідентифікації версії RHEL можна виконати таку команду:

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

Це поверне рядок "el5", "el6" або "el7", залежно від відповідного рядка для даного хоста.


Я використовую суміш CentOS і RedHat, версії 5-7, і відповідь насправді працює на всіх версіях: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg

0

Я в кінцевому підсумку скористався відповіддю Джордана , але додав свого власного повороту.

Тому що я не хотів, щоб усі мої rhel6 команди були разом, і всі мої rhel5 команди разом, але переплетені у їхньому власному розділі, і мені не хотілося повторювати цей код кожного разу, коли я чекав переключення, замість цього я зробив це:

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

Таким чином я міг би робити такі речі, як:

# 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

тощо.



0

Усі згадані тут методи покладаються на текстові файли, і як такі можуть бути оманливими. Хтось із правильним доступом може змінити вміст / etc / redhat-release, / etc / issue тощо, навіть просто опромінити цю інформацію. Більш надійний метод передбачає знання випусків ядра, які зазвичай надаються Red Hat для кожної версії RHEL:

  • RHEL4 використовує ядро ​​2.6.9-X
  • RHEL5 використовує ядро ​​2.6.18-X
  • RHEL6 використовує ядро ​​2.6.32-X
  • RHEL7 використовує ядро ​​3.10.0-X

незмінно до цих пір ви можете дізнатися запущений випуск ядра, запустивши uname -r. Ви можете стати більш фантазійним, запустивши щось по лінії

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

Це дасть конкретну інформацію про ядро, як у наведеній вище таблиці. Можливо, ви зможете запускати паралелі до інших дистрибутивів, якщо вони послідовно використовують версії ядра.


2
-1. Адміністратор може вирішити оновити ядро ​​так само просто.
Олівер Гонджа

0

RHEL 6 додав файл / etc / system-release-cpe. Він містить :розділений рядок, який може виглядати приблизно так

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

Тепер достатньо витягнути поля $ 5 і $ 7, щоб отримати версію RHEL та варіант 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

Починаючи з RHEL 6, самим стислим способом було б:

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

Якби це було "найкоротшим", ви б зробили cut -d: -f5 /etc/system-release-cpuта уникали УУПЦ. Тим не менш, питання ставило питання про перехід від RHEL 5 до 6. Якщо це працює лише від RHEL 6 далі, чи не задовольнить це запитання?
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.