【问题标题】:How to determine whether a given Linux is 32 bit or 64 bit?如何确定给定的 Linux 是 32 位还是 64 位?
【发布时间】:2010-09-19 17:57:24
【问题描述】:

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

【问题讨论】:

    标签: linux shell 32bit-64bit processor


    【解决方案1】:

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

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

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

    cat /proc/cpuinfo
    

    或:

    grep flags /proc/cpuinfo
    

    在“flags”参数下,您将看到各种值:参见“What do the flags in /proc/cpuinfo mean?” 其中,一个名为lm:Long Modex86-64:amd64,也称为Intel 64,即支持64位)

    lm ==> 64-bit processor
    

    using lshw(如Rolf of Saxony 提到的below),没有sudo(仅用于获取cpu 宽度):

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

    注意:您可以在 64 位 CPU 上安装 32 位内核
    (正如ysdxhis/her own answer 中提到的那样,“现在,系统可以是multiarch,所以无论如何它没有意义。你可能想找到编译器的默认目标”)

    【讨论】:

    • grep flags /proc/cpuinfo 仅告诉您 CPU 是否为 64 位。据我了解,这是关于操作系统的问题。 uname -m 只告诉我“i686”。
    • 我在 64 位硬件上有一个 32 位内核,并从“uname -m”(在 Debian 上)获得“x86_64”。 uname 的手册页说 -m 显示机器硬件名称,所以这似乎是正确的。
    • 如果我在 64 位机器/处理器上运行 32 位内核,uname -iuname -puname -m 会显示什么?
    • 如果 tm 和 lm 都存在怎么办?
    • @JavierNovoaC。 tm (Thermal Monitor) 表示自动时钟控制。它与区分 32 位处理器无关。事实上,当且仅当您拥有 64 位 CPU 时,才会出现 lm(长模式)。所以这就是为什么你应该只依赖 lm。否则 Thomas Watnedal 给出的答案是最好的。这个答案是错误的,并且误导了许多人请版主对此有所作为。
    【解决方案2】:

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

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

    uname -m
    

    你也可以调用

    getconf LONG_BIT
    

    返回 32 或 64

    【讨论】:

    • uname -m 输出x86_64 getconf LONG_BIT 输出32 哪个是正确的? :\
    • 这意味着 CPU 是 64 位的,但您只在其上安装了 32 位操作系统,即使您可以使用 64 位操作系统。
    • Steve Kemp 是对的,所以要小心(想到 2009 年 MacBook 上的 Mac OS X 10.5,其中操作系统是 32 位但它能够运行 64 位应用程序)
    • uname -m 对 QP 的configure 没有用处,因为它会给出错误的结果。 getconf LONG_BIT 获取 C 库的默认位大小,这可能不是 CC 编译器指定的正确大小。
    • getconf LONG_BIT 可能会提供 32 ig,它已构建为 32 位应用程序(通常是运行 32 位用户空间的 64 位内核)。
    【解决方案3】:

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

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

    【讨论】:

    • 输出CPU的物理能力,对当前操作系统的当前用户空间有用,但不可靠。
    • 完全错误。问题是正在运行什么操作系统。 42 票?我会投反对票,但它会被淹没。
    【解决方案4】:

    另一个方便判断的有用命令如下:

    命令:

    getconf LONG_BIT
    

    答案:

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

    【讨论】:

    • 在 HP-UX 11.31i on Itanium 64 的情况下不正确:此命令返回 32。
    • 我想这完全取决于提问者所说的“64 位”是什么意思——它曾经表示整数的自然大小,但现在通常用来表示寻址大小。
    【解决方案5】:

    命令

    $ arch    
    

    等价于

    $ uname -m
    

    但打字速度是原来的两倍

    【讨论】:

    • 同意,但我确信打字速度对大多数开发者来说不是问题。
    • 返回内核可以支持的进程类型。在 64 位内核上运行 32 位用户空间是可能的,甚至是合理的。
    • arch 命令并非在每个 unix 系统上都可用,而 uname 应该可用。
    【解决方案6】:

    我想知道这个专门用于在Debian 中构建软件(安装的 Debian 系统可以是带有 32 位内核、库等的 32 位版本,也可以是带有东西的 64 位版本编译为 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 包。
    • 这会为 14.04 的 dpkg 1.17.5ubuntu 生成 dpkg: error: unknown option --architecture。 dpkg-architecture(安装了 dpkg-dev)工作正常。
    • 命令dpkg --print-architecture 一直在Debian 上工作。这个可行,但仅限于 Debian 及其衍生产品。
    【解决方案7】:
    #include <stdio.h>
    
    int main(void)
    {
        printf("%d\n", __WORDSIZE);
        return 0;
    }
    

    【讨论】:

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

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

    【讨论】:

    • 返回内核可以支持的进程类型。在 64 位内核上运行 32 位用户空间是可能的,甚至是合理的。
    • uname 输出中还有其他值指示 64 位操作系统。并非所有世界都是 x86 或 Itanium...
    【解决方案9】:

    那个系统是 32 位的。 uname 中的 iX86 表示它是 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
    

    【讨论】:

    • 返回内核可以支持的进程类型。在 64 位内核上运行 32 位用户空间是可能的,甚至是合理的。
    【解决方案10】:

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

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

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

    $ echo 'int main() { return 0; }' | cc -x c - -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,未剥离
    

    【讨论】:

    • 因为cc -v | grep … 无论如何都是编译器特定的,所以可以只使用cc -dumpmachine,它不需要grepping,并且不仅受GCC 支持。
    • 鉴于问题表明它是针对配置脚本的,这可能是这里最有用和最相关的答案。它会在所有重要的情况下执行您想要的操作(包括 64 位操作系统上的 32 位用户 chroot、针对外部架构的交叉编译等等)。
    【解决方案11】:

    关于the answer "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'!

    【讨论】:

    • 愚蠢的想法!在 C 中使用 CHAR_BIT*sizeof(void*)__WORDSIZE
    • 不,这并不傻。例如,您可能有一个 32 位的可执行文件,并且想弄清楚系统是否支持 64 位的可执行文件。
    • 获取 GNU-C 库中 long 的 默认 长度 .. 这个可行!
    • 实际上是错误的,因为如果你在 64 位内核上运行 32 位用户空间,甚至 X32 用户空间,就会说操作系统是 32 位的。
    • 强烈建议不要使用fgets:stackoverflow.com/questions/16323185/…
    【解决方案12】:

    在 Bash 中,使用整数溢出:

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

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

    【讨论】:

    • Bash 被(可以?)编译为使用 64 位整数,如果该类型可用的话,现在通常是这样,因此 32 位系统通常会使用类型“long long”
    • Debian 中的 bash 最迟从 2008 年开始编译为使用 64 位算法,可能比这更早。自从 stackoverflow 存在之前,这个答案就被打破了。
    【解决方案13】:

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

    echo $HOSTTYPE
    

    结果:

    i386 -> 32 位

    x86_64 -> 64 位

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

    【讨论】:

    • 这是/bin/bash 的内置变量,它不是环境变量。如果您已经依赖于 Bash,这可以正常工作。但是,结果可能是i386i486i586i686 等,所以要小心。
    【解决方案14】:

    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
    

    【讨论】:

      【解决方案15】:

      如果将 1 左移 32 得到 1,则您的系统是 32 位的。 如果你将 1 左移 64 得到 1,那么你的系统是 64 位的。

      换句话说,

      if echo $((1&lt;&lt;32)) gives 1 then your system is 32 bit.

      if echo $((1&lt;&lt;64)) gives 1 then your system is 64 bit.

      【讨论】:

      • 使用“long longs”的 bash 存在同样的问题。
      • 这对我有用,因为如果它返回 32 位,那么它 100% 确认运行 32。如果它返回 64 可能是 bash 是用 long long 编译的。
      【解决方案16】:

      如果可用二进制文件(例如 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。
      • 是的,如果它没有返回大量 64 位库,那么它运行的是 32 位操作系统:ls -aR | grep 64 | grep -v proc
      【解决方案17】:
      $ grep "CONFIG_64" /lib/modules/*/build/.config
      # CONFIG_64BIT is not set
      

      【讨论】:

      • 我有两条线,一条有它,一条没有。
      【解决方案18】:

      我不敢相信,这么久以来,没有人提到:

      sudo lshw -class cpu
      

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

      【讨论】:

      • 完全错误。问题是正在运行什么操作系统。我可以将我的全部优点用于否决这个问题的所有错误答案。
      • @AlbertvanderHorst 当然,totally 是正确的,但鉴于我确实附上了一个关于CPU hardware 的重要警告,我不认为这个答案具有误导性。它只是为主题添加了一个小信息sn-p。我注意到您没有提供自己的答案!准确、正确或其他。
      【解决方案19】:

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

              if $(getconf LONG_BIT | grep '64'); then
                 echo "64 bit system"
              else
                  echo "32 bit system"
              fi
      

      【讨论】:

        【解决方案20】:

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

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

        【讨论】:

          【解决方案21】:

          首先您必须下载 Virtual Box。然后选择新的 32 位 Linux。然后使用它启动linux。如果能启动则为 32 位,否则为 64 位。

          【讨论】:

          • 这种判断系统是32位还是64位的方法真的很牵强。
          • 但它确实是解决这个问题的一种方法。所以我会标记它。
          • 这让我想起了一种区分偶数和奇数的方法:数学运算会在将余数除以二后查看余数;程序员会查看最低有效位; MS SQL 专家会创建两张表,一张用于偶数,一张用于奇数,然后查看输入的最终位置...figures
          猜你喜欢
          • 2011-04-04
          • 2010-10-23
          • 2011-04-19
          • 2011-08-05
          • 1970-01-01
          • 1970-01-01
          • 2021-12-10
          • 2011-04-16
          • 2011-07-03
          相关资源
          最近更新 更多