GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa mendapatkan nama sistem operasi dengan andal?

lsb_release -a kemungkinan akan menjadi pilihan terbaik Anda untuk menemukan informasi ini, dan mampu melakukannya dengan cara yang konsisten.

Sejarah LSB

lsb dalam perintah itu adalah singkatan dari proyek Basis Standar Linux yang merupakan proyek payung yang disponsori oleh Yayasan Linux untuk menyediakan metode umum untuk melakukan hal-hal dasar di berbagai distro Linux.

Proyek ini bersifat sukarela dan vendor dapat berpartisipasi dalam proyek hanya sebagai pengguna dan juga sebagai fasilitator dari berbagai spesifikasi seputar modul berbeda yang membantu mendorong standardisasi dalam berbagai distribusi Linux.

kutipan dari piagam

Kelompok kerja LSB memiliki, sebagai tujuan intinya, untuk mengatasi dua masalah ini. Kami menerbitkan standar yang menjelaskan kumpulan minimum API yang harus didukung oleh distribusi, dengan berkonsultasi dengan vendor distribusi utama. Kami juga menyediakan pengujian dan alat yang mengukur dukungan untuk standar, dan memungkinkan pengembang aplikasi untuk menargetkan perangkat umum. Terakhir, melalui pekerjaan pengujian kami, kami berupaya mencegah perbedaan yang tidak perlu antara distribusi.

Tautan berguna terkait LSB

  • Piagam LSB
  • Kelompok Kerja LSB
  • Peta Jalan LSB
  • Milis LSB (aktivitas saat ini ada di sini!)
  • Daftar produk LSB bersertifikat
  • Halaman Wikipedia LSB

Kritik

Ada beberapa masalah dengan LSB yang membuatnya bermasalah untuk distro seperti Debian. Penggunaan paksa RPM menjadi satu. Lihat artikel Wikipedia untuk mengetahui lebih lanjut tentang masalah ini.

Novel

Jika Anda mencari, Anda mungkin akan menemukan halaman yang tampak cukup kuno berjudul:Mendeteksi Distro Linux yang Mendasari dari Novell. Ini adalah salah satu dari sedikit tempat yang pernah saya lihat daftar sebenarnya yang menunjukkan beberapa distro utama dan bagaimana Anda dapat mendeteksi apa yang mendasari yang Anda gunakan.

kutipan

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-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
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

Halaman yang sama ini juga menyertakan skrip praktis yang mencoba mengkodifikasi untuk hal di atas hanya dengan menggunakan vanilla uname perintah, dan keberadaan salah satu file di atas.

CATATAN: Daftar ini bertanggal tetapi Anda dapat dengan mudah membuang distro yang bertanggal seperti Mandrake dari daftar dan menggantinya dengan alternatif. Jenis skrip ini mungkin merupakan salah satu pendekatan jika Anda mencoba mendukung sebagian besar varian Solaris &Linux.

Mafia Linux

Pencarian lebih lanjut akan muncul di halaman berikut yang dikelola di Linuxmafia.com, berjudul:/etc/release equivalents for galanya Linux (dan Unix lainnya) distro. Ini mungkin daftar paling lengkap sampai saat ini yang pernah saya lihat. Anda dapat menyusun daftar ini dengan pernyataan case/switch dan memasukkannya sebagai bagian dari distribusi perangkat lunak Anda.

Sebenarnya ada skrip di bagian bawah halaman itu yang melakukan hal itu. Jadi, Anda cukup mengunduh dan menggunakan skrip sebagai pihak ketiga untuk distribusi perangkat lunak Anda.

skrip

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

CATATAN: Skrip ini seharusnya terlihat familier, ini adalah versi terbaru dari Novell!

Skrip ruang kaki

Metode lain yang saya lihat digunakan adalah menggulung skrip Anda sendiri, mirip dengan metode Novell di atas tetapi menggunakan LSB sebagai gantinya. Artikel ini berjudul:Metode Generik untuk Menentukan Nama Distribusi Linux (atau UNIX), menampilkan salah satu metode tersebut.

# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
    # If available, use LSB to identify distribution
    if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
        export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
    # Otherwise, use release info file
    else
        export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
    fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME

Potongan kode ini dapat dimasukkan ke dalam /etc/bashrc sistem atau beberapa file semacam itu yang kemudian akan mengatur variabel lingkungan $DISTRO .

gcc

Percaya atau tidak metode lain adalah dengan memanfaatkan gcc . Jika Anda menanyakan perintah gcc --version Anda akan mendapatkan distro tempat gcc dibuat, yang selalu sama dengan sistem yang menjalankannya.

Fedora 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

CentOS 5.x

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.

CentOS 6.x

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.

Ubuntu 12.04

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

TL;DR;

Jadi yang mana yang harus saya gunakan? Saya cenderung menggunakan lsb_release -a untuk semua distribusi Linux yang sering saya gunakan (RedHat, Debian, Ubuntu, dll.). Untuk situasi saat Anda mendukung sistem yang tidak menyediakan lsb_release Saya akan membuat sendiri sebagai bagian dari distribusi perangkat lunak yang saya sediakan, mirip dengan salah satu skrip di atas.

PEMBARUAN #1:Tindak lanjut dengan SuSE

Saat berbicara dengan @Nils di komentar di bawah, ditentukan bahwa untuk alasan apa pun, SLES11 tampaknya menghentikan LSB agar tidak diinstal secara default. Itu hanya instalasi opsional, yang tampaknya berlawanan dengan paket yang menyediakan jenis fitur utama ini.

Jadi saya mengambil kesempatan untuk menghubungi seseorang dari proyek OpenSuSE untuk mengetahui alasannya.

kutipan email

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Ini tanggapan Rob

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 

Karena Anda mungkin tidak dapat memasang facter di server jarak jauh, Anda dapat meniru apa yang dilakukannya untuk menemukan nama OS. Kode Ruby untuk operatingsystem fakta dapat ditemukan di sini di pastebin. Pada dasarnya, ini terlihat melalui *-release yang berbeda file dan lainnya untuk menentukan nama OS.

Beberapa file yang dilihatnya:

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

Maaf jika Anda menemukan duplikat dalam daftar ini, saya membuatnya dengan cepat dengan grep . Seharusnya cukup mudah (walaupun agak membosankan) untuk mem-porting ini ke skrip shell POSIX.


Jika Anda memiliki python diinstal (tidak masalah apakah Python 3 atau Python 2), Anda dapat mengetahui nama distribusi tanpa menemukan kembali roda :

python -c "import platform;print(platform.linux_distribution()[0])"

Linux
  1. Bagaimana saya bisa mendapatkan folder temp dari mesin yang menjalankan maven?

  2. Bagaimana cara mendapatkan sistem operasi saat ini di MSBuild?

  3. Bagaimana cara mengubah waktu sebelum sistem terkunci?

  1. Bagaimana cara memeriksa tanggal instalasi sistem operasi linux Anda?

  2. Bagaimana cara memastikan sistem saya menggunakan file ~/.screenrc?

  3. Bagaimana cara mendapatkan nama komputer (bukan nama hostnya)?

  1. Linux – Bagaimana Cara Mendapatkan Nama Sistem Operasi yang Andal?

  2. Linux:Bagaimana Mendapatkan Semua Log Masuk Dari Sistem?

  3. Bagaimana saya bisa mendapatkan status keyboard di Linux?