Xác định phân phối Linux


11

Tôi đang cố gắng xác định hương vị của máy chủ linux đang chạy. Tôi không cố gắng xác định phiên bản kernel - nhưng đánh giá nhà phân phối.

gcc đã được cài đặt và trong phiên bản đầu ra, nó nói RedHat

# gcc --version
gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-11)

Điều này có nghĩa là tôi có thể cho rằng máy chủ của mình là máy chủ RedHat một cách an toàn. Có cách nào tốt hơn - phương pháp chống đạn 100% để tìm ra điều này? Ngoài ra đối với các hương vị linux khác - không chỉ máy chủ này?

Chỉnh sửa: nội dung /etc/trong trường hợp nó có ích - nhưng tôi cũng muốn một giải pháp hoạt động cho các phiên bản khác của linux.

# ls /etc/
./              backupmxhosts  domainusers     host.conf     localdomains  mailips        pam.d/      relayhosts               shadow              trustedmailhosts
../             bashrc*        exim.conf       inputrc       localtime     man.config     passwd      resolv.conf              skipsmtpcheckhosts  userdomains
DIR_COLORS      cron.deny      exim.pl         ld.so.cache   lynx.cfg      mtab           profile     secondarymx              spammeripblocks     vimrc
aliases         demodomains    exim.pl.local*  ld.so.conf    mail/         my.cnf         profile.d/  senderverifybypasshosts  sudoers
antivirus.exim  demouids       group           localaliases  mailhelo      nsswitch.conf  protocols   services                 termcap

Tôi không có *releasehoặc *versiontập tin trong/etc/

