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

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

リモートシステムにログインしているとしましょう。どのようにしてシステムが実行されているかを知ることができますか?最近のほとんどのLinux(Linuces?)には、lsb_releaseがあります。 コマンド:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

私が知る限り、これは/etc/lsb-releaseと同じ情報を提供します 。そのファイルが存在しない場合はどうなりますか? lsb_releaseを思い出したようです コマンドは比較的新しいので、古いシステムのOSを入手する必要がある場合はどうなりますか?

いずれにせよ、lsb Linux Standard Baseの略です したがって、Linux以外のユニスでは機能しないと思います。私の知る限り、unameからこの情報を取得する方法はありません。 では、lsb_releaseを使用しないシステムでこれを取得するにはどうすればよいですか。 ?

承認された回答:

lsb_release -a この情報を見つけ出し、一貫した方法でそれを行うことができるようにするための最良の選択肢になる可能性があります。

LSBの歴史

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

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

憲章からの抜粋

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

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

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

批判

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

ノベル

検索すると、「Novellからの基盤となるLinuxディストリビューションの検出」というタイトルのかなり古いページに出くわす可能性があります。これは、私が実際に見た数少ない場所の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で管理されている次のページが表示されます。タイトルは次のとおりです。/etc/releaseさまざまなLinux(およびその他のUnix)ディストリビューションに相当します。これはおそらく、私がこれまでに見た中で最も網羅的なリストです。このリストを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スクリプトの最新バージョンです!

関連:ログローテーションされたファイルの `tail -f`を実行するにはどうすればよいですか?

レッグルームスクリプト

私が採用しているもう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

信じられないかもしれませんが、別の方法は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

ここにロブの回答があります

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 

Linux
  1. Linuxの「検索」でファイル名のみを取得するには?

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

  3. Linux の C/C++ でユーザー名を取得するには?

  1. Linux で物理ディスクの数を取得するには?

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

  3. コンピューター名 (ホスト名ではない) を取得するには?

  1. Linuxでスレッドに名前を付ける方法は?

  2. Linux ディストリビューション名とバージョンを取得するには?

  3. Linuxでファイルの物理サイズを取得するには?