特定のLinuxが32ビットか64ビットかを判別する方法は?


470

と入力するとuname -a、次の出力が表示されます。

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux

これから、特定のOSが32ビットまたは64ビットであることをどのようにして知ることができますか?

これはconfigure、スクリプトを作成する場合などに便利です。たとえば、どのアーキテクチャを構築するのですか?

回答:


735

お試しくださいuname -m。これは不足してuname --machineおり、次のように出力されます。

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

それ以外の場合は、Linuxカーネルではなく、CPUに対して次のように入力します。

cat /proc/cpuinfo

または:

grep flags /proc/cpuinfo

「フラグ」パラメータの下で、あなたはさまざまな値が表示されます。「を参照してください?PROC / cpuinfoの/中フラグが何を意味するのか」その中でも、1の名前はlmLong Modex86-64の:AMD64、また、すなわち64ビットIntel 64、として知られています対応)

lm ==> 64-bit processor

または、使用lshwせずに(以下Rolf of Saxonyが言及)、なしsudo(CPU幅をgrepするためだけ):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'

注:64ビットCPUと32ビットカーネルをインストールできます。
(ようysdxがに言及し、彼/彼女の自身の答え、「今日では、システムができmultiarchそれはとにかく意味がありませんので。あなたは、コンパイラのデフォルトターゲットを見つけたいかもしれません」)


3
grepフラグ/ proc / cpuinfoは、CPUが64ビットかどうかを通知するだけです。私の質問を理解すると、それはOSに関するものでした。uname -mは "i686"だけを教えてくれます。
キム・スティーベル09/08/23

3
64ビットのハードウェアに32ビットのカーネルがあり、「uname -m」(Debian)から「x86_64」を取得します。unameのmanページには、-mはマシンのハードウェア名を表示するため、正しいように見えます。
Tony Meyer

1
私は、64ビットマシン/プロセッサ上で実行されている32ビットカーネルを持っているものならばuname -iuname -puname -m示して?
ruben2020 2013年

4
tmとlmの両方が存在する場合はどうなりますか?
Javier Novoa C.

4
@JavierNovoaC。tm(Thermal Monitor)は自動クロック制御を示します。32ビットプロセッサの区別とは関係ありません。実際、64ビットCPUを使用している場合にのみ、lm(ロングモード)が存在します。そのため、lmのみに依存する必要があります。それ以外の場合は、Thomas Watnedalの回答が最適です。この答えは間違っており、plzモデレーターがそれについて何かをする多くの人々を欺きました。
Issam T. 2014

153

64ビットのプラットフォームを実行している場合は、x86_64またはuname -aの出力に非常に類似したものが表示されます。

特定のマシンのハードウェア名を取得するには

uname -m

あなたも呼び出すことができます

getconf LONG_BIT

32または64を返します


4
uname -m出力x86_64 getconf LONG_BIT出力32どちらが正しいですか?:\
ステファン

10
つまり、CPUは64ビットですが、64ビットのオペレーティングシステムを使用できたとしても、32ビットのオペレーティングシステムしかインストールしていません。

1
Steve Kempは
正解

1
これuname -mconfigure、誤った結果をもたらす可能性があるため、QPには役立ちません。getconf LONG_BIT指定された、によってのために正しいサイズではないかもしれないCライブラリのデフォルトのビットサイズを取得CC、コンパイラを。
user3710044

2
getconf LONG_BIT32ビットアプリケーションとして構築された32 igを提供する場合があります(通常、32ビットユーザーランドを実行する64ビットカーネル)。
ysdx 2015

42

lscpu あなたのCPUに関する他の情報の中でこれらをリストします:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

3
CPUの物理機能を出力します。現在のOSの現在のユーザー空間では、有用ですが信頼性がありません。
user3710044

33

簡単に判断するためのもう1つの便利なコマンドは次のとおりです。

コマンド:

getconf LONG_BIT

回答:

  • 32、OSが32ビットの場合
  • 64、OSが64ビットの場合

2
このコマンドが返す32:Itaniumの64のHP-UX 11.31iの場合は真実ではない
ガブリエルHautclocq

それはすべて、質問者が「64ビット」で何を意味するかに依存していると思います。以前は整数の自然なサイズを意味していましたが、現在では代わりにアドレス指定サイズを意味するように使用されることがよくあります。
Toby Speight 2017

12

コマンド

$ arch    

に相当

$ uname -m

入力速度は2倍です


2
同意しましたが、タイピング速度はほとんどの開発者にとって問題ではないと確信しています。
williamcarswell 2014

2
これは、カーネルがサポートできるプロセスタイプを返します。64ビットのカーネルで32ビットのユーザー空間を実行することは可能であり、合理的です。
user3710044

