Linuxカーネルアーキテクチャの決定方法


92

uname -muname -mRed Hat Enterprise Linux Serverリリース5.4(Tikanga)マシンでi686およびi686 i386出力を提供します。そのマシンにOracle Database 10gリリース2をインストールする必要があります。それでは、カーネルアーキテクチャが32ビットか64ビットかをどのように判断できますか?


10
ことは、最初の文に誤植ですuname -muname -m
シェパン

ビット数(32または64)を返すLinuxコマンドも参照してください。場合uname -mを示して私?86、あなたは、32ビットシステムを持っています。
ジル


Gillesリンク先の質問は、興味深い解決策を提供しますgetconf WORD_BIT
ミケル

7
getconf WORD_BIT64ビットUbuntuで32を返す
-minaev

回答:


90

i386とi686は両方とも32ビットです。
x86_64は64ビットです

64ビットの例:

behrooz@behrooz:~$ uname -a  
Linux behrooz 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 **x86_64** GNU/Linux

編集:私のLinux ARM 32または64ビットを
参照してくださいARM用


armv7lはどうですか?いずれにせよ、単純なブール応答を伴うコマンドはおいしいでしょう。
user7543

1
@ user7543 64ビットARMがまだないので、ARM 32ビットです。
Behrooz

回答コミュニティwikiを作成する必要があるように感じますが、方法がわかりません。
Behrooz 14

1
試してくださいuname -m。それはアーキテクチャのみを示します。
アレクセイマグラ


32

@behroozは正しいです。残念ながらuname、アーキテクチャを知る必要があります。実際、アーキテクチャのリストを探していましたが、あなたの質問に答えるこの記事を見つけました。に関してuname -m

x86_64 GNU / Linuxは、64ビットLinuxカーネルが実行されていることを示します。i386 / i486 / i586 / i686を使用する場合は、32ビットカーネルです。

ハードウェアが64ビットカーネルを実行できるかどうかを判断するには

grep flags /proc/cpuinfo

出力で次を探します(同じ質問に対するこのstackoverflow回答から取得されたすべてのフラグ)

  • lm フラグはロングモードCPU-64ビットCPUを意味します
  • tm フラグは保護モードを意味します-32ビットCPU
  • rm フラグはリアルモード-16ビットCPUを意味します

lmフラグは単にCPUが64ビットをサポートしているのか、それとも64ビットで実行されているのかを意味します。64ビットの場合はx86_64、32ビットの場合はi?86であることがわかっているため、アーチに依存することをお勧めします。
ペンギン359

1
@ penguin359は、CPUが64ビットをサポートすることを意味します。
xenoterracide

@xenoなので、カーネルアーキテクチャを決定するために使用することはできません。
ペンギン359

@ penguin359いいえ、答えははっきりしませんでしたか?
xenoterracide

1
@ penguin359は、ないが、それはあなたのOSが64ビットを実行しているかどうかを確認するために便利だし、そうでない場合は、ハードウェアは芋、可能であれば
xenoterracide

22

(編集:この答えは間違っています。@ Lizardxのコメントのおかげで)

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

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

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


3
とても賢く、またチップアーキテクチャとは何かを思い出させます
-code_monk

2
エレガントですが、これは残念ながら正しくありません:uname -m == i686 BUT if((1 << 32)); echo 64bits; fi == 64bitsこれは、64ビットカーネルではなく、32ビットのPAEカーネルです。CPUは64ビット対応ですが、amd64です。問題はカーネルアーチを決定する方法であるため、このソリューションでは誤った結果が得られます。
リザード


いくつかの32ビットアーキテクチャでこれを試しましたが、これは64ビットだと思います。
dannyw

これはうまくいく可能性があります((1<<32)-1)
イビジャンステファンスティピッチ

15

以下のためのDebian

私のPCで

    〜> dpkg --print-architecture
    amd64
    〜> dpkg --print-foreign-architectures
    i386

私のラズベリーパイ2

    〜> dpkg --print-architecture
    armhf

