Как проверить наличие 32-битного / 64-битного ядра для Linux
Мне нужно написать скрипт bash, где я должен проверить, является ли ядро Linux 32-битным или 64-битным.
Я использую команду uname -a, и она дает мне результат x86_64. Но я считаю, что не могу использовать его в общем виде, потому что результат может отличаться, если кто-то использует архитектуру не x86.
Как проверить наличие 32-битного / 64-битного ядра для Linux?
7 ответов
Вопрос скорее в том, чего вы намерены достичь, зная, находитесь ли вы на 32 или 64? Каковы последствия нахождения в гипотетической 128-битной среде? А какая часть на самом деле тестируется на N-битность? Процессор может поддерживать работу в 64-битном режиме, но среда должна быть 32-битной. Кроме того, сама среда может быть смешанным режимом; рассмотрите возможность запуска 64-битного ядра с 32-битным пользовательским пространством (сделано на нескольких классических 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
Найдите флаг lm (длинный режим) в /proc/cpuinfo. Если это правда, значит у вас 64-битный процессор. Простой grep должен дать вам эту информацию.
Что касается версии ядра, вы всегда можете использовать информацию uname -a. Лучше было бы найти источник программы 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
Зависит от того, что вы ищете, у меня машина установлена в 32 бит на 64 битном процессоре, все вышеперечисленное вернет 32 бит в моем случае
Но если я посмотрю на оборудование, lshw в Ubuntu (lshw -c cpu), описание процессора ясно показывает, что у меня 64-битный процессор, поэтому я мог бы установить 64-битную версию Ubuntu.
/ proc / cpuinfo также является хорошим источником информации об оборудовании, например, флаги lm обозначают длинный режим.
Хорошего дня. Джек.