1
unameは使用できるはずですが、archコマンドはすべてのUNIXシステムで使用できるわけではありません。
Gabriel Hautclocq

11

Debianでソフトウェアをビルドするためにこれについて特に疑問に思っていました(インストールされているDebianシステムは、32ビットカーネル、ライブラリなどを備えた32ビットバージョン、または64ビット用にコンパイルされたものを備えた64ビットバージョンの場合があります) 32ビット互換モードではなくビット)。

Debianパッケージ自体は、プラットフォームアーキテクチャを含むすべてのメタデータを含むパッケージを実際に作成するときに、(もちろん)アーキテクチャを知る必要があるため、他のパッケージツールや使用するスクリプト用に出力するパッケージツールがあります。dpkg-architecture。これには、ビルド用に構成されているものと現在のホストの両方が含まれています。(通常、これらは同じです。)64ビットマシンでの出力例:

DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_OS=linux
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu

dpkg -architectureのコマンドラインオプションを使用して、これらの変数の1つだけを出力するか、それらの値に対してテストを実行できます。

dpkg-architectureがどのようにアーキテクチャを推定するのかはわかりませんが、そのドキュメントやソースコードを見ることができます(dpkg-architectureと一般的なdpkgシステムの多くはPerlです)。


あなたは単に使用することができます:パッケージをインストールdpkg --architectureする必要のないホストシステムアーキテクチャを取得するためにdpkg-dev
Mark Longair、

これによりdpkg: error: unknown option --architecture、14.04のdpkg 1.17.5ubuntuが生成されます。ただし、dpkg-architecture(dpkg-devがインストールされている場合)は問題なく動作します。
timurb 2014年

2
コマンドdpkg --print-architectureはDebianで永遠に機能しています。これは機能しますが、Debianとその派生物に限定されています。
user3710044

11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}

2
動作しますが、Linuxでのstdio.hの実装の詳細であるように見えます。たとえば、limits.h、DO NOT USEなどのより良いソリューションが存在します。
user3710044

10

i686の代わりに64ビットOSを使用しているx86_64場合ia64、またはの出力にありuname -aます。この2つの文字列はありません。32ビットOSを使用している(これは、CPUが64ビットではないという意味ではないことに注意してください)。


1
これは、カーネルがサポートできるプロセスタイプを返します。64ビットのカーネルで32ビットのユーザー空間を実行することは可能であり、合理的です。
user3710044

uname出力には、64ビットOSを示す他の値があります。すべての世界がx86またはItaniumであるわけではありません...
Toby Speight 2017

6

そのシステムは32ビットです。iX86 unameは、32ビットアーキテクチャであることを意味します。64ビットの場合、返されます

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 x86_64 i686 x86_64 x86_64 GNU/Linux

1
これは、カーネルがサポートできるプロセスタイプを返します。64ビットのカーネルで32ビットのユーザー空間を実行することは可能であり、合理的です。
user3710044

6

今日では、システムはマルチアーチになる可能性があるため、とにかく意味がありません。コンパイラーのデフォルトのターゲットを見つけることができます。

$ cc -v 2>&1 | grep ^ Target
ターゲット:x86_64-pc-linux-gn

Hello Worldをコンパイルしてみてください。

$ echo 'int main(){return 0; } '| cc -xc--o foo
$ファイルfoo
foo:ELF 64ビットLSB実行可能ファイル、x86-64、バージョン1(SYSV)、動的リンク、インタープリター/lib64/ld-linux-x86-64.so.2、GNU/Linux 2.6.32、BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c、除去されない

1
以来cc -v | grep …、とにかくコンパイラ固有で、1だけ使用することができますcc -dumpmachinegrepをし、GCCによってだけでなく、サポートされている必要はありません。
アントンサムソノフ2016

質問がそれが構成スクリプトに対するものであることを示唆していることを考えると、これはおそらくここで最も有用で適切な答えです。重要なすべてのケースで必要なことを実行します(64ビットOSでの32ビットユーザーchroot、外部アーキテクチャ用のクロスコンパイル、およびその他)。
Toby Speight 2017

5

「getconf LONG_BIT」の回答に関して。

私は 'C'でそれを行う簡単な関数を書きました:

/*
 * check_os_64bit
 *
 * Returns integer:
 *   1 = it is a 64-bit OS
 *   0 = it is NOT a 64-bit OS (probably 32-bit)
 *   < 0 = failure
 *     -1 = popen failed
 *     -2 = fgets failed
 *
 * **WARNING**
 * Be CAREFUL! Just testing for a boolean return may not cut it
 * with this (trivial) implementation! (Think of when it fails,
 * returning -ve; this could be seen as non-zero & therefore true!)
 * Suggestions?
 */
