Как определить архитектуру ядра Linux?

92

uname -mдает i686 и uname -mвывод i686 i386 на машине Red Hat Enterprise Linux Server версии 5.4 (Tikanga). Мне нужно установить Oracle Database 10g Release 2 на эту машину. Итак, как я могу решить, является ли архитектура ядра 32-битной или 64-битной?

user2914
источник
10
Это опечатка в первом предложении: uname -mа uname -m?
чепанг
См. Также команду Linux для возврата количества бит (32 или 64)? , Если uname -mпоказывает i? 86, у вас есть 32-битная система.
Жиль
Вопрос Жиль ссылки на дает интересное решение: getconf WORD_BIT.
Микель
7
getconf WORD_BITвозвращает 32 на моем 64-битном Ubuntu
minaev

Ответы:

90

i386 и i686 являются 32-разрядными.
x86_64 является 64-битным

пример для 64 бит:

behrooz@behrooz:~$ uname -a  
Linux behrooz 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 **x86_64** GNU/Linux

РЕДАКТИРОВАТЬ:
видите ли мой Linux ARM 32 или 64 бит? для ARM

Behrooz
источник
Что насчет armv7l? В любом случае, команда с простым логическим ответом была бы восхитительной.
user7543 26.10.13
1
@ user7543 Это ARM 32-битная, потому что у нас еще нет 64-битной ARM. Когда мы это сделаем, это будет что-то другое.
Behrooz
Я чувствую, что должен сделать свой ответ вики-сообществу, но не знаю как.
Behrooz
1
Попробуйте: uname -m. Это покажет только архитектуру.
Алексей Магура
40

Это просто! Используйте archкоманду.

PHPst
источник
5
Странно ... на моем MacBook Pro 2013 года, archвозвращается i386, но uname -aпоказывает x86_64.
Турболад
3
@turboladen "почему uname и arch отличаются в выводе?" = Superuser.com/questions/835514/...
user10607
Арка заметки не определена POSIX pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
Стивен Пенни,
32

@behrooz это правильно. К сожалению, unameтребует, чтобы вы знали архитектуры. На самом деле, я искал список архитектур и нашел эту статью, которая отвечает на ваш вопрос. В отношении uname -m:

x86_64 GNU / Linux указывает, что у вас работает 64-битное ядро ​​Linux. Если вы используете см. I386 / i486 / i586 / i686, то это 32-битное ядро.

Чтобы определить, способен ли аппарат работать на 64-битном ядре

grep flags /proc/cpuinfo

Ищите следующее в выходных данных (все флаги, полученные из этого stackoverflow, отвечают на один и тот же вопрос)

  • lm флаг означает процессор в длинном режиме - 64-битный процессор
  • tm флаг означает защищенный режим - 32-битный процессор
  • rm флаг означает реальный режим - 16-битный процессор
xenoterracide
источник
Означает ли флаг lm, что процессор поддерживает 64-битные или это означает, что он работает в 64-битных системах? Я рекомендую полагаться на арку, зная, что это будет x86_64 для 64-битной или i? 86 для 32-битной.
penguin359
1
@ penguin359 это означает, что процессор поддерживает 64-битные.
ксенотеррацид
@xeno, поэтому его нельзя использовать для определения архитектуры ядра.
penguin359
@ penguin359 нет, это было неясно в ответе?
ксенотеррацид
1
@ penguin359, нет, но часто бывает полезно узнать, работает ли ваша ОС 64-битно, а если нет, то аппаратно ли это возможно, imo
xenoterracide
22

(РЕДАКТИРОВАТЬ: этот ответ НЕПРАВИЛЬНО. Благодаря комментарию @ Lizardx)

В Bash используется целочисленное переполнение:

if ((1<<32)); then
  echo 64bits
else
  echo 32bits
fi

Это гораздо эффективнее, чем запуск другого процесса или открытие файлов.

