Как узнать, какую версию 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 не установлен.
Дэн Притц

Ответы:

10

Вы также можете использовать lsb_releaseкоманду. Если вы уже уверены, что это RHEL, то получите номер основной версии:

majversion=$(lsb_release -rs | cut -f1 -d.)
Деннис Каарсемакер
источник
Работает на собственно Centos и Redhat, не работает на Oracle Linux версии Redhat. 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

Это был бы самый простой способ, о котором я могу думать.

MelBurslan
источник
Работает для всех вариаций CentOS и RHEL, которые есть в моем инвентаре с 5 по 7, в отличие от того, lsb_releaseкоторый работает только на 5.
Дейл Андерсон
4

использование rpm -q |grep redhat-release-server

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

BillMal
источник
1
Вы имели в виду rpm -qaвместо rpm -q? Использование -qсамо по себе требует аргумента запроса.
Дейл Андерсон
@ Дейл Андерсон, спасибо, это единственный, который работал на меня, на 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пакет.

user7610
источник
спасибо, за это стоит проголосовать, так как он всегда работает и точно возвращает желаемое число.
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 }')
user7610
источник
0

Начиная с RHEL 6, самый краткий способ будет:

cat /etc/system-release-cpe | cut -d ':' -f5
trinth
источник
Если бы это было «самым кратким», вы бы сделали cut -d: -f5 /etc/system-release-cpuи избегали UUOC. Однако задавался вопрос о переходе с RHEL 5 на 6. Если это работает только с RHEL 6 и далее, разве он не удовлетворяет требованиям вопроса?
Роайма