web-dev-qa-db-ja.com

Linuxカーネルアーキテクチャを特定する方法

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

105
user2914

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

編集:
参照 ARMの場合、私のLinux ARM 32または64ビットですか?

99
Behrooz

それは簡単です! Archコマンドを使用します。

49
PHPst

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

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

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

grep flags /proc/cpuinfo

出力で以下を探します(同じ質問に対して this stackoverflow answer から取得されたすべてのフラグ)

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

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

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

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

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

21
Luchostein

Debianの場合:

私のPCで

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

私のラズベリーパイ2

〜> dpkg --print-architecture 
 armhf 

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

getconf LONG_BIT

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

例えば:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64
13
dannyw

Formakeプロジェクト からsyscapを使用します==

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

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

syscap info -Arch

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

syscap info -kernel -kernver
2
Alex

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

$ 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
minaev

または、何かを独自に実装したい場合は、内部でnameコマンドが実行する方法を使用できます。

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

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

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

man unameから:

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

# uname -i x86_64#

0
clusterdude

シンプルなワンライナーを探している場合、これは64または2を返す最も信頼できるソリューションです。 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の表現です。これが、8ビットまたは16ビットのシステムでも、それぞれ0xFFおよび0xFFFFで-1に等しくなるように簡単にスケーリングできることがわかります。

0
b_laoshi