我需要编写一个bash脚本来检查Linux内核是32位还是64位。
我使用了 uname -a 命令,它给出了 x86_64 的结果。但我认为不能以通用方式使用它,因为如果有人使用非x86架构,则结果可能会有所不同。
如何检查Linux内核的32位/64位?
我需要编写一个bash脚本来检查Linux内核是32位还是64位。
我使用了 uname -a 命令,它给出了 x86_64 的结果。但我认为不能以通用方式使用它,因为如果有人使用非x86架构,则结果可能会有所不同。
如何检查Linux内核的32位/64位?
问题实际上是:通过知道自己是在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
long int
的大小:getconf LONG_BIT
但是我不确定这是否完全适用于所有不同的架构。
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
init
(PID 1) 是最先执行的进程,所以我认为它确实决定了整个系统的位数。 - Michał Kosmulskiinit
是32位也应该是可能的,但在任何“正常”的系统上,你的方法应该是可以的。 - mtvec确定支持的可执行架构的一种相当可靠的方法:
执行此操作的一个特色功能:
# 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
/proc/cpuinfo
格式完全不同,更加紧凑,也没有这样的标志。 - Michał Kosmulski根据你需要的内容不同,我安装了32位的机器在64位的处理器上,在我的情况下所有的都会返回32位
但是如果我看硬件,在Ubuntu上用lshw命令查看CPU (lshw -c cpu),CPU描述清楚地表明我有一个64位的CPU,因此我可以安装64位版本的Ubuntu。
/proc/cpuinfo也是关于硬件的很好的信息来源,像lm标志代表长模式。
祝你有美好的一天。 杰克。
uname -a | grep 64
uname -i | grep 64
。 - David Schwartzuname -a
输出。您将看到节点名称。因此,如果节点名称为“server64A”,则其中将有一个“64”。您还将看到内核名称字符串,其中通常包括编译次数。因此,如果它被编译了64次,则其中将有一个“64”。 - David Schwartzuname -m | grep 64
,我想。 - diewie