如何确定给定的Linux是32位还是64位?

475

当我输入命令 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

如何从这个信息中得知给定的操作系统是32位还是64位?

例如,在编写configure脚本时会很有用:我要为哪种架构构建?

21个回答

747
尝试使用 uname -m。 它是 uname --machine 的缩写,它会输出:
x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel
否则,您需要在CPU上输入以下命令:与Linux内核无关
cat /proc/cpuinfo

或:

grep flags /proc/cpuinfo

在"flags"参数下,您会看到各种值:What do the flags in /proc/cpuinfo mean? 其中之一是名为lm的标志:Long Mode (x86-64:amd64,也称为Intel 64,即64位能力)

lm ==> 64-bit processor

或者使用lshw(如下面Rolf of Saxony提到的那样),不需要sudo(仅用于过滤CPU宽度):

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

注意:您可以安装32位内核的64位CPU
(正如ysdx他/她自己的回答中提到的那样,"现在,一个系统可以多架构,所以这也没有任何意义。您可能需要找到编译器的默认目标")


4
仅通过在/proc/cpuinfo文件中执行“grep flags”命令,只能告诉您CPU是否为64位。就我理解的问题而言,它是关于操作系统的。uname -m 命令仅告诉我“i686”。 - Kim Stebel
3
我在64位硬件上运行着一个32位内核,使用命令'uname -m'会得到"x86_64"的输出(在Debian上)。根据uname命令的手册,-m参数显示机器的硬件名称,因此这似乎是正确的。 - Tony Meyer
1
如果我在一台64位的机器/处理器上运行32位内核,uname -iuname -puname -m会显示什么? - ruben2020
4
如果 TM 和 LM 都同时存在,会怎样? - Javier Novoa C.
4
@JavierNovoaC. tm(热监测器)表示自动时钟控制。它与区分32位处理器无关。事实上,只有当你拥有64位CPU时,才会出现lm(长模式)。因此,你应该只依赖lm。否则,Thomas Watnedal给出的答案是最好的。这个答案是错误的,并且已经误导了很多人,请管理员采取行动。 - Issam T.
显示剩余7条评论

154

如果您正在运行64位平台,您将在uname -a的输出中看到x86_64或非常相似的内容。

要获取您特定机器的硬件名称,请运行

uname -m

您还可以调用

getconf LONG_BIT

返回32或64


4
uname -m 输出 x86_64 表示系统架构为 64 位; getconf LONG_BIT 输出 32 表示操作系统运行在 32 位模式下。 两者都是正确的,但输出的信息不同。 - Stephan
11
这意味着你的 CPU 是 64 位的,但你只安装了一个 32 位操作系统在上面,即使你本可以使用一个 64 位的操作系统。 - user14038
1
Steve Kemp是正确的,所以要小心(例如2009年的MacBook上的Mac OS X 10.5,其中操作系统是32位的,但它能够运行64位应用程序)。 - jww
1
uname -m 对于 QP 的 configure 来说并不是有用的,因为它可能会给出错误的结果。getconf LONG_BIT 可以获取 C 库的默认位数,但这个值可能不是由 CC 指定的编译器所需要的正确位数。 - user3710044
2
如果已经构建为32位应用程序(通常是64位内核运行的32位用户空间),则getconf LONG_BIT可能会提供32。 - ysdx
uname -m 输出 x86_64,getconf LONG_BIT 输出 64。这是什么意思?:\ - Jain Nidhi

45

lscpu 命令将列出你的 CPU 的以下信息以及其他相关信息:

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

3
输出 CPU 的物理能力,对当前操作系统的用户空间有用,但不太可靠。 - user3710044
完全错误。问题是运行的操作系统是什么。42个赞?我会投反对票,但它会被淹没。 - Albert van der Horst

33

另一个有用的简便确定命令如下:

命令:

getconf LONG_BIT

答案:

  • 如果操作系统是32位,则为32
  • 如果操作系统是64位,则为64

3
在Itanium 64上的HP-UX 11.31i情况下不适用:该命令返回32。 - Gabriel Hautclocq
我猜这完全取决于提问者对“64位”的理解 - 它曾经表示整数的自然大小,但现在通常用于表示寻址大小。 - Toby Speight

12

该命令

$ arch    

等同于

$ uname -m

但是打字速度是原先的两倍


2
同意,但我相信打字速度对大多数开发人员来说不是问题。 - williamcarswell
2
这将返回内核支持的进程类型。在64位内核上运行32位用户空间是可能的,甚至是合理的。 - user3710044
1
arch命令并不是每个Unix系统都有,而uname应该是通用的。 - Gabriel Hautclocq

11
#include <stdio.h>

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

2
可以工作,但似乎是在Linux上实现stdio.h的细节,存在更好的解决方案,例如:limits.h,请勿使用。 - user3710044

11

我特别关注在Debian中构建软件的问题(安装的Debian系统可以是32位版本,也可以是64位版本),需要注意的是,其内核、库等也需要相应地匹配32位或64位。

当创建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的命令行选项打印其中一个变量或者根据其值进行测试。
我不知道dpkg-architecture是如何推断架构的,但你可以查看其文档或源代码(dpkg-architecture和大部分dpkg系统通常是用Perl编写的)。

你可以直接使用命令:dpkg --architecture 来获取主机系统的架构,这不需要安装 dpkg-dev 包。 - Mark Longair
这会导致在14.04的dpkg 1.17.5ubuntu中出现“dpkg:错误:未知选项--architecture”。不过,已安装dpkg-dev的dpkg-architecture可以正常工作。 - timurb
2
命令 dpkg --print-architecture 自 Debian 诞生以来就一直可用。这个命令可以使用,但是只限于 Debian 及其衍生版本。 - user3710044

10

如果您的操作系统是64位,那么在运行uname -a命令后输出中,您会看到x86_64 或者 ia64,而不是 i686。如果输出中没有这两个字符串,则表示您使用的是32位操作系统(请注意这并不意味着您的CPU不支持64位)。


1
这将返回内核支持的进程类型。在64位内核上运行32位用户空间是可能的,甚至是合理的。 - user3710044
uname输出中还有其他值可以指示64位操作系统。并非全世界都是x86或Itanium... - Toby Speight

6

现在,一个系统可以是多架构的,因此无论如何都没有意义。您可能想要找到编译器的默认目标:

$ cc -v 2>&1 | grep ^Target
Target: x86_64-pc-linux-gn

您可以尝试编译一个hello world程序:

$ echo 'int main() { return 0; }' | cc -x c - -o foo
$ file foo
foo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b114e029a08abfb3c98db93d3dcdb7435b5bba0c, not stripped

1
由于 cc -v | grep … 已经是特定于编译器的,因此可以直接使用 cc -dumpmachine,它不需要使用 grep,并且不仅被 GCC 支持。 - Anton Samsonov
鉴于问题暗示它是针对配置脚本的,这可能是此处最有用和相关的答案。它将在所有重要情况下实现您想要的功能(包括在64位操作系统上进行32位用户chroot、为外部架构进行交叉编译等)。 - Toby Speight

6

1
这是 /bin/bash 的内置变量,不是环境变量。如果您已经依赖于 Bash,则可以正常工作。但是,请注意结果可能是 i386i486i586i686 或其他值。 - user3710044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接