Как проверить наличие 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 обозначают длинный режим.

Хорошего дня. Джек.

Grep для '64' в выводе uname

uname -a | grep 64 
Другие вопросы по тегам