Bagaimana cara mengetahui versi RHEL yang saya gunakan?

14

Saya bekerja di lingkungan di mana kami secara perlahan mentransisikan mesin dari Red Hat Enterprise Linux 5 ke RHEL 6.

Saya memerlukan beberapa skrip untuk melakukan sesuatu yang sedikit berbeda pada mesin RHEL6 dengan apa yang saat ini dilakukan pada mesin RHEL5.

Solusi pragmatis adalah memeriksa pada saat runtime dan menjalankan beberapa perintah di RHEL5, yang lain di RHEL6 dan beberapa di keduanya.

Contoh praktisnya adalah kita menggunakan modul lingkungan dan saya .bashrcmenyertakan module load gitbaris, tetapi pada mesin RHEL6 kesalahan perintah ini:

RHEL6 system, git should be installed - not loading module

Mencari di modulefile saya menemukan kode berikut:

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

Ini tampaknya melakukan apa yang saya inginkan, tetapi saya berharap untuk sesuatu yang lebih pendek.

Jadi, apa cara termudah untuk memberi tahu RHEL5 dari RHEL6 dalam skrip bash?

Idealnya itu harus kuat di berbagai versi utama, tetapi toleran terhadap variasi dalam jumlah rilis kecil.

Mark Booth
sumber
apakah lsb_releasebekerja? ( -rSeharusnya memberi Anda hanya nomor; coba juga -auntuk melihat semua yang tersedia) Jika demikian, itu juga cross-vendor.
derobert
Tes untuk fitur, bukan platform. Tes platform Anda hari ini akan rusak ketika RHEL7 keluar, dan mungkin rusak sebelum itu ketika RHEL 6.next keluar, mungkin karena mereka meneruskan porting fitur EL5 ke 6.x untuk membungkam keluhan tentang itu dihapus. Jadi, jika skrip Anda memerlukan gitmodul Bash, Anda memeriksa apakah ada sebelum memanggilnya. Ketika / jika muncul nanti, hasil cek Anda berubah, jadi tiba-tiba fitur mulai bekerja, tanpa usaha ekstra.
Warren Young
@ WarrenYoung - Terima kasih, tapi saya bukan sysasmin di sini, hanya pengguna penyebaran RHEL yang dikelola secara terpusat. Semua mesin RHEL5 kami pada dasarnya adalah gambar yang sama, selain semua mesin RHEL6, jadi bagi saya mengetahui revisi utama sudah cukup. Mengingat bahwa kita hanya dalam tahap perencanaan pindah ke RHEL6 sekarang, saya pikir itu akan memakan waktu sebelum kita harus khawatir tentang RHEL7. * 8 ')
Mark Booth
@derobert - Tidak, di RHEL5 & 6 juga lsb_release -rmenyertakan teks lain, mis Release: 5.8. Seperti yang dijelaskan Dennis Kaarsemaker , jika Anda menggunakannya lsb_release -rs, Anda hanya mendapatkan nomornya.
Mark Booth
Lihat juga serverfault.com/questions/89654/what-version-of-rhel-am-i-using - ada tip untuk melakukannya dengan RPM ketika lsb tidak diinstal.
Dan Pritts

Jawaban:

10

Anda juga dapat menggunakan lsb_releaseperintah. Jika Anda sudah yakin itu RHEL, mendapatkan nomor versi utama adalah:

majversion=$(lsb_release -rs | cut -f1 -d.)
Dennis Kaarsemaker
sumber
Bekerja pada Centos dan Redhat, gagal pada rilis Linux Redhat dari Oracle. lsb_release tidak ditemukan.
user959690
Jawaban ini sepertinya sudah usang sekarang. Saya hanya menemukan lsb_releasedi mesin RHEL / CentOS 5 saya. Tidak ada tempat untuk ditemukan pada 6 atau 7.
Dale Anderson
Anda mungkin perlu menginstal paket redhat-lsb-core.
Dennis Kaarsemaker
15
if grep -q -i "release 6" /etc/redhat-release
then
  echo "running RHEL 6.x"
fi

Ini akan menjadi cara paling sederhana yang dapat saya pikirkan.

MelBurslan
sumber
Berfungsi untuk setiap variasi CentOS dan RHEL yang saya miliki dalam inventaris saya dari 5 hingga 7, tidak seperti lsb_releaseyang tampaknya hanya berfungsi untuk 5.
Dale Anderson
4

Menggunakan rpm -q |grep redhat-release-server

The /etc/redhat-releaseberkas bisa telah diedit oleh admin mencari untuk menginstal perangkat lunak pihak ketiga tanpa melakukan upgrade OS yang sebenarnya.

