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

6

那个系统是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

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

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
傻的想法!在C语言中使用CHAR_BIT*sizeof(void*)__WORDSIZE - ceving
3
不,这并不傻。例如,您可能拥有一个32位可执行文件,并且想弄清楚系统是否支持64位的文件。 - Ludvig A. Norin
获取GNU-C库中long的 默认 长度... 这个可行! - user3710044
1
实际上是错误的,因为如果您在64位内核上运行32位用户空间,甚至是X32用户空间,它会显示操作系统为32位。 - Ruslan
强烈建议不要使用 fgets:https://dev59.com/rWQo5IYBdhLWcg3wGsLN - ceving

4
在Bash中,使用整数溢出:
if ((1 == 1<<32)); then
  echo 32bits
else
  echo 64bits
fi

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


2
如果64位整数可用,Bash可以编译成使用64位整数,而现在通常都是这样,因此32位系统通常会使用类型“long long”。 - user3710044
2
自2008年起,Debian中的bash已经编译为使用64位算术,可能早于此。这个答案在stackoverflow存在之前就已经失效了。 - Peter Cordes

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

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

基于通常情况下,64位为x86_64,32位为i686等。


2
如果你将数字1左移32位后得到的结果是1,那么你的系统是32位的。如果你将数字1左移64位后得到的结果是1,那么你的系统是64位的。换句话说,如果在终端中输入命令echo $((1<<32))得到的结果是1,则你的系统是32位的;如果输入命令echo $((1<<64))得到的结果是1,则你的系统是64位的。请注意保留HTML标签。

使用“long longs”在bash中遇到了相同的问题。 - user3710044
这对我有用,因为如果它返回32位,那么就可以100%确认运行32位。如果返回64,则可能是bash使用了long longs编译。 - JCM

1

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

sudo lshw -class cpu

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


完全错误。问题是运行的操作系统是什么。我可以花费所有的声望来对这个问题的所有错误答案进行投票。 - Albert van der Horst
@AlbertvanderHorst 当然,您是 完全 正确的,但鉴于我已经加入了有关 CPU 硬件 的重要限制条件,我不认为这个答案会误导人。它只是在主题上添加了一个小的信息片段。我注意到您没有提供自己的答案!无论精准、正确还是其他。 - Rolf of Saxony

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
如果它没有返回大量的64位库,那么它就是运行在32位操作系统上:ls -aR | grep 64 | grep -v proc - JCM

1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set

我有两条线,一条设置了,一条没有设置。 - user3710044

1

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

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

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