Luchostein
источник
3
такой умный, а также напоминает нам, что такое архитектура чипов
code_monk
2
Несмотря на элегантность, это, к сожалению, не правильно: uname -m == i686 НО if ((1 << 32)); затем эхо 64 бит; fi == 64 бит Это ядро ​​PAE, 32-битное, а не 64-битное ядро. Процессор, однако, способен работать на 64 битах, amd64. Поскольку вопрос состоял в том, как определить арку ядра, это решение дало бы неправильные результаты.
Lizardx
1
примечание ((является Bashism и не определяется POSIX mywiki.wooledge.org/Bashism#Conditionals
Стивен Пенни
Я пробовал это на некоторых 32-битных архитектурах, и это думает, что это 64-битная.
Деннив
Это может сработать((1<<32)-1)
Ivijan Stefan Stipić
15

Для Debian :

На моем ПК

    ~> dpkg --print-архитектура
    amd64
    ~> dpkg --print-foreign-architectures
    i386

Моя Малина Пи 2

    ~> dpkg --print-архитектура
    armhf
Артем Телешев
источник
1
это лучше всего работает при определении архитектуры пакета для использования checkinstall, thx!
Водолей Power
Спасибо. Я искал что-то, что отбросило бы «стандартные» имена архитектуры «amd64» / «i386», а не просто «x86_64». Никто не использует эту терминологию при наименовании предварительно скомпилированных выпусков.
Клифф
12

Самый простой способ - запустить:

getconf LONG_BIT

который выведет 64 или 32 в зависимости от того, 32 или 64 бита.

например:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64
dannyw
источник
2
Этот ответ вводит в заблуждение. Если вы включите поддержку multiarch и установите 64-битное ядро, поверх 32-битной установки getconf LONG_BITбудет напечатано, 32хотя вы используете 64-битное ядро.
Кенн
2

использовать syscap из проекта Formake

syscap позволяет исследовать многие системные свойства и тестировать зависимости. Это портативный сценарий оболочки.

Получить архитектуру процессора:

syscap info -arch

Получить имя и версию ядра:

syscap info -kernel -kernver
Alex
источник
1

Другой способ - проверить архитектуру, для которой был скомпилирован системный файл, например

$ file /usr/bin/ld
/usr/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
Минаев
источник
1
Это системная архитектура, которая не всегда является архитектурой ядра. Посмотрите этот ответ в SU для большего количества изменений.
Жиль
Теоретически они могут отличаться, но есть ли шанс, что они не будут соответствовать любой реальной установке?
Минаев
Некоторые дистрибутивы поставляются с ядром amd64 для версии x86. Я не знаю, сколько людей их используют, я проверял Debian popcon, но он не коррелирует между различными показателями. Я думаю, что основным вариантом использования является наличие 32-разрядной основной ОС и запуск 64-разрядной ОС в chroot или в виртуальной машине.
Жиль
@Gilles Тебе понравится то, что ты прочитаешь о новой архитектуре x32. Если я не опоздаю, конечно. wiki.debian.org/X32Port
Behrooz
0

Или вы можете использовать способ внутренней команды uname , если хотите реализовать что-то самостоятельно:

#include <sys/utsname.h>
#include <stdio.h>

int main() {
    struct utsname name;
    uname(&name);
    printf("%s\n",name.machine);
    return 0;
}
мяу
источник
0

Вот еще один метод использования uname.

От man uname:

... -i, --hardware-platform print the hardware platform or "unknown" ...

# uname -i x86_64 #

clusterdude
источник
Пока не
выдаст
0

Если вы ищете простую однострочную версию, это самое надежное решение, которое я нашел, которое возвращает 64 или 32 . Не важно, используете ли вы ARM или нет, и он должен работать в любой системе, использующей bash или sh .

Осторожно, это предполагает, что система является либо 32-битной, либо 64-битной. См. Мое объяснение ниже, если вам нужно обнаружить архитектуру 8-16 или какой-то другой бит.

[$ ((0xffffffff)) -eq -1] && echo 32 || эхо 64

Что здесь происходит?
Логика очень проста, и все сводится к тому, как компьютеры хранят целые числа со знаком. 32-битная архитектура имеет только 32 бита, которые она может использовать для хранения целых чисел со знаком, в то время как 64-битная архитектура имеет 64 бита! Другими словами, множество целых чисел, которые могут быть сохранены, конечно. Половина этого набора представляет отрицательные числа, а половина представляет положительные числа. Целое число со знаком, равное -1, представляется как наибольшее число, которое может быть сохранено в заданном количестве битов для этой архитектуры. В 32-разрядной системе -1 может быть представлено шестнадцатеричным значением 0xFFFFFFFF (которое составляет 32 двоичных разряда, все равны 1). В 64-битной системе 0xFFFFFFFF преобразуется в 4 294 967 295, основание 10, а 0xFFFFFFFFFFFFFFFF - представление для -1). Вы можете видеть, как это будет легко масштабироваться для систем, которые также являются 8- или 16-битными, что будет равно -1 при 0xFF и 0xFFFF,

b_laoshi
источник