Hangi Linux sürümünün çalıştığını nasıl öğrenebilirim?


29

Bazen senaryolarınızın farklı Linux'larda farklı davranmaları gerekir. Bir betiğin hangi Linux sürümünde çalıştığını nasıl belirleyebilirim?


1
Versiyon derken, çekirdek versiyonunu mu kastediyorsunuz? Hangi dağıtım? Dağıtım versiyonu?
Chris Upchurch

2
Eminim jldugger sistemin hangi dağıtım ailesini çalıştırdığını bulmak ister. Bazı komutların, / / ​​sys veya / proc öğelerine bağlı olmadıkça, çekirdek sürümünden etkilenmesi pek olası değildir - ve o zaman bile, genellikle çekirdeğe göre dağıtıma dayalı olarak varsaymak daha kolaydır.
Mihai Limbăşan

Yanıtlar:


27

Yapabileceklerinize ve yapamadıklarınıza dair varsayımlara dayanarak varsayımlarda bulunmayın, çünkü bu şekilde delilik (ayrıca "Kullanıcı Aracısı saptaması" bölümüne bakın). Bunun yerine, yapmak istediğiniz şeyin desteklenip desteklenmediğini ve kullanmak istediğiniz herhangi bir komut ya da dosya konumu ile nasıl yapıldığını tespit edin.

