Як визначити архітектуру ядра Linux?


92

uname -mдає i686 і uname -mдає вихід i686 i386 у версії 5.4 (Tikanga) Red Hat Enterprise Linux Server. Мені потрібно встановити Oracle Database 10g Release 2 на цій машині. Отже, як я можу вирішити, чи є архітектура ядра 32bit або 64bit?


10
Це помилка друку в першому реченні: uname -mі uname -m?
thepang

Дивіться також команду 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


А як з armv7l? У будь-якому випадку, команда з простою булевою відповіддю була б смачною.
користувач7543

1
@ user7543 Це ARM 32-розрядна, тому що у нас ще немає 64-розрядної ARM. Коли ми це зробимо, це буде щось інше.
Бехроз

Мені здається, я маю зробити свою вікі спільноти відповідей, але не знаю як.
Behrooz

1
Спробуйте: uname -m. Це покаже лише архітектуру.
Олексій Магура

39

Це просто! Використовуйте archкоманду.


5
Як це не дивно ... на моєму MacBook Pro 2013 archповертається i386, але uname -aпоказує x86_64.
турболаден

3
@turboladen "Чому уніме та арка відрізняються у виробництві?" = superuser.com/questions/835514/…
користувач10607

арка нотаток не визначена 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-бітний процесор

Чи прапор lm просто означає, що процесор підтримує 64-розрядні або це означає, що він працює в 64-розрядному. Я рекомендую покладатися на арку, знаючи, що це буде x86_64 для 64-бітових або i? 86 для 32-розрядних.
пінгвін359

1
@ penguin359 це означає, що процесор підтримує 64-розрядні.
ксенотеррацид

@xeno, тому тоді не можна використовувати для визначення архітектури ядра.
penguin359

@ penguin359 ні, це було незрозуміло у відповіді?
ксенотеррацид

1
@ penguin359, ні, але часто корисно з’ясувати, чи працює ваша ОС 64-розрядна, а якщо ні, чи можливо апаратне забезпечення, imo
xenoterracide

22

(РЕДАКТУЙТЕ: ця відповідь НЕПРАВИЛЬНА. Завдяки коментарю @ @ Lizardx)

У Bash, використовуючи цілий переповнення:

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

Це набагато ефективніше, ніж викликати інший процес або відкривати файли.


3
настільки розумний, а також нагадує, про що йдеться в архітектурі чіпів
code_monk

2
Хоча елегантно, це, на жаль, невірно: uname -m == i686 АЛЕ if ((1 << 32)); тоді echo 64bit; fi == 64bit Це ядро ​​PAE, 32-бітове, а не 64-бітове ядро. Однак процесор 64-бітовий, але amd64. Оскільки питання полягав у тому, як визначити арку ядра, це рішення дасть невірні результати.
Лізард

1
Примітка ((- башизм і не визначений POSIX mywiki.wooledge.org/Bashism#Conditionss
Стівен Пенні,

Я спробував це на деяких 32-бітових архітектурах, і це вважає, що це 64 біт.
dannyw

Це може спрацювати((1<<32)-1)
Івіджан Стефан Стипич

15

Для Debian :

На моєму ПК

    ~> dpkg - архітектура друку
    amd64
    ~> dpkg - друк-іноземні архітектури
    i386

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

    ~> dpkg - архітектура друку
    armhf

1
це найкраще працює при визначенні архітектури пакунків для використання checkinstall, thx!
Сила Водолія

Дякую. Я шукав щось, що випало б із стандартних назв архітектури "amd64" / "i386", а не просто "x86_64". Ніхто не використовує цю термінологію під час іменування попередньо складених випусків.
Кліф

12

Найпростіший спосіб - запустити:

getconf LONG_BIT

який виведе 64 або 32 залежно від того, 32 чи 64 біт.

наприклад:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Ця відповідь вводить в оману. Якщо увімкнено підтримку багатоархів та встановлення 64-бітного ядра, над 32-бітною установкою getconf LONG_BITбуде надруковано, 32хоча ви працюєте з 64-бітовим ядром.
kenn

2

використовувати syscap від проекту Formake

syscap дозволяє перевірити багато властивостей системи та тестові залежності. Це сценарій портативної оболонки.

Отримайте архітектуру процесора:

syscap info -arch

Отримати ім’я та версію ядра:

syscap info -kernel -kernver

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 або в VM.
Жиль

@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

Якщо ви шукаєте простий однолінійний, це найнадійніше рішення, яке я знайшов, що повертає 64 або 32 . Це не важливо, ви працюєте з ARM чи ні, і він повинен працювати в будь-якій системі, використовуючи bash або sh .

Обережно, це передбачає, що система або 32-розрядна, або 64-бітна. Дивіться моє пояснення нижче, якщо вам потрібно виявити 8- 16- чи якусь іншу бітну архітектуру.

[$ ((0xffffffffff) -eq -1] && відлуння 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,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.