如何确定Linux内核体系结构?


92

uname -muname -m在Red Hat Enterprise Linux Server 5.4版(Tikanga)机器中提供i686并提供i686 i386输出。我需要在该计算机上安装Oracle数据库10g第2版。那么,如何确定内核体系结构是32位还是64位呢?


10
那是在第一个句子一个错字:uname -muname -m
tshepang 2011年

另请参见Linux命令以返回位数(32或64)?。如果uname -m显示i?86,则说明您有32位系统。
吉尔斯


Gilles链接到的问题提供了一个有趣的解决方案:getconf WORD_BIT
Mikel

7
getconf WORD_BIT在我的64位Ubuntu上返回32
minaev 2011年

Answers:


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 2013年

1
@ user7543这是32位的ARM,因为我们还没有64位的ARM。
Behrooz

我觉得我应该做我的答案社区Wiki,但不知道如何做。
Behrooz

1
试试:uname -m。那只会显示架构。
Alexej Magura


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。
penguin359

1
@ penguin359表示cpu支持64位。
xenoterracide

@xeno因此不能用于确定内核体系结构。
penguin359

@ penguin359不,答案不清楚吗?
xenoterracide

1
@ penguin359,否,但通常有用的方法是查明您​​的操作系统是否正在运行64位,如果不是,则
查看

22

(编辑:这个答案是错误的。感谢@Lizardx的评论)

在Bash中,使用整数溢出:

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

这比调用另一个进程或打开文件要有效得多。


3
如此聪明,也让我们想起了什么是芯片体系结构
code_monk

2
虽然优雅,但不幸的是这是不正确的:uname -m == i686但是,如果((1 << 32)); 然后echo 64bits; fi == 64bits这是32位的PAE内核,而不是64位的内核。CPU支持64位,而amd64。由于问题是如何确定内核拱门,因此该解决方案将产生错误的结果。
Lizardx '16

1
注意((是一种Bashism,未由POSIX定义。mywiki.wooledge.org/Bashism#Conditionals
Steven Penny

我已经在某些32位体系结构上进行了尝试,并且认为它是64位。
dannyw '17

这可以正常工作((1<<32)-1)
Ivijan StefanStipić,18年

15

对于Debian

在我的电脑上

    〜> dpkg-打印架构
    amd64
    〜> dpkg --print-foreign体系结构
    i386

我的Raspberry Pi 2

    〜> dpkg-打印架构
    臂架

1
这在确定要与checkinstallthx 一起使用的软件包体系结构时效果最好!
Aquarius

谢谢。我一直在寻找可以删除“标准”“ amd64” /“ i386”体系结构名称的东西,而不仅仅是“ x86_64”。在命名预编译发行版时,没有人使用该术语。
悬崖

12

最简单的方法是运行:

getconf LONG_BIT

它将输出64或32,具体取决于它是32位还是64位。

例如:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
这个答案是误导的。如果启用了多体系结构支持并安装了64位内核,getconf LONG_BIT32尽管您正在运行64位内核,但仍会打印32位安装。
肯'18

2

使用syscapFormake项目

syscap允许探查许多系统属性并测试依赖项。这是一个可移植的shell脚本。

获取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上的此答案
吉尔斯

从理论上讲,它们可能有所不同,但是在任何实际安装中它们是否有可能不匹配?
米纳夫2011年

一些发行版在x86版本上附带了一个amd64内核。我不知道有多少人使用它们,我检查了Debian popcon,但它与各种统计数据之间没有关联。我认为主要用例是拥有32位主操作系统并在chroot或VM中运行64位操作系统。
吉尔斯

@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

如果您正在寻找一个简单的单线,这是我发现的最可靠的解决方案,它返回6432。不管您是否运行ARM,它都可以在使用bashsh的任何系统上运行。

请注意,这将假定系统是32位还是64位。如果您需要检测8-16位或其他位结构,请参见下面的说明。

[$((0xffffffff))-eq -1] &&回声32 || 回声64

这里是什么?
逻辑非常简单,并且都归结为计算机如何存储带符号整数。32位体系结构只有32位可用于存储带符号整数,而64位体系结构则具有64位!换句话说,可以存储的整数集是有限的。该组的一半代表负数,一半代表正数。等于-1的有符号整数表示为可以存储在该体系结构的给定位数中的最大数字。在32位系统上,-1可以用十六进制值0xFFFFFFFF表示(这是32个二进制位,都等于1)。在64位系统上,0xFFFFFFFF转换为4,294,967,295,以10为底,而0xFFFFFFFFFFFFFFFF表示-1)。您会看到这对于8位或16位系统(在0xFF和0xFFFF等于-1)的系统如何轻松扩展,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.