uname
我的 RHEL 5.4 机器上 -a的输出是:
Linux <machine name> 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
这是否意味着硬件是 64 位(可能是第一个 x86_64)并且操作系统也是 64 位(最后一个 x86_64)?
另外,这么多 x86_64 实例是什么?
我可以在 32 位操作系统上安装 64 位虚拟机,反之亦然吗?
答案1
硬件、内核和用户空间程序可能具有不同的字长。
您可以查看是否中央处理器
flags
通过检查中的行可以确定是 64 位、32 位还是两者都支持/proc/cpuinfo
。您必须了解您的架构系列中可能的标志。例如,在 i386/amd64 平台上,该lm
标志标识支持 amd64 的 CPU(没有该标志的 CPU 仅限 i386)。grep -q '^flags *:.*\blm\b' /proc/cpuinfo # Assuming a PC
您可以通过查询架构来查看内核是32位还是64位
uname -m
。例如,i[3456]86
是 32 位,而x86_64
是 64 位。请注意,在某些体系结构上,64 位内核可以运行 32 位用户态程序,因此即使uname -m
显示 64 位内核,也不能保证 64 位库可用。[ "$(uname -m)" = "x86_64" ] # Assuming a PC
您可以通过查询来查看用户空间中可用的内容最低有效位支持与
lsb_release
命令。更准确地说,lsb_release -s
打印:
支持的 LSB 功能的分隔列表。每个特征都有形式。例如,ix86 C 库的可用性由 表示,而是 amd64 的模拟库。不过,并非每个发行版都声明所有可用的 LSB 模块,因此可用的模块可能多于通过这种方式检测到的模块。module-version-architecture
core-2.0-ia32
core-2.0-amd64
您可以使用诸如 之类的命令查看系统上的架构程序是为哪些架构而构建的
file /bin/ls
。请注意,混合系统是可能的;即使ls
是 64 位程序,您的系统也可能安装了用于运行 32 位程序的库,反之亦然(不太常见)。sizeof(void*)
您可以通过编译一个打印或 的5 行 C 程序来找出开发时首选的字长(假设有 C 编译器可用)sizeof(size_t)
。您可以通过运行命令以稍微不太可靠的方式来获取相同的信息getconf LONG_BIT
。#include <stdio.h> int main() { printf("%d\n", (int)sizeof(void*)); return 0; }
至于虚拟机,是否可以在 32 位系统上运行 64 位虚拟机,或者反之亦然,取决于您的虚拟机技术。特别参见 如何在 32 位 Linux 上安装 64 位 Linux 虚拟机?
1 “字长”是“位数”的常用名称。
²如果有人安装了具有不同目标体系结构的备用 C 编译器但保留系统默认值,则可能不可靠getconf
。
答案2
您想知道 的uname
多个 x86_64 出现:
x86_64 x86_64 x86_64
这就是这三个价值观(“如果未知则省略 -p 和 -i”)
-m, --machine
print the machine hardware name
-p, --processor
print the processor type or "unknown"
-i, --hardware-platform
print the hardware platform or "unknown"
请注意,-p
和-i
不属于POSIX标准。这些值unknown
在 Debian 上,因此 uname 只会打印 x86_64 一次。 Red Hat/CentOS 定义了该值。
另请阅读:Linux如何uname -m
获取它的信息?和为什么 uname -p 和 uname -m 和 arch 输出不同的架构?。
答案3
看一下man uname
。
您可以在 64 位计算机上编译和运行 32 位程序(尽管这需要特殊设置),但无法在 32 位系统上运行 64 位二进制文件。这同样适用于许多虚拟机,但不是所有的*。因此,如果您有 64 位内核,那么您的硬件不可能仅是 32 位。
如果您想测试二进制程序的位数,请运行file /path/to/the/program
。
* 这取决于给定虚拟机运行的级别:(几乎)直接在主机 CPU 上执行二进制代码的虚拟机将无法在 32 位主机上运行 64 位代码。那些仿真某些CPU可以做到这一点,但由于仿真级别的原因,它们的效率较低。