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

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

520751 次浏览

如果你运行的是64位平台,你会在uname -a的输出中看到x86_64或类似的东西

运行特定的机器硬件名称

uname -m

你也可以打电话

getconf LONG_BIT

哪个返回32或64

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中的标志是什么意思?" 其中一个命名为lm: Long Mode (x86 - 64: amd64,也称为Intel 64,即64位能力)

lm ==> 64-bit processor

或者使用lshw(如前面提到的下面 by 萨克森的罗尔夫),没有sudo(只是为了控制cpu宽度):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'
< p > 注意:你可以安装一个64位CPU和一个32位内核。< br > (正如ysdx他/她自己的答案中提到的,“现在,一个系统可以是multiarch,所以它无论如何都没有意义。你可能想要找到编译器的默认目标")

该系统是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位操作系统,而不是i686,你在uname -a的输出中有x86_64ia64。因为你没有这两条弦中的任何一条;你有一个32位的操作系统(注意,这并不意味着你的CPU不是64位)。

对于答案"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”是个好主意!

我想知道这一点,特别是在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)。

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

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
#include <stdio.h>


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

如果一个二进制文件在可用的二进制文件中受到严重限制(例如在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

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

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

命令:

getconf LONG_BIT

答:

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

命令

$ arch

等于

$ uname -m

但打字速度是原来的两倍

在Bash中,使用整数溢出:

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

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

首先你必须下载虚拟盒子。然后选择new和32位Linux。然后使用它引导linux。如果它启动,那么它是32位的,如果它不启动,那么它是64位的。

如果你将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

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

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

如今,一个系统可以是多拱的,所以无论如何它都没有意义。你可能想要找到编译器的默认目标:

$ 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

真不敢相信这么久以来,居然没人提过

sudo lshw -class cpu

查阅有关中央处理器硬件的速度、数量、大小和功能的详细资料。

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

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

echo $HOSTTYPE

结果:

i386 -> 32位

x86_64 -> 64位

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

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

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