我需要编写一个bash脚本,我必须检查Linux内核是32位还是64位。
我正在使用 uname -a 命令,它会为我提供 x86_64 结果。但我相信我不能以通用方式使用它,因为如果使用非x86架构的某些人,结果可能会有所不同。
如何检查Linux的32位/ 64位内核?
答案 0 :(得分:15)
问题在于:您打算通过了解自己是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
答案 1 :(得分:5)
您可以在系统中查询long int
:
getconf LONG_BIT
但我不确定这是否可以完全移植到所有不同的架构。
答案 2 :(得分:1)
在/ proc / cpuinfo中搜索lm(长模式)标志。如果是这样,则意味着您拥有64位处理器。一个简单的grep应该会给你这个信息。
关于内核版本,您始终可以使用uname -a信息。更好的方法是找到uname程序的来源,以便我们可以减少由于恶意主机名引起的差异。
答案 3 :(得分:1)
我想出了以下内容。它假定使用init
(某些发行版已切换到其他加载器,但应该很容易获得合理使用的加载项列表)并且您使用ELF
,而不是a.out
或其他现今异国情调的可执行格式。对于大多数系统来说,这似乎是理智的假设,但可能它们可能在嵌入式系统中被破坏等等。尽管如此,一般的想法应该可以适应(进入init
进程或等效并使用{检查其位数{1}})。如果您以root用户身份运行,而不是通过文件的路径,则可以使用file
(PID 1为file $(sudo readlink -e /proc/1/exe)
可能比假设其路径更具可移植性。)
init
答案 4 :(得分: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
答案 5 :(得分:0)
取决于你正在寻找的东西,我在64位proc上安装了32位机器,以上所有都会在我的情况下返回32位
但是如果我看看硬件,lshw在Ubuntu(lshw -c cpu)上,cpu的描述清楚地表明我有64位CPU,所以我可以安装64位版本的Ubuntu。
/ proc / cpuinfo也是关于硬件信息的良好来源,例如lm标志代表长模式。
祝你有个愉快的一天。 插孔。
答案 6 :(得分:-2)
在uname输出中grep为'64'
uname -a | grep 64