GNU/Linux >> Linux の 問題 >  >> Linux

オペレーティング システムの名前を確実に取得するにはどうすればよいですか?

lsb_release -a この情報を見つけ出し、一貫した方法でそれを行うための最良のオプションになる可能性があります。

LSBの歴史

lsb そのコマンドでは、さまざまな Linux ディストリビューションで基本的な種類のことを行うための一般的な方法を提供するために、Linux Foundation が後援する包括的なプロジェクトであるプロジェクト Linux Standards Base を表しています。

このプロジェクトは任意であり、ベンダーは単なるユーザーとしてプロジェクトに参加することも、さまざまな Linux ディストリビューション内で標準化を推進するのに役立つさまざまなモジュールに関するさまざまな仕様のファシリテーターとして参加することもできます。

憲章からの抜粋

<ブロック引用>

LSB ワークグループは、その中心的な目標として、これら 2 つの懸念に対処する必要があります。主要なディストリビューション ベンダーと協議して、ディストリビューションがサポートしなければならない API の最小セットを説明する標準を公開します。また、標準のサポートを測定するテストとツールを提供し、アプリケーション開発者が共通セットをターゲットにできるようにします。最後に、テスト作業を通じて、ディストリビューション間の不必要な相違を防ぐよう努めています。

LSB に関連する便利なリンク

  • LSB憲章
  • LSB ワークグループ
  • LSB ロードマップ
  • LSB メーリング リスト (現在の活動はこちら!)
  • 認定 LSB 製品のリスト
  • LSB ウィキペディア ページ

批判

LSB には、Debian などのディストリビューションで問題となる多くの問題があります。 RPM の強制使用は 1 つです。詳細については、ウィキペディアの記事を参照してください。

ノベル

検索すると、「Detecting Underlying Linux Distro from Novell.これは、いくつかの主要なディストリビューションと、使用している基になるディストリビューションを検出する方法を示す実際のリストを見た数少ない場所の 1 つです。

抜粋

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

この同じページには、バニラ uname だけを使用して上記を成文化しようとする便利なスクリプトも含まれています コマンド、および上記のファイルのいずれかの存在。

注: このリストは古いものですが、Mandrake などの古いディストリビューションをリストから簡単に削除して、代替品に置き換えることができます。このタイプのスクリプトは、Solaris および Linux のバリアントの大部分をサポートしようとしている場合、1 つのアプローチになる可能性があります。

Linux マフィア

さらに検索すると、Linuxmafia.com で管理されている次のページが表示されます。タイトルは次のとおりです。さまざまな Linux (およびその他の Unix) ディストリビューションに相当する /etc/release 。これはおそらく、これまでに見た中で最も網羅的なリストです。このリストを case/switch ステートメントで体系化し、ソフトウェア配布の一部として含めることができます。

実際、そのページの下部に、まさにそれを行うスクリプトがあります。そのため、スクリプトをダウンロードして、ソフトウェア配布のサード パーティとして使用することができます。

スクリプト

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

注: このスクリプトは見覚えがあるはずです。Novell スクリプトの最新バージョンです!

レッグルーム スクリプト

私が採用したもう 1 つの方法は、独自のスクリプトをロールすることです。これは、上記の Novell の方法に似ていますが、代わりに LSB を使用します。この記事「Linux (または UNIX) ディストリビューション名を決定する一般的な方法」では、そのような方法の 1 つを示しています。

# 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

このコードのチャンクは、システムの /etc/bashrc に含めることができます または、環境変数 $DISTRO を設定するようなファイル .

gcc

信じられないかもしれませんが、もう 1 つの方法は gcc を利用することです。 .コマンド gcc --version をクエリすると、 gcc が構築されたディストリビューションが得られます。これは、それが実行されているシステムと常に同じです。

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;

では、どちらを使用すればよいでしょうか。私は lsb_release -a を使う傾向があります 私が頻繁に使用する Linux ディストリビューション (RedHat、Debian、Ubuntu など) の場合。 lsb_release を提供しないシステムをサポートしている場合 上記のスクリプトの 1 つと同様に、私が提供しているソフトウェアの配布の一部として、独自のスクリプトを作成します。

更新 #1:SuSE のフォローアップ

以下のコメントで @Nils と話していると、何らかの理由で SLES11 が LSB をデフォルトでインストールしないように見えることが判明しました。これは単なるオプションのインストールであり、この種の重要な機能を提供するパッケージに対抗するように見えました.

そこで、OpenSuSE プロジェクトの担当者に連絡を取って、その理由を探りました。

メールの抜粋

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

これが 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 

おそらく facter をインストールできないので リモートサーバーでは、OS 名を見つけるために何をするかを模倣できます。 operatingsystem の Ruby コード 事実はこちらのペーストビンにあります。基本的に、別の *-release を調べます OS名を決定するためのファイルなど。

参照するファイルの一部:

/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

このリストに重複がある場合は申し訳ありませんが、 grep ですばやく作成しました .これを POSIX シェル スクリプトに移植するのはかなり簡単です (少し面倒ですが)。


python の場合 インストールされている場合 (Python 3 か Python 2 かは関係ありません)、車輪を再発明することなくディストリビューション名を見つけることができます :

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

Linux
  1. Linuxオペレーティングシステムのインストール日を確認するにはどうすればよいですか?

  2. Linux:システムからすべてのログインログを取得する方法は?

  3. Makefile でユーザー名を取得するにはどうすればよいですか?

  1. Python でオペレーティング システムを確認するにはどうすればよいですか?

  2. MSBuild で現在のオペレーティング システムを取得する方法は?

  3. システムがロックされるまでの時間を変更するにはどうすればよいですか?

  1. Linux –オペレーティングシステムの名前を確実に取得するにはどうすればよいですか?

  2. システムが ~/.screenrc ファイルを使用していることを確認するにはどうすればよいですか?

  3. 実行中のプロセスのウォールクロック時間を取得するにはどうすればよいですか?