1
これはcheckinstall、thx!で使用するパッケージアーキテクチャを決定するときに最適に機能します。
アクエリアスパワー

ありがとうございました。私は「x86_64」ではなく「標準」の「amd64」/「i386」アーキテクチャ名を落とすようなものを探していました。プリコンパイル済みリリースに名前を付けるときに、この用語を使用する人はいません。
クリフ

12

最も簡単な方法は次を実行することです:

getconf LONG_BIT

32ビットか64ビットかに応じて、64または32を出力します。

例えば:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
この答えは誤解を招くものです。マルチアーキテクチャサポートを有効にして、64ビットカーネルをインストールしている場合、64ビットカーネルを実行しているにもかかわらず、32ビットインストールで64ビットカーネルgetconf LONG_BITが印刷され32ます。
ケン

2

Formakeプロジェクトのsyscapを使用

syscapを使用すると、多くのシステムプロパティをプローブし、依存関係をテストできます。移植性のあるシェルスクリプトです。

CPUアーキテクチャを取得します。

syscap info -arch

カーネル名とバージョンを取得します。

syscap info -kernel -kernver

1

別の方法は、システムファイルがコンパイルされたアーキテクチャをチェックすることです

$ file /usr/bin/ld
/usr/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

1
これがシステムアーキテクチャであり、常にカーネルアーキテクチャとは限りません。その他のバリエーションについては、SUこの回答を参照してください。
ジル

理論的には異なる場合がありますが、実際のインストールでは不一致になる可能性はありますか?
ミネエフ

一部のディストリビューションには、x86バージョンでamd64カーネルが付属しています。どのくらいの人がそれらを使用しているのかわかりません。Debianpopconをチェックしましたが、さまざまな統計とは相関していません。主な使用例は、32ビットのメインOSを持ち、chrootまたはVMで64ビットのOSを実行することだと思います。
ジル

@Gilles新しいx32アーキテクチャについて読んでくれるものを気に入っていただけると思います。手遅れにならないなら、もちろん。wiki.debian.org/X32Port
Behrooz

0

または、独自のものを実装する場合は、unameコマンドが内部的に行う方法を使用できます。

#include <sys/utsname.h>
#include <stdio.h>

int main() {
    struct utsname name;
    uname(&name);
    printf("%s\n",name.machine);
    return 0;
}

0

を使用する別の方法を次に示しunameます。

からman uname

... -i, --hardware-platform print the hardware platform or "unknown" ...

# uname -i x86_64 #


「不明」になるまで
Dagelf

0

あなたがシンプルなワンライナーを探しているなら、これは64または32を返す私が見つけた最も信頼できるソリューションです。ARMを実行しているかどうかは関係なく、bashまたはshを使用するすべてのシステムで動作するはずです。

注意してください、これはシステムが32ビットまたは64ビットのいずれかであると仮定します。8-、16、またはその他のビットアーキテクチャを検出する必要がある場合は、以下の説明を参照してください。

[$((0xffffffff))-eq -1] && echo 32 || エコー64

ここで何が起きているのですか?
ロジックは非常にシンプルで、すべてがコンピューターが符号付き整数を格納する方法に要約されます。32ビットアーキテクチャには符号付き整数の保存に使用できる32ビットしかありませんが、64ビットアーキテクチャには64ビットがあります!つまり、格納できる整数のセットは有限です。このセットの半分は負の数を表し、半分は正の数を表します。-1に等しい符号付き整数は、そのアーキテクチャの特定のビット数に格納できる最大数として表されます。32ビットシステムでは、-1は16進値0xFFFFFFFF(32バイナリビット、すべて1)で表すことができます。64ビットシステムでは、0xFFFFFFFFはベース10の4,294,967,295に変換されますが、0xFFFFFFFFFFFFFFFFは-1の表現です。0xFFと0xFFFFで-1に等しい8または16ビットのシステムでも、これがどのように簡単にスケーリングするかを見ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.