当我输入时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
脚本时很有用,例如:我要构建什么样的架构?
试试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
(如下面由萨克森的Rolf所述),没有sudo
(只是为了获得cpu宽度):
lshw -class cpu|grep "^ width"|uniq|awk '{print $2}'
注意:您可以安装具有32位内核的64位CPU.
(正如ysdx在他/她自己的回答中提到的那样,"现在,系统可以是多系统的,所以它无论如何都没有意义.你可能想找到编译器的默认目标")
如果您运行的是64位平台,您会看到x86_64或uname -a 输出中非常相似的东西
要运行特定的计算机硬件名称
uname -m
你也可以打电话
getconf LONG_BIT
返回32或64
lscpu
将列出有关您的CPU的其他信息:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
...
另一个易于确定的有用命令如下:
命令:
getconf LONG_BIT
回答:
32,如果OS是32位
64,如果OS是64位
命令
$ arch
相当于
$ uname -m
但输入的速度是原来的两倍
我想知道这是专门用于在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).
#includeint main(void) { printf("%d\n", __WORDSIZE); return 0; }
如果你有一个64位的操作系统,而不是i686,你有x86_64
或ia64
在输出中uname -a
.因为你没有这两个字符串中的任何一个; 你有一个32位操作系统(请注意,这并不意味着你的CPU不是64位).
该系统是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
如今,一个系统可以是多层的,所以无论如何它都没有意义.您可能想要找到编译器的默认目标:
$ 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
关于答案"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'!