กำหนดการกระจาย Linux


11

ฉันพยายามที่จะกำหนดว่าเซิร์ฟเวอร์ linux รสชาติใดกำลังทำงานอยู่ ฉันไม่ได้พยายามตรวจสอบรุ่นเคอร์เนล - แต่ให้คะแนนผู้แทนจำหน่าย

ติดตั้ง gcc แล้วและในเวอร์ชั่นเอาท์พุทมันพูดว่า RedHat

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

หมายความว่าฉันสามารถสันนิษฐานได้ว่าเซิร์ฟเวอร์ของฉันเป็นเซิร์ฟเวอร์ RedHat อย่างปลอดภัย มีวิธีกันกระสุนที่ดีกว่า 100% ในการค้นหาสิ่งนี้หรือไม่? สำหรับรสชาติลินุกซ์อื่น ๆ - ไม่ใช่แค่เซิร์ฟเวอร์นี้หรือ

แก้ไข: เนื้อหาของ/etc/ในกรณีที่ช่วย - แต่ฉันต้องการวิธีแก้ปัญหาที่ใช้งานได้สำหรับรุ่นอื่น ๆ ของลินุกซ์ด้วย

# 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

ฉันไม่มี*releaseหรือไม่มี*versionไฟล์/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

ฉันลอง LSB

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

นอกจากนี้ - ฉันคิดว่าฉันอยู่ในchroot jail(ไม่แน่ใจว่ามันคืออะไร) ซึ่งน่าจะเป็นต้นเหตุของปัญหานี้


Updated:

ฉันคิดว่ามันทำเพื่อฉัน ฉันคิดว่าฉันสามารถคาดเดาได้อย่างปลอดภัยว่าฉันใช้ 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

ทำไมคุณต้องรู้ บางทีแทนที่จะทดสอบเครื่องมือเฉพาะการกระจายทั่วไป (ตัวอย่างเช่นผู้จัดการแพคเกจ) จะทำในสิ่งที่คุณต้องการ?
Daniel Pryden

1
สิ่งที่ฉันอยากรู้จริงๆก็คือถ้าฉันสามารถทำซ้ำเซิร์ฟเวอร์เป็นเครื่องเสมือนในเครื่องแล้วติดตั้งเนื้อหาบนเครื่องเสมือนจากนั้นคัดลอกไบนารีไปยังเครื่องระยะไกล ฉันคิดว่าการหาแพลตฟอร์มที่ถูกต้องจะเป็นจุดเริ่มต้นที่ดี
Billy Moon

2
รายการไดเรกทอรีด้านบนไม่สมบูรณ์ (เช่นโฮสต์หาย, init.d, rc *) นี่เป็นการทดสอบหรือไม่?

คุณเข้าถึงเซิร์ฟเวอร์นี้อย่างไร เป็นไปได้หรือไม่ที่คุณไม่สามารถเข้าถึงระบบไฟล์ของเซิร์ฟเวอร์ได้โดยตรง แต่แทนที่จะอยู่ในคุก chroot?
Daniel Pryden

ฉันเดาว่าฉันอาจอยู่ในคุก chroot - นี่หมายความว่าฉันไม่สามารถหาระบบพื้นฐานได้หรือไม่?
Billy Moon

คำตอบ:


4
cat /proc/version

ตัวอย่าง:

  1. อูบุนตู:

    $ 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. Red Hat / 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
    

ดูวิธีการรู้ว่าคุณใช้ Linux รุ่นใดอยู่?


นี่แสดงให้เห็นว่าเคอร์เนลถูกรวบรวมไว้ที่ใดไม่ใช่การกระจายที่คุณใช้ ในหลายกรณีเคอร์เนลจะถูกรวบรวมในการกระจายเดียวกัน แต่ในรุ่นที่เก่ากว่า
pabouk

13

บน Linux distros ที่ทันสมัยส่วนใหญ่คำสั่งต่อไปนี้จะให้ข้อมูลแก่คุณ:

lsb_release -a

1
ไม่นี่ไม่เป็นความจริง ใช้ได้กับเดเบียนและตราสารอนุพันธ์เท่านั้น
MariusMatutiae

1
คำสั่งนี้ไม่ได้ติดตั้งตามค่าเริ่มต้นบน Red Hat และอนุพันธ์ (เช่น CentOS) คุณต้องติดตั้งมันอย่างชัดเจนก่อนการใช้งาน: yum install redhat-lsb-core.
pabouk

@MariusMatutiae จริงๆแล้วมันแพร่หลายมากขึ้นกว่านั้น แต่ไม่ได้ติดตั้งตามค่าเริ่มต้นเสมอ
terdon

@terdon ขอบคุณฉันไม่รู้เหมือนกัน
MariusMatutiae

@MariusMatutiae ดูที่นี่สำหรับข้อมูลเพิ่มเติมดูเหมือนว่าจะหายไปจาก SuSe แต่ควรติดตั้งใน RH
terdon

9

/etc/issue อาจเป็นจุดเริ่มต้นที่ดี

สามารถพบได้มากขึ้นโดยการตรวจสอบไฟล์ข้อมูลสำหรับการแจกแจงที่แตกต่างกัน:

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

ดูฟอรัม Unixสำหรับรายละเอียดเพิ่มเติม


1
น่าเสียดายที่ฉันไม่มีไฟล์ใดที่ลงท้ายreleaseหรือversionในetcไดเรกทอรีของฉัน
Billy Moon

4

