Как проверить 32-битное/64-битное ядро ​​для Linux

Мне нужно написать сценарий bash, в котором я должен проверить, является ли ядро ​​Linux 32-битным или 64-битным.

Я использую команду uname -a, и она дает мне результат x86_64. Но я считаю, что не могу использовать его в общем виде, потому что результат может отличаться, если кто-то использует архитектуру, отличную от x86.

Как проверить 32-битное/64-битное ядро ​​для Linux?


person VJS    schedule 13.04.2012    source источник
comment
Когда вы говорите об установке, вы имеете в виду ядро? Потому что вы можете использовать 64-битное ядро ​​с 32-битной установкой.   -  person David Schwartz    schedule 13.04.2012


Ответы (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
person jørgensen    schedule 13.04.2012

Вы можете запросить у системы размер long int:

getconf LONG_BIT

Но я не уверен, что это полностью переносимо на все разные архитектуры.

person mtvec    schedule 13.04.2012

Я придумал следующее. Предполагается, что используется 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
person Michał Kosmulski    schedule 13.04.2012
comment
Проблема с этим подходом заключается в том, что можно использовать 32-битные исполняемые файлы при запуске 64-битного ядра. - person mtvec; 13.04.2012
comment
@Job Вы правы, но init (PID 1) выполняется как самый первый процесс, поэтому я думаю, что он определяет разрядность системы в целом. - person Michał Kosmulski; 13.04.2012
comment
Ну, я думаю, что технически даже init должно быть 32-битным на 64-битном ядре, но в любой нормальной системе ваш подход должен быть в порядке, я думаю. - person mtvec; 13.04.2012
comment
+1. Это (на мой взгляд) наиболее жизнеспособное решение из всех предложенных здесь. - person Daniel Kamil Kozar; 13.04.2012
comment
Это не будет работать на платформах, отличных от ELF (например, Mach-O); также init cat может быть 32-битным, а другое пользовательское пространство может быть 64-битным, потому что битность определяется для каждого процесса, она обнаруживается при загрузке ELF/другого двоичного файла. - person osgx; 13.04.2012

Найдите флаг lm (длинный режим) в /proc/cpuinfo. Если это так, значит, у вас 64-битный процессор. Простой grep должен дать вам эту информацию.

Что касается версии ядра, вы всегда можете получить информацию о uname -a. Лучше было бы найти источник программы uname, чтобы мы могли исключить несоответствие из-за злонамеренного имени хоста.

person prathmesh.kallurkar    schedule 13.04.2012
comment
Это будет работать только на i386/x86_64. Когда-то я работал на машине POWER, и там формат /proc/cpuinfo был совершенно другим, гораздо более компактным и не имел таких флагов. - person Michał Kosmulski; 13.04.2012
comment
@above /proc/cpuinfo дает количество физических битов и виртуальных битов. Вы получаете эту информацию при работе на силовой машине?? Следующим шагом для нас является осмысление этой информации. Я стараюсь со своей стороны. Еще одна вещь: я думаю, что мы можем использовать размер int в C, чтобы определить размер слова машины. - person prathmesh.kallurkar; 13.04.2012
comment
@prathmeshkallurkar У меня больше нет доступа к этой машине, но я помню, что информация была очень краткой - около 4 строк на процессор, только названия моделей и почти ничего больше. Даже если бы у него была информация о доступных битах, она, безусловно, была в другом формате, чем на x86. - person Michał Kosmulski; 13.04.2012
comment
вот пример /proc/cpuinfo из Машина POWER6 - очень похожа на ту, что была у меня. Список рассылки касается FreeBSD, но информация о процессоре, которую они цитируют, относится к Linux. - person Michał Kosmulski; 13.04.2012

Вполне надежный способ определить поддерживаемую исполняемую архитектуру:

Рекомендуемая функция для этого:

# 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
person Community    schedule 29.11.2018

В зависимости от того, что вы ищете, у меня установлена ​​​​32-битная машина на 64-битной процедуре, все вышеперечисленное вернет 32-битную в моем случае.

Но если я посмотрю на аппаратное обеспечение, lshw в Ubuntu (lshw -c cpu), описание процессора ясно показывает, что у меня 64-битный процессор, поэтому я мог бы установить 64-битную версию Ubuntu.

/proc/cpuinfo также является хорошим источником информации об оборудовании, например, флаги lm обозначают длинный режим.

Хорошего дня. Разъем.

person JBat    schedule 27.10.2016

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

uname -a | grep 64 
person Fedor Igumnov    schedule 13.04.2012
comment
Если ядро ​​было скомпилировано 64 раза, это вызовет ложное срабатывание. То же самое, если имя сервера blade64A. - person David Schwartz; 13.04.2012
comment
Вместо этого используйте uname -i | grep 64. - person David Schwartz; 13.04.2012
comment
@ Дэвид Шварц: я немного новичок в этом и не понял твоей мысли. Не могли бы вы объяснить немного. Благодаря тонну !! - person VJS; 13.04.2012
comment
Посмотрите на вывод uname -a. Вы увидите имя узла. Итак, если имя узла server64A, то там будет 64. Вы также увидите строку имени ядра, которая часто включает количество раз, когда оно было скомпилировано. Итак, если он был скомпилирован 64 раза, там будет 64 раза. - person David Schwartz; 13.04.2012
comment
Думаю, должно быть uname -m | grep 64. - person diewie; 13.04.2012