如何检查Linux的32位/64位内核

9

我需要编写一个bash脚本来检查Linux内核是32位还是64位。

我使用了 uname -a 命令,它给出了 x86_64 的结果。但我认为不能以通用方式使用它,因为如果有人使用非x86架构,则结果可能会有所不同。

如何检查Linux内核的32位/64位?


当你说“安装”时,你是指内核吗?因为你可以在32位安装中使用64位内核。 - David Schwartz
7个回答

18

问题实际上是:通过知道自己是在32位还是64位环境中,您想要实现什么目标?处于假想的128位环境中有什么后果?同时,到底哪一部分正在测试N位?CPU可能支持以64位模式运行,但环境仍然是32位的。此外,环境本身可能是一个混合模式;考虑使用32位用户空间运行64位内核(这在少数经典RISC上执行)。而且,如果用户空间不具有同构的位数/可执行格式,怎么办?这就是为什么getconf LONG_BIT同样是无意义的,因为它取决于如何编译。

$ /rt64/usr/bin/getconf LONG_BIT
64
$ /usr/bin/getconf LONG_BIT
32
$ file /usr/bin/getconf /rt64/usr/bin/getconf
/usr/bin/getconf:      ELF 32-bit MSB executable, SPARC32PLUS, V8+ Required, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped
/rt64/usr/bin/getconf: ELF 64-bit MSB executable, SPARC V9, relaxed memory ordering, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.4, not stripped
$ uname -m
sparc64

7
您可以查询系统中 long int 的大小:
getconf LONG_BIT

但是我不确定这是否完全适用于所有不同的架构。


2
我想到了以下内容。它假设使用init(一些发行版已经切换到其他加载器,但应该很容易获取到合理频繁使用的列表),并且您使用ELF,而不是a.out或其他现在奇特的可执行文件格式。这些对于大多数系统来说似乎是合理的假设,但可能在嵌入式系统等方面被打破。尽管如此,通用思路应该可以适应(进入init进程或等效进程并使用file检查其位数)。如果您以root身份运行,而不是通过文件路径,您可以使用file $(sudo readlink -e /proc/1/exe)(PID 1作为init可能比假设其路径更具可移植性)。
if file /sbin/init | fgrep 'ELF 64-bit' &>/dev/null; then
    echo "64-bit"
else
    echo "not 64-bit"
fi

这种方法的问题在于,在运行64位内核时,可能会使用32位可执行文件。 - mtvec
@Job 你说得对,但是 init (PID 1) 是最先执行的进程,所以我认为它确实决定了整个系统的位数。 - Michał Kosmulski
我认为从技术上讲,在64位内核上,即使init是32位也应该是可能的,但在任何“正常”的系统上,你的方法应该是可以的。 - mtvec
+1. 这是(在我看来)所有提出的解决方案中最可行的一个。 - Daniel Kamil Kozar
这个程序在非ELF平台上无法运行(例如Mach-O);同时init cat可以是32位,而其他用户空间可以是64位,因为位数是针对每个进程的,它在加载ELF/其他二进制文件时被检测到。 - osgx

1

确定支持的可执行架构的一种相当可靠的方法:

执行此操作的一个特色功能:

# Gets the supported executable architecture
# >: 32-bit | 64-bit
getRunArch() {
  local arch
  local IFS=' '
  read -r _ arch _ <<< $(file --dereference --brief "$(which ls)")
  echo -n "${arch}"
}

Testing this:

echo "Supported run-time architecture is: $(getRunArch)"
Supported run-time architecture is: 64-bit

略微比以下内容可靠:

getconf LONG_BIT

1
在 /proc/cpuinfo 中搜索 lm(长模式)标志。 如果为真,则表示您拥有 64 位处理器。一个简单的 grep 命令可以给您提供此信息。
关于内核版本,您可以始终在 uname -a 信息上使用 grep 命令。更好的方法是找到 uname 程序的源代码,以便我们可以排除由恶意主机名引起的差异。

2
这只适用于i386/x86_64。我曾经在POWER机器上工作过,那里的/proc/cpuinfo格式完全不同,更加紧凑,也没有这样的标志。 - Michał Kosmulski
@above /proc/cpuinfo 给出了物理位和虚拟位的数量。在使用电源机器时,您是否收到了这些信息?我们下一步的工作是理解这些信息。我正在尽我所能。还有一件事:我认为我们可以使用 C 中 int 的大小来确定机器的字长。 - prathmesh.kallurkar
@prathmeshkallurkar 我已经无法访问那台机器了,但我记得信息非常简要 - 每个CPU只有4行,仅有型号名称,几乎没有更多信息。即使它有可用位的信息,它肯定是以不同于x86的格式呈现的。 - Michał Kosmulski
这是一台POWER6机器的/proc/cpuinfo示例 - 它看起来非常像我拥有的那台机器。邮件列表是关于FreeBSD的,但他们引用的cpuinfo来自Linux。 - Michał Kosmulski

0

根据你需要的内容不同,我安装了32位的机器在64位的处理器上,在我的情况下所有的都会返回32位

但是如果我看硬件,在Ubuntu上用lshw命令查看CPU (lshw -c cpu),CPU描述清楚地表明我有一个64位的CPU,因此我可以安装64位版本的Ubuntu。

/proc/cpuinfo也是关于硬件的很好的信息来源,像lm标志代表长模式。

祝你有美好的一天。 杰克。


-2
在uname输出中搜索“64”的内容。
uname -a | grep 64 

2
如果内核编译了64次,这将导致误报。如果服务器名称为“blade64A”,也是如此。 - David Schwartz
1
请使用 uname -i | grep 64 - David Schwartz
@David Schwartz:我对此还有些陌生,没有理解您的想法。您能否请稍微解释一下?非常感谢!! - VJS
查看uname -a输出。您将看到节点名称。因此,如果节点名称为“server64A”,则其中将有一个“64”。您还将看到内核名称字符串,其中通常包括编译次数。因此,如果它被编译了64次,则其中将有一个“64”。 - David Schwartz
应该是 uname -m | grep 64,我想。 - diewie

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