Làm cách nào để biết phiên bản nào của RHEL tôi đang sử dụng?


14

Tôi làm việc trong một môi trường nơi chúng tôi đang dần chuyển các máy từ Red Hat Enterprise Linux 5 sang RHEL 6.

Tôi cần một số tập lệnh của mình để làm một cái gì đó khác biệt một cách tinh tế trên các máy RHEL6 với những gì hiện đang được thực hiện trên các máy của RHEL5.

Giải pháp thực tế là kiểm tra trong thời gian chạy và chạy một số lệnh trên RHEL5, một số khác trên RHEL6 và một số trên cả hai.

Một ví dụ thực tế về điều này là chúng tôi đang sử dụng các mô-đun môi trường và tôi .bashrcbao gồm một module load gitdòng, nhưng trên các máy của RHEL6, lỗi lệnh này:

RHEL6 system, git should be installed - not loading module

Tìm trong modulefile tôi tìm thấy đoạn mã sau:

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

Điều này dường như để làm những gì tôi muốn, nhưng tôi đã hy vọng cho một cái gì đó ngắn hơn.

Vì vậy, cách dễ nhất để nói với RHEL5 từ RHEL6 trong tập lệnh bash là gì?

Lý tưởng nhất là nó phải mạnh mẽ trên các phiên bản chính khác nhau, nhưng phải chịu được các biến thể trong số lượng phát hành nhỏ.


không lsb_releaselàm việc ( -rphải cung cấp cho bạn số điện thoại; hãy thử -axem mọi thứ có sẵn) Nếu vậy, đó cũng là nhà cung cấp chéo.
derobert

Kiểm tra các tính năng, không phải nền tảng. Kiểm tra nền tảng của bạn ngày hôm nay sẽ bị hỏng khi RHEL7 xuất hiện và có thể bị hỏng trước đó khi RHEL 6.next xuất hiện, có lẽ vì họ đã chuyển một tính năng EL5 sang 6.x để loại bỏ khiếu nại về việc nó bị xóa. Vì vậy, nếu tập lệnh của bạn cần một gitmô-đun Bash, bạn kiểm tra xem nó có tồn tại hay không trước khi gọi nó. Khi / nếu nó xuất hiện muộn hơn, kết quả kiểm tra của bạn sẽ thay đổi, đột nhiên tính năng này bắt đầu hoạt động mà không cần thêm bất kỳ nỗ lực nào.
Warren Young

@WarrenYoung - Cảm ơn, nhưng tôi không phải là một sysasmin ở đây, chỉ là người dùng của một triển khai RHEL được quản lý tập trung. Tất cả các máy RHEL5 của chúng tôi về cơ bản là cùng một hình ảnh, nhưng tất cả các máy RHEL6, vì vậy đối với tôi biết bản sửa đổi chính là đủ. Cho rằng hiện tại chúng tôi chỉ đang trong giai đoạn lập kế hoạch chuyển sang RHEL6, tôi nghĩ sẽ còn một thời gian nữa trước khi chúng tôi phải lo lắng về RHEL7. * 8 ')
Đánh dấu gian hàng

@derobert - Không, trên RHEL5 & 6 cũng lsb_release -rbao gồm các văn bản khác, vd Release: 5.8. Như Dennis Kaarsemaker giải thích , nếu bạn sử dụng lsb_release -rsthay thế, bạn chỉ nhận được số.
Đánh dấu gian hàng

Xem thêm serverfault.com/questions/89654/what-version-of-rhel-am-i-USE - có một mẹo để thực hiện với RPM khi lsb chưa được cài đặt.
Dan Pritts

Câu trả lời:


10

Bạn cũng có thể sử dụng lsb_releaselệnh. Nếu bạn đã chắc chắn đó là RHEL, lấy số phiên bản chính là:

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

Hoạt động trên Centos và Redhat thích hợp, thất bại trong việc phát hành Redhat của Oracle Linux. Không tìm thấy lsb_release.
dùng959690

Câu trả lời này dường như đã lỗi thời. Tôi chỉ tìm thấy lsb_releasetrên các máy RHEL / CentOS 5 của mình. Không tìm thấy ở đâu vào ngày 6 hoặc 7.
Dale Anderson

Bạn có thể cần phải cài đặt gói redhat-lsb-core.
Dennis Kaarsemaker

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

Đây sẽ là cách đơn giản nhất mà tôi có thể nghĩ ra.


Hoạt động cho mọi biến thể của CentOS và RHEL tôi có trong kho từ 5 đến 7, không giống như lsb_releasechỉ hoạt động trong 5.
Dale Anderson

4

Sử dụng rpm -q |grep redhat-release-server