static int check_os_64bit(void)
{
    FILE *fp=NULL;
    char cb64[3];

    fp = popen ("getconf LONG_BIT", "r");
    if (!fp)
       return -1;

    if (!fgets(cb64, 3, fp))
        return -2;

    if (!strncmp (cb64, "64", 3)) {
        return 1;
    }
    else {
        return 0;
    }
}

「getconf」はいい考えです。


5
ばかげた考え!使用CHAR_BIT*sizeof(void*)または__WORDSIZEC.中
ceving

3
いいえ、それは愚かではありません。たとえば、32ビットの実行可能ファイルがあり、システムが64ビットの実行可能ファイルをサポートするかどうかを知りたい場合があります。
Ludvig A. Norin

GNU-Cライブラリのlongのデフォルトの長さを取得します ..これは動作します!
user3710044

1
64ビットカーネルで32ビットのユーザー空間を実行している場合、またはX32ユーザー空間でさえ実行している場合、OSは32ビットであると言うので、それは実際には間違っています。
ルスラン

強く使用しないことが示唆されたfgetsstackoverflow.com/questions/16323185/...
ceving

4

環境変数を使用して確認することもできます。

echo $HOSTTYPE

結果:

i386 -> 32ビット

x86_64 -> 64ビット

抽出元:http : //www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html


1
これは/bin/bash環境変数ではないため、組み込み変数です。すでにBashに依存している場合は、これで問題ありません。しかし、結果はすることができi386i486i586i686その他はので注意してください。
user3710044

3

Bashでは、整数オーバーフローを使用します。

if ((1 == 1<<32)); then
  echo 32bits
else
  echo 64bits
fi

別のプロセスを呼び出したり、ファイルを開いたりするよりもはるかに効率的です。


2
バッシュは、そのタイプが利用可能な場合に使用する64ビットのint型にコンパイル(?することができます)で、それは通常、今日と32ビットシステムでは、通常、「長い長い」タイプを使用するようです
user3710044

2
Debianのbashは、遅くとも2008年以降、おそらくそれ以前に64ビット演算を使用するようにコンパイルされています。この答えは、stackoverflowが存在する前から破られています。
Peter Cordes

3

getconfが使用するシステムコールは最も少ないものです。

$ strace getconf LONG_BIT | wc -l
253

$ strace arch | wc -l
280

$ strace uname -m | wc -l
281

$ strace grep -q lm /proc/cpuinfo | wc -l
301

2

1を32だけ左にシフトして1を得る場合、システムは32ビットです。1を64だけ左にシフトして1を得る場合、システムは64ビットです。

言い換えると、

if echo $((1<<32)) gives 1 then your system is 32 bit

if echo $((1<<64)) gives 1 then your system is 64 bit


"long longs"を使用するbashと同じ問題。
user3710044

32ビットを返す場合、32の実行が100%確認されているため、これは私にとってはうまくいきました。64を返す場合、bashはlong longでコンパイルされている可能性があります。
JCM 2018

1

使用可能なバイナリ(initramfsなど)が大幅に制限されている場合、私の同僚は次のことを提案しました。

$ ls -l /lib*/ld-linux*.so.2

私のALT Linuxシステムでは、i586 /lib/ld-linux.so.2とx86_64があり/lib64/ld-linux-x86-64.so.2ます。


私はそれらのうち3つを取得しました。1つは32用、1つは64用、もう1つはmx32用です。
user3710044

ええ、それが大量の64ビットライブラリを返さない場合、32ビットOSを実行しています:ls -aR | grep 64 | grep -v proc
JCM 2018


1

この間ずっと、だれも言及しなかったとは信じられません。

sudo lshw -class cpu

CPUハードウェアの速度、数量、サイズ、機能の詳細を取得します。


1

64ビットまたは32ビットを取得する単純なスクリプト

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi

1

[ -z `uname -m | grep 64` ] && echo "32-bit" || echo "64-bit"

64ビットが通常x86_64で32 ビットが通常であるという事実に基づいていますi686


-6

まず、Virtual Boxをダウンロードする必要があります。次に、新しい32ビットLinuxを選択します。次に、それを使用してLinuxを起動します。起動する場合は32ビットで、起動しない場合は64ビットです。


2
これは、システムが32ビットであるか64ビットであるかを判断するための非常に遠い方法です。
marlar

しかし、それは本当にこの問題を解決する方法です。だから私はそれをマークアップします。
firo

これは、偶数と奇数を区別する方法を思い出させます。数学では、余りを2で割った後、残りを調べます。プログラマは最下位ビットを調べます。MS SQLスペシャリストは2つのテーブルを作成し、1つは偶数用、もう1つは奇数用とし、入力がどこに
到達
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.