9

我需要编写一个 bash 脚本,我必须在其中检查 Linux 内核是 32 位还是 64 位。

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

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

4

7 回答 7

18

The question is rather: what do you intend to achieve by knowing whether you are on 32 or 64? What are the consequences of being on a hypothetical 128-bit environment? And what part actually is being tested for N-bitness? A CPU may support running in 64-bit mode, but the environment be 32-bit. Furthermore, the environment itself may be a mixed-mode; consider running a 64-bit kernel with a 32-bit userspace (done on a handful of classic RISCs). And then, what if the userspace is not of a homogenous bitness/executable format? That is why getconf LONG_BIT is equally pointless to use, because it depends on how it was compiled.

$ /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
于 2012-04-13T12:38:16.297 回答
7

您可以向系统查询 a 的大小long int

getconf LONG_BIT

但我不确定这是否完全可移植到所有不同的架构。

于 2012-04-13T09:10:55.730 回答
2

我想出了以下内容。它假定init已使用(一些发行版已切换到其他加载程序,但应该很容易获得合理经常使用的加载程序列表)并且您使用ELF, nota.out或其他现在异国情调的可执行格式。对于大多数系统来说,这些似乎是合理的假设,但可能在嵌入式系统等中它们可能会被破坏。不过,总体思路应该可以适应(进入init进程或等价物并使用 来检查它的位数file)。如果您以 root 身份运行,而不是通过文件的路径,您可以使用file $(sudo readlink -e /proc/1/exe)(PID 1init可能比假设它的路径更便携)。

if file /sbin/init | fgrep 'ELF 64-bit' &>/dev/null; then
    echo "64-bit"
else
    echo "not 64-bit"
fi
于 2012-04-13T10:07:32.457 回答
1

在 /proc/cpuinfo 中搜索 lm(长模式)标志。如果这是真的,这意味着你有一个 64 位处理器。一个简单的 grep 应该会为您提供这些信息。

关于内核版本,您始终可以在 uname -a 信息上使用 grep。最好找到 uname 程序的来源,这样我们就可以排除由于恶意主机名引起的差异。

于 2012-04-13T09:39:55.963 回答
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}"
}

测试这个:

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

比以下更可靠:

getconf LONG_BIT
于 2018-11-29T15:01:49.670 回答
0

取决于您要查找的内容,我在 64 位 proc 上安装了 32 位的机器,在我的情况下,以上所有内容都将返回 32 位

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

/proc/cpuinfo 也是有关硬件信息的良好来源,例如 lm 标志代表长模式。

祝你今天过得愉快。杰克。

于 2016-10-27T16:17:02.197 回答
-2

在 uname 输出中为 '64' 使用 Grep

uname -a | grep 64 
于 2012-04-13T08:52:57.683 回答