หาก/etc/issueขาดหายไปอาจมี/etc/*_releaseไฟล์อย่างน้อยหนึ่งไฟล์

ตัวอย่างเช่นระบบ Ubuntu ของฉันมี/etc/lsb-release:

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

ระบบ CentOS ของเพื่อน (ตาม Red Hat) มี/etc/redhat-release:

CentOS release 5.6 (Final)

ฉันไม่รู้ว่ามันเป็นสากลแค่ไหน


ไม่มีreleaseหรือversionไฟล์ในของฉัน/etc/
Billy Moon

@BillyMoon ฉันเชื่อว่าเป็นเพียงเมื่อเร็ว ๆ นี้ที่ดิสทริบิวชัน Linux เริ่มเพิ่มยูทิลิตี้ lsb_release ในการกระจาย lsb_release -a
Alpha01

ขอบคุณสำหรับเคล็ดลับ - ไม่ช่วยฉันในครั้งนี้โชคไม่ดี
Billy Moon

2

cat / etc / issue อาจตอบคำถามของคุณ

ผู้ผลิตเครื่องดื่มไม่เป็นมิตรกับคุณที่นี่ ครั้งแรกแต่ละคนคิดว่ามันเป็นทางเดียวเท่านั้นจริง

เป็นไปได้มากที่สุดแทนที่จะพยายามดมกลิ่น distro คุณควรจะดูรายละเอียดเพิ่มเติมในคำถามเฉพาะที่คุณต้องตอบ มุ่งเน้นไปที่ฟังก์ชั่นที่คุณกำลังดูไม่ใช่ distro ที่ให้มา ท้ายที่สุดแล้วรุ่นใหม่ของ distro สามารถหมุนและหมุนไปในทิศทางตรงกันข้ามกับแกนใดก็ได้


3
ไม่มี/etc/issueในเซิร์ฟเวอร์ของฉัน
Billy Moon

ใช่. โปรดทราบว่า/etc/issueอาจมีลำดับหนีเช่นและ\n \lที่จะเห็นสิ่งเหล่านี้ค่าเฉลี่ยman 5 issueและman getty(คน/etc/issueไฟล์มีวัตถุประสงค์หลักสำหรับการใช้งานโดยgetty) แน่นอนว่าเจ้าของระบบสามารถแก้ไขได้/etc/issueด้วยเหตุผลบางประการ
Keith Thompson

ฉันไม่คิดว่า/etc/issueจำเป็นต้องมีอยู่หรือมีข้อมูลใด ๆ เกี่ยวกับผู้จัดจำหน่าย มันทำกันโดยทั่วไป แต่ฉันไม่คิดว่าคุณจะไว้ใจได้
Daniel Pryden

@DanielPryden เรียนรู้ทุกอย่างดีทุกวัน ฉันไม่เคยพบเจอใครมาก่อน
bmargulies

1

ใช้facter(ใช่ว่ามันสะกดอย่างไร)

Facter เป็นคู่หูของหุ่นมันมีตัวแปรที่สามารถสอบถามซึ่งมีข้อมูลเกี่ยวกับระบบ

ตัวอย่างเช่นต่อไปนี้เป็นตัวแปรเพียงไม่กี่ตัวที่สามารถส่งคืนได้

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

คุณสามารถสอบถามข้อเท็จจริงเกี่ยวกับ osfamily เพื่อดูว่าเซิร์ฟเวอร์กำลังใช้ RedHat อยู่

$ facter osfamily
RedHat

ตรวจสอบเอกสาร: http://puppetlabs.com/facter


0

uname -a

ทำงานได้ตลอดเวลาสำหรับ Tux ใด ๆ


1
ซึ่งรายงานสตริงของเคอร์เนลเวอร์ชันซึ่งอาจผิดถ้าโฮสต์ของคุณใช้เคอร์เนลจากการกระจายที่แตกต่างกัน - ไม่ว่าจะเป็นบนโลหะเปลือยหรือเพราะเครื่องมือเช่น OpenVZ หรือ VServers
sarnold

ใช่ แต่ฉันคิดว่าในกรณีนี้ผู้เขียน Q จะรู้จัก smth เกี่ยวกับสถานการณ์ เคอร์เนล "ต่างประเทศ" เป็นกรณีที่ค่อนข้างแปลก
Lazy Badger

0

ไม่มีวิธีการดับเพลิงที่แน่นอนในการทำเช่นนี้ ฉันถามคำถามที่คล้ายกันในunix.seและวิธีที่ดีที่สุดในการรับข้อมูลนี้คือสคริปต์ที่ตรวจสอบแหล่งที่มาที่หลากหลาย:

#!/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}

อีกทางเลือกหนึ่งคือการใช้งานจริงgcc --versionเนื่องจากgccมีการรวบรวมเสมอสำหรับ distro เฉพาะนี้จะค่อนข้างพกพา ฉันขอแนะนำให้คุณอ่านคำตอบที่ได้รับการยอมรับในคำถามของฉันที่ U&L มันอธิบายสถานการณ์ได้เป็นอย่างดี


0

คำสั่งนี้ใช้ได้กับการแจกแจงแบบอิงเดเบียนและ Redhat: การใช้ตัวกรอง tr คุณสามารถแปลงเอกสารเป็นรูปแบบหนึ่งคำต่อบรรทัดจากนั้นนับบรรทัดแรกที่มีชื่อการแจกจ่าย

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

-1

วิธีนี้เป็นวิธีที่ดีที่สุด

cat /etc/*release

ฉันแสดงรายการ/etcไดเรกทอรีในคำถาม ตามที่อธิบายไว้ในคำตอบอื่น ๆ วิธีนี้ไม่ได้ผลสำหรับฉัน
Billy Moon

คุณลอง ls / etc * release; . มันผิด. ลองใช้ ls / etc / * มันจะใช้งานได้. ฉันค่อนข้างแน่ใจ
Unnikrishnan

ฉันยังทำใน/etc/ไดเรกทอรีและคุณจะเห็นว่าไม่มีไฟล์ในนั้นrelease
Billy Moon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.