472

当我输入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,例如:我要为什么架构构建?

4

21 回答 21

739

试试uname -m。缺少uname --machine它并输出:

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

否则,不是针对 Linux 内核,而是针对 CPU,您键入:

cat /proc/cpuinfo

或者:

grep flags /proc/cpuinfo

在“flags”参数下,你会看到各种值:见“ /proc/cpuinfo中的flags是什么意思? ”其中一个名为lmLong Modex86-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他/她自己的回答中提到的那样,“现在,系统可以是多架构的,所以无论如何它都没有意义。您可能想要找到编译器的默认目标”)

于 2008-10-29T07:06:42.973 回答
155

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

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

uname -m

你也可以打电话

getconf LONG_BIT

返回 32 或 64

于 2008-10-29T07:06:16.563 回答
44

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

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
于 2012-07-17T02:00:30.023 回答
34

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

命令:

getconf LONG_BIT

回答:

  • 32,如果操作系统是 32 位
  • 64,如果操作系统是 64 位
于 2014-01-17T14:39:55.173 回答
12

命令

$ arch    

相当于

$ uname -m

但打字速度快两倍

于 2014-06-16T16:43:28.127 回答
11

我想知道这个专门用于在Debian中构建软件(安装的 Debian 系统可以是带有 32 位内核、库等的 32 位版本,或者它可以是带有为 64- 编译的东西的 64 位版本)位而不是 32 位兼容模式)。

Debian 包本身需要知道它们的架构(当然),当他们实际创建包含所有元数据的包时,包括平台架构,所以有一个打包工具可以输出它以供其他打包工具和脚本使用,称为dpkg 架构。它既包括配置为构建的目标,也包括当前主机。(但通常这些是相同的。)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)。

于 2011-08-11T18:18:40.437 回答
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
于 2012-08-15T14:09:31.597 回答
10

如果你有一个 64 位操作系统,而不是 i686,你有x86_64ia64uname -a. 因为您没有这两个字符串中的任何一个;您有一个 32 位操作系统(请注意,这并不意味着您的 CPU 不是 64 位)。

于 2008-10-29T07:09:19.567 回答
6

那个系统是32位的。iX86 inuname表示它是 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
于 2008-10-29T07:08:47.383 回答
6

如今,一个系统可以是多架构的,所以无论如何它都没有意义。您可能希望找到编译器的默认目标:

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

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

$ echo 'int main() { return 0; }' | cc -xc - -o foo
$ 文件 foo
foo:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接,解释器 /lib64/ld-linux-x86-64.so.2,用于 GNU/Linux 2.6.32,BuildID[sha1] =b114e029a08abfb3c98db93d3dcdb7435b5bba0c,未剥离
于 2015-09-19T07:10:27.717 回答
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'!

于 2011-06-01T11:38:51.197 回答
4

在 Bash 中,使用整数溢出:

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

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

于 2014-11-10T13:51:59.017 回答
4

您还可以使用环境变量进行检查:

echo $HOSTTYPE

结果:

i386-> 32 位

x86_64-> 64 位

摘自:http ://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

于 2016-02-28T20:25:00.183 回答
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
于 2016-02-06T22:22:03.213 回答
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.

于 2015-02-13T13:22:25.017 回答
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.

于 2013-02-21T18:22:06.803 回答
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
于 2013-07-11T15:17:21.217 回答
1

获取 64 位或 32 位的简单脚本

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi
于 2015-07-06T06:43:23.340 回答
1

我不敢相信,在这段时间里,没有人提到:

sudo lshw -class cpu

获取有关 CPU 硬件的速度、数量、大小和功能的详细信息。

于 2015-09-22T13:04:50.840 回答
1

[ -z `uname -m | grep 64` ] && echo "32-bit" || echo "64-bit"

基于通常是 64 位x86_64和 32 位i686等的事实。

于 2016-12-13T08:44:36.563 回答
-5

首先,您必须下载 Virtual Box。然后选择新的 32 位 Linux。然后使用它启动linux。如果它启动了,那么它是 32 位的,如果它没有启动,那么它是一个 64 位的。

于 2014-12-07T18:00:11.167 回答