我需要编写一个 bash 脚本,我必须在其中检查 Linux 内核是 32 位还是 64 位。
我正在使用uname -a命令,它给了我x86_64结果。但我相信我不能以通用方式使用它,因为如果有人使用非 x86 架构,结果可能会有所不同。
如何检查 Linux 的 32 位/64 位内核?
我需要编写一个 bash 脚本,我必须在其中检查 Linux 内核是 32 位还是 64 位。
我正在使用uname -a命令,它给了我x86_64结果。但我相信我不能以通用方式使用它,因为如果有人使用非 x86 架构,结果可能会有所不同。
如何检查 Linux 的 32 位/64 位内核?
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
您可以向系统查询 a 的大小long int
:
getconf LONG_BIT
但我不确定这是否完全可移植到所有不同的架构。
我想出了以下内容。它假定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
在 /proc/cpuinfo 中搜索 lm(长模式)标志。如果这是真的,这意味着你有一个 64 位处理器。一个简单的 grep 应该会为您提供这些信息。
关于内核版本,您始终可以在 uname -a 信息上使用 grep。最好找到 uname 程序的来源,这样我们就可以排除由于恶意主机名引起的差异。
确定支持的可执行架构的一种非常可靠的方法:
执行此操作的特色功能:
# 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
取决于您要查找的内容,我在 64 位 proc 上安装了 32 位的机器,在我的情况下,以上所有内容都将返回 32 位
但是如果我查看硬件,在 Ubuntu 上使用 lshw (lshw -c cpu),cpu 的描述清楚地表明我有一个 64 位 CPU,所以我可以安装 64 位版本的 Ubuntu。
/proc/cpuinfo 也是有关硬件信息的良好来源,例如 lm 标志代表长模式。
祝你今天过得愉快。杰克。
在 uname 输出中为 '64' 使用 Grep
uname -a | grep 64