BillMal
sumber
1
Apakah maksud Anda rpm -qaalih-alih rpm -q? Menggunakannya -qsendiri membutuhkan argumen kueri.
Dale Anderson
@Dale Anderson, terima kasih, ini adalah satu-satunya yang bekerja untuk saya, pada 7.4, dan saya tidak tahu 7.4sampai saya menjalankan ini dengan-qa
Brian Thomas
2

Anda dapat memperluas ini untuk beberapa distro Linux dengan menggunakan /etc/issuefile, bukan /etc/redhat-releasefile.

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

rpm -q --queryformat '%{RELEASE}' rpmmencetak sesuatu seperti 25.el7. Maka tinggal ambil digit terakhir saja. Diuji pada RHELs 5,6,7 dan Fedora 24.

Seperti yang ditunjukkan orang lain, lsb-versionmungkin tidak diinstal. Selain itu, setidaknya ada satu sistem RHEL5 yang tidak memiliki redhat-release-serverpaket yang diinstal.

pengguna7610
sumber
terima kasih, ini harus ditingkatkan, karena selalu berfungsi dan persis mengembalikan nomor yang diinginkan.
phiphi
1

Inilah cara lain yang lebih tepat untuk mendapatkan hasil ini. Paket-paket kernel di RHEL menyertakan string 'elN', di mana N akan mewakili versi utama OS. Dengan demikian, seseorang dapat menjalankan perintah berikut untuk mengidentifikasi versi RHEL:

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

Ini akan mengembalikan string, "el5", "el6" atau "el7", tergantung pada string yang cocok pada host yang diberikan.

Brād Ax
sumber
Saya menggunakan campuran CentOS dan RedHat, versi 5-7, dan jawabannya benar-benar berfungsi pada semua versi: uname -r | sed 's /^.* (el [0-9] \ +). * $ / \ 1 /'
WallStProg
0

Saya akhirnya menggunakan jawaban jordanm , tetapi menambahkan twist saya sendiri.

Karena saya tidak ingin memiliki semua perintah rhel6 saya bersama-sama dan semua perintah rhel5 saya bersama-sama, tetapi disatukan dalam bagian mereka sendiri, dan saya tidak ingin harus mereplikasi kode ini setiap kali saya ingin beralih, sebagai gantinya saya melakukan ini:

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

Dengan begitu, saya bisa melakukan hal-hal seperti:

# 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

dll.

Mark Booth
sumber
0

Semua metode yang disebutkan di sini bergantung pada file teks, dan karenanya bisa menyesatkan. Seseorang dengan akses yang tepat dapat mengubah isi / etc / redhat-release, / etc / issue, dll. Bahkan hanya untuk mengaburkan informasi ini. Metode yang lebih andal akan melibatkan mengetahui rilis kernel yang biasanya disediakan oleh Red Hat pada setiap versi RHEL:

  • RHEL4 menggunakan kernel 2.6.9-X
  • RHEL5 menggunakan kernel 2.6.18-X
  • RHEL6 menggunakan kernel 2.6.32-X
  • RHEL7 menggunakan kernel 3.10.0-X

selalu sampai sekarang, Anda dapat mengetahui rilis kernel yang berjalan dengan menjalankan uname -r. Anda bisa menjadi pelamun dengan menjalankan sesuatu di sepanjang garis

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

Ini akan memberikan informasi spesifik tentang kernel, seperti pada tabel di atas. Anda mungkin dapat mengarahkan paralel ke distribusi lain, jika mereka secara konsisten menggunakan rilis kernel.

Brād Ax
sumber
2
-1. Admin dapat memutuskan untuk memperbarui kernel dengan mudah.
Oliver Gondža
0

RHEL 6 telah menambahkan file / etc / system-release-cpe. Ini berisi :string terpisah yang mungkin terlihat seperti

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

Sekarang cukup untuk menarik bidang $ 5 dan $ 7 untuk mendapatkan versi RHEL dan varian 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 }')
pengguna7610
sumber
0

Mulai dari RHEL 6, cara yang paling ringkas adalah:

cat /etc/system-release-cpe | cut -d ':' -f5
trinth
sumber
Jika itu menjadi "paling ringkas" Anda akan melakukan cut -d: -f5 /etc/system-release-cpudan menghindari UUOC. Namun, pertanyaannya adalah tentang transisi dari RHEL 5 ke 6. Jika ini hanya bekerja dari RHEL 6 dan seterusnya, apakah itu tidak memenuhi persyaratan pertanyaan?
roaima