Tập /etc/redhat-releasetin có thể đã được chỉnh sửa bởi một quản trị viên muốn cài đặt phần mềm của bên thứ ba mà không thực hiện nâng cấp hệ điều hành thực tế.


1
Ý bạn là rpm -qathay vì rpm -q? Sử dụng -qchính nó đòi hỏi một đối số truy vấn.
Dale Anderson

@Dale Anderson, cảm ơn bạn, đây là người duy nhất làm việc cho tôi, vào ngày 7.4, và tôi không biết điều đó 7.4cho đến khi tôi chạy nó với-qa
Brian Thomas

2

Bạn có thể mở rộng điều này cho nhiều bản phân phối Linux bằng cách sử dụng /etc/issuetệp thay vì /etc/redhat-releasetệp.


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

rpm -q --queryformat '%{RELEASE}' rpmin một cái gì đó như 25.el7. Sau đó, vấn đề chỉ là lấy chữ số cuối cùng. Đã thử nghiệm trên RHEL 5,6,7 và Fedora 24.

Như những người khác chỉ ra, lsb-versioncó thể không được cài đặt. Ngoài ra, có ít nhất một hệ thống RHEL5 chưa redhat-release-servercài đặt gói.


cảm ơn bạn, điều này nên được nâng cao, vì nó luôn hoạt động và trả về chính xác số lượng mong muốn.
phiphi

1

Đây là một cách khác, chính xác hơn để có được kết quả này. Các gói kernel trong RHEL có chuỗi 'elN', trong đó N sẽ đại diện cho phiên bản chính của HĐH. Do đó, người ta có thể chạy lệnh sau để xác định phiên bản của RHEL:

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

Điều này sẽ trả về một chuỗi, "el5", "el6" hoặc "el7", tùy thuộc vào chuỗi phù hợp trên máy chủ đã cho.


Tôi đang sử dụng kết hợp CentOS và RedHat, phiên bản 5-7 và câu trả lời thực sự hoạt động trên tất cả các phiên bản: uname -r | sed 's / ^. (el [0-9] \ +). * $ / \ 1 /'
WallStProg

0

Tôi đã kết thúc bằng cách sử dụng câu trả lời của jordanm , nhưng thêm một nút thắt của riêng tôi.

Bởi vì tôi không muốn có tất cả các lệnh rrc6 của mình cùng với tất cả các lệnh rrc5 của mình cùng nhau, nhưng xen kẽ trong phần riêng của chúng và tôi không muốn sao chép mã này mỗi khi tôi muốn chuyển đổi, thay vào đó tôi đã làm điều này:

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

Bằng cách đó, tôi có thể làm những việc như:

# 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

Vân vân.



0

Tất cả các phương pháp được đề cập ở đây đều dựa vào các tệp văn bản và như vậy có thể gây hiểu nhầm. Một số người có quyền truy cập phù hợp có thể thay đổi nội dung của / etc / redhat-phát hành, / etc / vấn đề, v.v. thậm chí chỉ làm xáo trộn thông tin này. Một phương pháp đáng tin cậy hơn sẽ liên quan đến việc biết các bản phát hành kernel thường được Red Hat cung cấp trên mỗi phiên bản của RHEL:

  • RHEL4 sử dụng kernel 2.6.9-X
  • RHEL5 sử dụng kernel 2.6,18-X
  • RHEL6 sử dụng kernel 2.6.32-X
  • RHEL7 sử dụng kernel 3.10.0-X

luôn luôn cho đến bây giờ, bạn có thể tìm ra bản phát hành kernel đang chạy bằng cách chạy uname -r. Bạn có thể nhận được fancier bằng cách chạy một cái gì đó dọc theo dòng

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

Điều này sẽ cung cấp thông tin cụ thể về kernel, như trong bảng trên. Bạn có thể điều khiển song song với các bản phân phối khác, nếu chúng liên tục sử dụng các bản phát hành kernel.


2
-1. Quản trị viên có thể quyết định cập nhật kernel dễ dàng như vậy.
Oliver Gondža

0

RHEL 6 đã thêm tệp / etc / system-release-cpe. :Chuỗi này chứa một chuỗi phân tách có thể trông giống như

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

Bây giờ là đủ để kéo các trường $ 5 và $ 7 để có phiên bản RHEL và biến thể 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

Bắt đầu từ RHEL 6, cách ngắn gọn nhất sẽ là:

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

Nếu đó là "ngắn gọn nhất" bạn sẽ làm cut -d: -f5 /etc/system-release-cpuvà tránh UUOC. Tuy nhiên, câu hỏi được đặt ra là về việc chuyển đổi từ RHEL 5 sang 6. Nếu điều này chỉ hoạt động từ RHEL 6 trở đi thì không đáp ứng được các yêu cầu câu hỏi?
roaima
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.