如何确定给定的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

从中我如何知道给定的操作系统是32位还是64位?

这在编写configure脚本时非常有用,例如:我要为哪种体系结构构建?

Answers:


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中的标志是什么意思? ”其中一个名为lmLong Modex86-64:amd64,也称为Intel 64,即64位能)

lm ==> 64-bit processor

使用lshw(如下面萨克森州罗尔夫Rolf of Saxony)所述),但不使用sudo(仅用于gpu cpu宽度):

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

注意:您可以安装具有32位内核的64位CPU
(正如ysdx他/她自己的回答中提到的:“现在,系统可以是多体系结构,因此无论如何它都没有意义。您可能想找到编译器的默认目标”)


3
grep标志/ proc / cpuinfo仅告诉您CPU是否为64位。据我了解,问题在于操作系统。uname -m仅告诉我“ i686”。
金·斯特贝尔(09年

3
我在64位硬件上具有32位内核,并从“ uname -m”(在Debian上)获取“ x86_64”。uname的手册页上说-m显示了机器的硬件名称,因此似乎是正确的。
Tony Meyer

1
如果我有一个32位内核的64位机/处理器上运行,会是什么uname -iuname -puname -m说明了什么?
ruben2020

4
如果同时存在tm和lm怎么办?
哈维尔·诺沃瓦

4
@JavierNovoaC。tm(热监控器)指示自动时钟控制。它与区分32位处理器无关。实际上,仅当您具有64位CPU时,才存在lm(长模式)。因此,这就是为什么您仅应依赖lm的原因。否则,Thomas Watnedal给出的答案是最好的。这个答案是错误的,误导了许多人。
Issam T.

153

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

运行您的特定机器硬件名称

uname -m

你也可以打电话

getconf LONG_BIT

返回32或64


4
uname -m输出x86_64 getconf LONG_BIT输出32哪一个正确?:\
斯蒂芬

10
这意味着CPU是64位的,但是即使可以使用64位的CPU,也只能在其上安装32位的操作系统。

1
史蒂夫·坎普(Steve Kemp)是对的,所以要当心(2009 MacBooks上的Mac OS X 10.5可以想到,该操作系统是32位的,但能够运行64位应用程序)
jww 2013年

1
uname -m对QP的是没有用的configure,因为它可以给错误的结果。在getconf LONG_BIT获得C库这可能不是指定的,由正确大小的默认位大小CC,编译器。
user3710044 2015年

2
getconf LONG_BIT可以提供32 ig,它已被构建为32位应用程序(通常是运行32位用户区的64位内核)。
ysdx

42

lscpu 将列出有关CPU的其他信息:

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

3
输出CPU的物理功能,该功能对当前OS的当前用户空间有用,但不可靠。
user3710044 2015年

33

另一个易于确定的有用命令如下:

命令:

getconf LONG_BIT

回答:

  • 32,如果OS是32位
  • 如果OS是64位,则为64

2
该命令返回32:在HP-UX 11.31i对安腾64的情况并非如此
加布里埃尔Hautclocq

我想这全都取决于发问者对“ 64位”的含义-它曾经是指整数的自然大小,但现在却经常用来指代寻址大小。
Toby Speight


11

我想知道专门用于在Debian中构建软件的问题(已安装的Debian系统可以是具有32位内核,库等的32位版本,也可以是具有为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的。

我不知道dpkg-architecture如何推论该体系结构,但是您可以查看其文档或源代码(dpkg-architecture和许多dpkg系统通常都是Perl)。


您可以使用:dpkg --architecture获得主机系统架构,而无需dpkg-dev安装软件包。
Mark Longair

这将产生dpkg: error: unknown option --architecture14.04的dpkg 1.17.5ubuntu。dpkg-architecture(安装了dpkg-dev)可以正常工作。
timurb 2014年

2
该命令dpkg --print-architecture从一开始就在Debian上起作用。这是可行的,但仅限于Debian及其衍生版本。
user3710044 2015年

11
#include <stdio.h>

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

2
有效,但似乎是stdio.h在Linux上的实现细节,存在更好的解决方案,例如:limits.h,请勿使用。
user3710044 2015年

10

如果您使用的是64位操作系统(而不是i686),则在x86_64ia64的输出中uname -a。因为您没有这两个字符串中的任何一个。您有32位操作系统(请注意,这并不意味着您的CPU不是64位)。


1
这将返回内核可以支持的进程类型。在64位内核上运行32位用户空间是可能甚至合理的。
user3710044 2015年

uname输出中还有其他值指示64位OS。并非全世界都是x86或Itanium ...
Toby Speight

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

6

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

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

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

$ echo'int main(){返回0; }'| cc -xc--o foo
$ file 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 …无论如何都是特定于编译器的,因此只能使用cc -dumpmachine,而无需grepping且不仅受GCC支持。
安东·萨姆索诺夫,2016年

鉴于问题表明它是针对配置脚本的,因此这可能是此处最有用和最相关的答案。在所有重要的情况下(包括在64位OS上的32位用户chroot,用于外部体系结构的交叉编译以及其他情况),它将执行您想要的操作。
Toby Speight

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*)__WORDSIZE在C.
ceving

3
不,这不是愚蠢的。例如,您可能具有32位可执行文件,并且想弄清楚系统是否支持64位可执行文件。
Ludvig A. Norin

在GNU-C库中获取默认的long长度。
user3710044 2015年

1
实际上,这是错误的,因为如果您在64位内核上甚至在X32用户空间上运行32位用户空间,则说明操作系统为32位。
Ruslan 2015年

我们强烈建议不要使用fgetsstackoverflow.com/questions/16323185/...
ceving


3

在Bash中,使用整数溢出:

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

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


2
Bash已被编译(可以吗?)以使用64位整数(如果该类型可用),通常现在是这样,因此32位系统通常将使用“ long long”类型
user3710044 2015年

2
自2008年以来,Debian中的bash最晚已被编译为使用64位算术,可能早于此。自从存在stackoverflow以来,这个答案就被打破了。
彼得·科德斯

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


bash使用“ long longs”的同样问题。
user3710044 2015年

这对我有用,因为如果返回32位,则100%确认正在运行32。如果返回64,则可能是bash编译了很长的long。
JCM

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


我得到了其中的三个,一个为32,一个为64,另一个为mx32。
user3710044 2015年

是的,如果它不返回大量的64位库,则说明它正在运行32位OS:ls -aR | grep 64 | grep -v proc
JCM 18'Sep


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专家会创建两个表,一个表用于偶数,一个表用于奇数,并查看输入结果在哪里... 数字
Michael Shigorin
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.