Örneğin, bir paket yüklemek istiyorsanız, dpkg veya rpm olup olmadığını kontrol ederek Debian benzeri bir sistemde veya RedHat benzeri bir sistemde olup olmadığınızı tespit edebilirsiniz (ilk önce dpkg'ı kontrol edin, çünkü Debian makineleri onlara rpm komutu ...). Kararınızı yalnızca bir Debian veya RedHat sistemi olup olmadığına değil, buna göre ne yapacağınıza karar verin. Bu şekilde, açıkça programlanmadığınız türev dağıtımlarını otomatik olarak destekleyeceksiniz. Oh, ve paketiniz belirli bağımlılıklar gerektiriyorsa, o zaman bunları da test edin ve kullanıcının ne kaçırdığını bilmesini sağlayın.

Başka bir örnek, ağ arayüzleri ile uğraşmaktır. Bir / etc / network / interfaces dosyası veya / etc / sysconfig / network-scripts dizini olup olmadığına göre ne yapılacağını hesaplayın ve oradan gidin.

Evet, bu daha fazla iş, ancak son on yıl veya daha fazla süre içinde web geliştiricilerinin yaptığı tüm hataları tekrarlamak istemiyorsanız, en baştan akıllıca bir şekilde yapacaksınız.


1
(Bu cevabın genişletilmesi) Bazı durumlarda özellik algılama tercih edilir, ancak tespit ettiğiniz özelliklerin dağılımını asla denemediğinizden ve tahmin etmediğinizden emin olun! Cevabı yanlış anlamayın ve / etc içindeki dosyalara dayanarak platformun RedHat olup olmadığını öğrenin. Dağıtım adına gerçekten ihtiyacınız varsa, lsb_release (veya / etc / redhat-release, vb.) Öğesini kontrol edin.
Nicholas Wilson

36

Çapraz dağıtım yolu yoktur. Ancak:

  • Redhat ve arkadaşlar: Test /etc/redhat-releaseedin, içeriği kontrol edin
  • Debian: Test /etc/debian_versionet, içerikleri kontrol et
  • Mandriva ve arkadaşları: Test /etc/versionedin, içerikleri kontrol edin
  • Slackware: Test /etc/slackware-versionet, içerikleri kontrol et

Vb Genel olarak konuşursak, kontrol edin /etc/*-releaseve /etc/*-version.


Düzenleme: Yıllar boyunca bir araya toplanmış olmalıyım (yaklaşık 6 yıl öncesine kadar etkileyici bir CVS günlüğüne sahiptir.) Olduğu gibi düzgün çalışmayabilir ve yapabilirim. Test edilecek dağıtımları bulmak için canınızı sıkmayın, ancak size iyi bir başlangıç ​​noktası sağlamalıdır. CentOS, Fedora ve Gentoo'da gayet iyi çalışıyor. gyaresu , Debian Lenny'de başarıyla test etti.

#!/bin/bash

get_distribution_type()
{
    local dtype
    # Assume unknown
    dtype="unknown"

    # First test against Fedora / RHEL / CentOS / generic Redhat derivative
    if [ -r /etc/rc.d/init.d/functions ]; then
        source /etc/rc.d/init.d/functions
        [ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"

    # Then test against SUSE (must be after Redhat,
    # I've seen rc.status on Ubuntu I think? TODO: Recheck that)
    elif [ -r /etc/rc.status ]; then
        source /etc/rc.status
        [ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"

    # Then test against Debian, Ubuntu and friends
    elif [ -r /lib/lsb/init-functions ]; then
        source /lib/lsb/init-functions
        [ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"

    # Then test against Gentoo
    elif [ -r /etc/init.d/functions.sh ]; then
        source /etc/init.d/functions.sh
        [ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"

    # For Slackware we currently just test if /etc/slackware-version exists
    # and isn't empty (TODO: Find a better way :)
    elif [ -s /etc/slackware-version ]; then
        dtype="slackware"
    fi
    echo $dtype
}

Bunun muhtemelen yalnızca Bash’te düzgün çalışacağını unutmayın. Diğer mermiler için tekrar yazabilirsin.

Olduğu söyleniyor, dağıtım için değil, özellikleri test etmek isteyebilirsiniz. Bunu artık kullanmıyorum, çünkü bakım yükü oldu. Çapraz dağıtım araçlarına ve çözümlerine güvenmek daha kolaydır.


Kavramsal olarak, sırayla:

  • Bilinen, "common init script function" dosya tipini çekin. Bunlar dağıtıma özgü. Eğer yoksa, bir sonraki dağıtım kontrolüne atlayın.
  • Bu çekirdek betiğinden belirli, var olan, sık kullanılan ve yeniden adlandırılması mümkün olmayan bir fonksiyonun varlığını kontrol edin. Bunu typeBash yerleşikini kullanarak yapıyoruz . bu sembol bir işlev ise type -tdöner function. zzÇıkışa hazırız , type -t 2>/dev/nullçünkü ad tanımlanmadıysa çıkış dizgisi boş kalır ve ==operatörün kayıp bir sol eliyle ilgili bir sözdizimi hatası alırız . Kontrol ettiğimiz ad bir işlev değilse, sonraki dağıtım kontrolüne atlayın, aksi takdirde dağıtım türünü bulduk.
  • Son olarak, dağıtım türünü yankılanır, böylece işlev çıktısı bir durumda kolayca kullanılabilir.

Bunu düz bir komut dosyası olarak çalıştırmayı denemeniz durumunda düzenleyin: Bu komut dosyasının kaynak olması veya diğer komut dosyalarından eklenmesi gerekiyor. Olduğu gibi çalıştırırsanız, hiçbir şeyi kendi başına çıkarmaz. Sınamak için, kaynak ve sonra işlevi çağırmak, örneğin:

source /path/to/this/script.sh
get_distribution_type

bash isteminde.


Düzenleme: Lütfen bu komut dosyasının kök ayrıcalıkları gerektirmediğini unutmayın. Kök olarak çalıştırmamanızı tavsiye ederim. Hiçbir şeye zarar vermemelisin ama buna gerek yok.


CVS günlüğünde ilgili bir posta listesi gönderisine bağlantı bulundu . İnit betiği spagetti paketini açmak için yararlı olmalıdır.


Nedenine bakmadım ama Debian Lenny (5.0) hakkında bilgi istemeye geri döndü.
Gareth,

gyaresu, get_distribution_type işlevini gerçekten çağırdınız mı?
Açıklığa

@gyaresu: Yukarıdaki sorun değilse, lütfen Debian bölümündeki log_begin_msg dosyasını log_warning_msg ile değiştirip tekrar deneyin? Fonksiyon ismini yanlış almış olabilir. Her durumda, eğer bu fonksiyon tereddüt etmediyse, yine de "bilinmeyen" olarak geri dönmeliydi.
Mihai Limbăşan

@Mihai Doh! Üzgünüm. Senaryoyu düzgün okumadın. Erken, kahve yoktu. Benim hatam. gyaresu @ debian: ~ / bin $ kaynak server_version.sh gyaresu @ debian: ~ / bin $ get_distribution_type debian
Gareth

@gyaresu: Teşekkürler! Bu iyi, jldugger'ın Debian'da da çalıştığını bilmesine yardım etmeli :)
Mihai Limbăşan

17

Çekirdek sürümünü çalıştırarak bulabilirsiniz, dağıtma sürümünü uname -abulmak dağıtıma bağlıdır.

Ubuntu ve diğer bazı işletim sistemlerinde ' lsb_release -a/ etc / lsb_release komutunu çalıştırabilir veya okuyabilirsiniz.

Debian, / etc / debian_version konumunda sürümü saklar


Lsb_release için +1 (doğru paket yüklendiyse Red Hat türevleri üzerinde de çalışır)
Josh Kelley

sadece açıklama için 'lsb_release -ds'.
flickerfly

6

Çoğu dağıtım, belirli bir dağılımı belirlemek için benzersiz bir yönteme sahiptir.

Örneğin:

Redhat (And derivatives): /etc/redhat-release

SUSE: /etc/SUSE-release

Orada Linux Standart Bankası veya LSB olarak bilinen bir standart var . / Etc / lsb-release adlı bir dosya veya linux dağıtımınızla ilgili bilgileri geri alacak olan lsb_release adlı bir program olması gerektiğini tanımlar.

lsb_release -a

Ve tabii ki, lsb_releaseCentOS 6'da mevcut değil.
Justin


5

Diğer cevaplara ek olarak: Yalnızca bir dosyayı ayrıştırmak istiyorsanız, çoğu dağıtım tty girişini / etc / issue ile kişiselleştirir:

SUSE Linux Kurumsal Sunucu 10 SP2'ye (i586) Hoşgeldiniz - Çekirdek \ r (\ l).

Ve evet, bunun yetersiz olduğunu biliyorum. :)


Alt optimal olabilir, ancak aynı yerdedir.
Brad Gilbert,

4

Facter , bu tür keşifler için kullanışlı bir araçtır, ancak yukarıda ayrıntılı olarak açıklanan yöntemlerden bazılarını kullanmasına rağmen Ruby gerektirir.


2

Tek yapmanız gereken uname -afavori kabuğunuzu yazmak. Bu çekirdek adını ve versiyonunu yazdıracak.


2

cat /etc/*release*Neredeyse her zaman işe yaradığını buldum .


2

Mark, Adam ve Mihai ile aynı fikirdeyim (saygınlık nedeniyle oy kullanamıyorum). LSB ve onun göreli FHS'sine dayanan çözümler çoğu dağıtımda çalışacak ve gelecekte çalışmaya devam etmesi muhtemeldir. LSB ve FHS arkadaşlarınızdır.


2

Ayrıca sürümünü alarak da alabilirsiniz.

cat /proc/version

o / p:

Linux sürüm 2.6.17-13mdv (rtp@octopus.mandriva.com) (gcc sürüm 4.1.2 20070302 (yayın öncesi) (4.1.2-1mdv2007.1)) # 1 SMP Cum 23 Mart 19:03:31 UTC 2007


1

Linux sürümü zor bir soru. Eğer buna yakından bakarsak, " uname -r" ile alabileceğiniz çekirdek versiyonuna sahibiz . Dağıtım sürümü çoğunlukla alakasızdır. Bazı dağıtımlar daha iyidir (Redhat Enterprise Linux gibi kurumsal dağıtımlar). Gentoo gibi diğer dağıtımlar temelde mantıklı bir sürümü olmayan hareketli hedeflerdir. Versiyona dayalı şeyler yapmanız gerekiyorsa, sizinle ilgili ana bileşenlere bir göz atın:

Component       Version command
glibc           /lib/libc.so.6
gcc             gcc --version
X               xdpyinfo
libX11          pkg-config --modversion x11
gtk+            pkg-config --modversion gtk+-2.0
qt-4            pkg-config --modversion QtCore

   etc...

1

Grub menüsünü de kontrol edebilirsiniz, genellikle size bir demet dağıtım / sürüm bilgisi verir :-)


-1

FusionInventory , bu bilgileri birçok Linux dağıtımında, aynı zamanda BSD'ler, Windows, MacOS X ve diğer unices de alabilen , platformlar arası hafif bir envanter aracıdır.

Mümkünse, kullanıyorlar lsb_release(yukarıda birkaç kez bahsedildiği gibi), ancak dağıtım adını ve sürümünü kontrol etmek için çok kullanışlı bir dosya listesine ve düzenli ifadelere sahip değillerse: https://github.com/fusinv/fusioninventory-agent/ blob / 2.2.x / lib / Fusion Envanteri / Temsilci / Görev / Envanter / Giriş / Linux / Dağıtım / NonLSB.pm # L16 .

Toplulukları bu işlevselliği güncel tutacağından, kendi komut dosyalarınızı bu mantıkla yeniden uygulamak yerine, bu bilgileri almak için FusionInventory'i kullanmanızı öneririm. Aracıyı kendi başına kullanabilir (ayrıştırması kolay olan bir XML / JSON dosyası çıkarır) veya gereksinimlerinize bağlı olarak ağınızdaki makineleri GLPI veya Dümen gibi yönetmek için daha geniş bir çözümle birleştirebilirsiniz .


Perl modüllerinin dış bağımlılıkları olmasaydı bu iyi bir çözüm olurdu
Will Sheppard,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.