# ls /etc*release; ls /etc/*version
/bin/ls: /etc/*release: No such file or directory
/bin/ls: /etc/*version: No such file or directory

Tôi đã thử LSB

# lsb_release -a
LSB Version:
Distributor ID: n/a
Description:    (none)
Release:        n/a
Codename:       n/a

Ngoài ra - tôi đoán tôi đang ở trong một chroot jail(không thực sự chắc chắn đó là gì) có thể là nguyên nhân cho vấn đề này.


Cập nhật:

Tôi nghĩ rằng điều này làm cho tôi. Tôi nghĩ rằng tôi có thể an toàn cho rằng tôi đang sử dụng cent-os.

# cat /proc/version
Linux version 2.6.9-103.plus.c4smp (mockbuild@builder10.centos.org) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11)) #1 SMP Wed Dec 21 16:17:23 EST 2011

Tại sao bạn cần phải biết? Có lẽ thay vì kiểm tra các công cụ dành riêng cho phân phối chung (ví dụ: trình quản lý gói) sẽ làm những gì bạn muốn?
Daniel Pryden

1
Vâng, điều tôi thực sự muốn biết là liệu tôi có thể sao chép máy chủ thành máy ảo cục bộ hay không, sau đó cài đặt công cụ trên máy ảo cục bộ, sau đó sao chép các tệp nhị phân sang máy từ xa. Tôi nghĩ rằng việc tìm ra nền tảng chính xác sẽ là một điểm khởi đầu tốt.
Billy Moon

2
Danh sách thư mục trên không đầy đủ (ví dụ: máy chủ bị thiếu, init.d, rc *). Đây có phải là một bài kiểm tra?

Bạn đang truy cập máy chủ này như thế nào? Có thể là bạn không có quyền truy cập trực tiếp vào hệ thống tập tin của máy chủ, mà thay vào đó là trong một nhà tù chroot?
Daniel Pryden

Tôi đoán tôi có thể ở trong nhà tù chroot - điều này có nghĩa là tôi không thể tìm ra hệ thống cơ bản là gì?
Billy Moon

Câu trả lời:


4
cat /proc/version

Ví dụ:

  1. Ubuntu:

    $ cat /proc/version
    Linux version 3.11.0-13-generic (buildd@roseapple) (gcc version 4.8.1 \
    (Ubuntu/Linaro 4.8.1-10ubuntu8) ) #20-Ubuntu SMP Wed Oct 23 07:38:26 UTC 2013
    
  2. Mũ đỏ / CentOS:

    $ cat /proc/version
    Linux version 2.6.32-220.13.1.el6.x86_64 (mockbuild@c6b6.bsys.dev.centos.org) \
    (gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC) ) #1 SMP Tue Apr 17 23:56:34 BST 2012
    

Xem thêm Làm thế nào để biết phân phối Linux nào bạn đang sử dụng?


Điều này cho thấy kernel đã được biên dịch ở đâu chứ không phải phân phối bạn chạy trên đó. Trong nhiều trường hợp, kernel đang được biên dịch trên cùng một bản phân phối nhưng trên một phiên bản cũ hơn.
pabouk

13

Trên hầu hết các bản phân phối Linux hiện đại, lệnh sau sẽ cung cấp cho bạn thông tin của nó:

lsb_release -a

1
Không, đây không phải là sự thật. Điều này chỉ hoạt động cho Debian và các công cụ phái sinh
MariusMatutiae

1
Lệnh này không được cài đặt theo mặc định trên Red Hat và các dẫn xuất (ví dụ như CentOS). Bạn phải cài đặt nó một cách rõ ràng trước khi sử dụng : yum install redhat-lsb-core.
pabouk

@MariusMatutiae thực sự phổ biến hơn thế nhiều nhưng không phải lúc nào cũng được cài đặt theo mặc định.
terdon

@terdon cảm ơn bạn, tôi không biết điều đó.
MariusMatutiae

@MariusMatutiae xem tại đây để biết thêm thông tin, có vẻ như không có SuSe nhưng nên được cài đặt trên RH.
terdon

9

/etc/issue có thể là một điểm khởi đầu tốt.

Nhiều hơn có thể được tìm thấy bằng cách kiểm tra các tệp thông tin cho các bản phân phối khác nhau:

Novell SuSE    /etc/SuSE-release
OpenSuSE       /etc/SuSE-release, /etc/os-release
Red Hat,CentOS /etc/redhat-release, /etc/redhat_version
Fedora         /etc/fedora-release, /etc/redhat-release, /etc/os-release
Slackware      /etc/slackware-release, /etc/slackware-version
Debian         /etc/debian_release, /etc/debian_version
Mandrake       /etc/mandrake-release
Yellow dog     /etc/yellowdog-release
Sun JDS        /etc/sun-release 
Solaris/Sparc  /etc/release 
Gentoo         /etc/gentoo-release
Amazon Linux   /etc/system-release
PLD Linux      /etc/pld-release, /etc/os-release
ArchLinux      /etc/arch-release, /etc/os-release

Xem diễn đàn Unix để biết thêm chi tiết.


1
Thật không may, tôi không có bất kỳ tập tin nào kết thúc releasehoặc versiontrong etcthư mục của mình
Billy Moon

4

Nếu /etc/issuebị thiếu, có thể có một hoặc nhiều /etc/*_releasetệp.

Ví dụ: hệ thống Ubuntu của tôi có /etc/lsb-release:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=11.04
DISTRIB_CODENAME=natty
DISTRIB_DESCRIPTION="Ubuntu 11.04"

Hệ thống CentOS của một người bạn (dựa trên Red Hat) có /etc/redhat-release:

CentOS release 5.6 (Final)

Tôi không biết làm thế nào phổ quát này.


không releasehoặc versiontập tin nào trong tôi/etc/
Billy Moon

@BillyMoon Tôi tin rằng chỉ gần đây các bản phân phối Linux bắt đầu thêm tiện ích lsb_release trên bản phân phối của họ. lsb_release -a
Alpha01

Cảm ơn vì tiền boa - không giúp tôi lần này thật không may
Billy Moon

2

mèo / etc / vấn đề có thể trả lời câu hỏi của bạn.

Các nhà sản xuất distro không thân thiện với bạn ở đây. Đầu tiên, mỗi người nghĩ rằng đó là cách duy nhất đúng.

Rất có thể, thay vì cố gắng đánh hơi phân phối, bạn nên xem chi tiết hơn về câu hỏi cụ thể mà bạn thực sự cần trả lời. Tập trung vào chức năng bạn đang xem, không phải là bản phân phối cung cấp nó. Rốt cuộc, một phiên bản mới của một bản phân phối có thể quay lại và đi theo hướng ngược lại trên bất kỳ trục cụ thể nào.


3
không có /etc/issuetrên máy chủ của tôi
Billy Moon

Đúng. Lưu ý rằng /etc/issuecó thể chứa các chuỗi thoát như \n\l. Để xem những gì có nghĩa là gì, man 5 issueman getty( /etc/issuetập tin chủ yếu được sử dụng cho getty). Tất nhiên chủ sở hữu của hệ thống có thể chỉnh sửa /etc/issuevì một số lý do bất chính.
Keith Thompson

Tôi không nghĩ /etc/issuelà bắt buộc phải tồn tại hoặc chứa bất kỳ thông tin nào về nhà cung cấp phân phối. Nó thường như vậy, nhưng tôi không nghĩ bạn có thể dựa vào nó.
Daniel Pryden

@DanielPryden một người học được điều gì đó mỗi ngày. Trước đây tôi chưa bao giờ gặp phải sự vắng mặt của một người.
bmargulies

1

Sử dụng facter(có đó là cách nó được đánh vần).

Facter là bạn đồng hành với con rối, nó cung cấp các biến có thể được truy vấn có chứa thông tin về hệ thống.

Ví dụ, đây chỉ là một vài trong số hàng tá biến mà yếu tố có thể trả về

$ facter
...
operatingsystem => CentOS
operatingsystemmajrelease => 6
operatingsystemrelease => 6.4
osfamily => RedHat
...

Bạn có thể chỉ cần truy vấn thực tế osf Family để thấy rằng máy chủ đang chạy RedHat

$ facter osfamily
RedHat

Kiểm tra tài liệu: http://puppetlabs.com/facter


0

uname -a

Hoạt động luôn cho mọi người


1
Điều đó báo cáo chuỗi phiên bản kernel , có thể rất sai nếu máy chủ của bạn đang chạy kernel từ một bản phân phối khác - trên kim loại trần hoặc do một công cụ như OpenVZ hoặc VServers.
đăng

Có, nhưng tôi cho rằng trong này trường hợp tác giả của Q sẽ biết ai lấy cái gì. về tình hình. Hạt nhân "nước ngoài" là trường hợp khá kỳ quặc
Lazy Badger

0

Không có cách chắc chắn duy nhất để làm điều này. Tôi đã hỏi một câu hỏi tương tự trên unix.se và cách tốt nhất để có được thông tin này là một tập lệnh kiểm tra nhiều nguồn khác nhau:

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

Sự lựa chọn khác thực sự là sử dụng gcc --version, vì gccluôn được biên dịch cho một bản phân phối cụ thể, điều này sẽ tương đối di động. Tôi đặc biệt khuyên bạn nên đọc câu trả lời được chấp nhận cho câu hỏi của tôi tại U & L, nó giải thích tình huống rất độc đáo.


0

Lệnh này hoạt động cho các bản phân phối dựa trên Debian và Redhat: Sử dụng bộ lọc tr, bạn chuyển đổi tài liệu sang định dạng một từ trên mỗi dòng và sau đó đếm dòng đầu tiên chứa tên phân phối.

tr -s ' \011' '\012' < /etc/issue | head -n 1

-1

Thos là phương pháp tốt nhất

cat /etc/*release

Tôi liệt kê /etcthư mục của tôi trong câu hỏi. Như đã thảo luận về các câu trả lời khác, giải pháp này không hiệu quả với tôi.
Billy Moon

Bạn đã thử phát hành ls / etc *; . Đó là sai. Hãy thử phát hành ls / etc / *. Nó sẽ hoạt động .am khá chắc chắn
Unnikrishnan

Tôi cũng đã làm ls trong /etc/thư mục và bạn có thể thấy rằng không có tập tin nào ở đó kết thúc vàorelease
Billy Moon
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.