Як визначити, чи є даний Linux 32-бітним або 64-бітним?


470

Коли я набираю uname -a, він дає наступний вихід.

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 i686 i686 i386 GNU/Linux

Звідки я можу зрозуміти, що дана ОС 32 або 64 біт?

Це корисно при написанні configureсценаріїв, наприклад: для якої архітектури я будую?

Відповіді:


735

Спробуйте uname -m. Що не вистачає, uname --machineі це дає:

x86_64 ==> 64-bit kernel
i686   ==> 32-bit kernel

Інакше не для ядра Linux, а для CPU :

cat /proc/cpuinfo

або:

grep flags /proc/cpuinfo

Під параметром "прапори" ви побачите різні значення: див. " Що означають прапори в / proc / cpuinfo? " Серед них названо lm: Long Mode( x86-64 : amd64, також відомий як Intel 64, тобто 64-розрядний здатний)

lm ==> 64-bit processor

Або ж, використовуючиlshw (як зазначено нижче , з допомогою Rolf Саксонії ), без sudo(тільки для ширини змісту центрального процесора):

lshw -class cpu|grep "^       width"|uniq|awk '{print $2}'

Примітка: у вас може бути встановлений 64-розрядний процесор із 32-бітним ядром .
(як згадує ysdx у власній відповіді : "У наш час система може бути багатоархівною, так що це не має сенсу. Ви можете знайти ціль компілятора за замовчуванням")


3
grep flags / proc / cpuinfo повідомляє лише про те, що CPU має 64 біт. Як я розумію, мова йшла про ОС. uname -m каже лише мені "i686".
Кім Стебель

3
У мене є 32-бітове ядро ​​на 64-бітному апаратному забезпеченні і отримую "x86_64" від 'uname -m' (на Debian). Сторінка man for uname говорить про те, що -m показує назву апаратного забезпечення машини, так що здається правильним.
Тоні Мейєр

1
Якщо у мене є 32-розрядний ядро працює на 64-бітної машині / процесора, що б uname -i, uname -pі uname -mпоказати?
ruben2020

4
що робити, якщо присутні і tm, і lm?
Хав'єр Новоа C.

4
@JavierNovoaC. tm (Тепловий монітор) вказує на автоматичне управління годинником. Це не має нічого спільного з розрізненням 32-бітного процесора. Насправді, lm (тривалий режим) присутній, якщо і тільки якщо у вас 64-бітний процесор. Тож тому варто покладатися лише на лм. інакше відповідь, яку дає Томас Ватнедал, найкраща. Ця відповідь просто неправильна, і багато людей звели модераторів ПЛЗ зробити щось з цього приводу.
Іссам Т.

153

Якщо ви працюєте на 64-бітній платформі, ви побачите x86_64 або щось дуже подібне у висновку від uname -a

Щоб запустити назву конкретного обладнання машини

uname -m

Ви також можете зателефонувати

getconf LONG_BIT

який повертає або 32, або 64


4
uname -mВиводи x86_64 getconf LONG_BITВиходи 32Який з них правильний ?? : \
Стефан

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

1
Стів Кемп має рацію, тому будьте обережні (Mac OS X 10.5 на 2009 MacBooks приходить на думку, де ОС 32-розрядна, але її здатні працювати 64-бітні програми)
jww

1
Це uname -mне корисно для QP, configureоскільки може дати неправильний результат. getconf LONG_BITОтримати бітовий по замовчуванням розміру бібліотеки C, не може бути правильним розміром для зазначеного, на CC, упорядника.
користувач3710044

2
getconf LONG_BITможе забезпечити 32 ig, він був побудований як 32-бітний додаток (як правило, 64-бітове ядро, що працює з 32-бітовою користувальницькою програмою).
ysdx

42

lscpu буде перераховано наступну інформацію серед іншої інформації щодо вашого процесора:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

3
Виводить фізичні можливості центрального процесора, корисні, але не надійні для поточного простору користувачів поточної ОС.
користувач3710044

33

Ще одна корисна команда для легкого визначення:

Команда:

getconf LONG_BIT

Відповідь:

  • 32, якщо ОС 32-бітна
  • 64, якщо ОС 64-бітна

2
Неправда у випадку HP-UX 11.31i на Itanium 64: ця команда повертається 32.
Габріель Хацлокк

Я думаю, все залежить від того, що запитуючий означає "64-бітний" - раніше він означав натуральний розмір цілих чисел, але зараз він часто використовується для позначення розміру адреси.
Toby Speight

12

Команда

$ arch    

еквівалентно

$ uname -m

але вдвічі швидше набирати


2
Погоджено, але я впевнений, що швидкість набору тексту не є проблемою для більшості розробників.
williamcarswell

2
Це повертає типи процесів, які ядро ​​може підтримувати. Можна запустити і навіть розумно запустити 32-бітну область користувача на 64-бітовому ядрі.
користувач3710044

1
Командна арка доступна не в кожній системі Unix, тоді як уніме повинна бути.
Габріель Хацлокк

11

Мені було цікаво про це спеціально для створення програмного забезпечення в Debian (встановлена ​​система Debian може бути 32-розрядною версією з 32-бітним ядром, бібліотеками тощо), або це може бути 64-бітна версія з вмістом, складеним для 64- біт, а не 32-бітний режим сумісності).

Самі пакети Debian повинні знати, для якої архітектури вони створені (звичайно), коли вони фактично створюють пакунок з усіма його метаданими, включаючи архітектуру платформи, тому існує інструмент упаковки, який виводить його для використання інших інструментів упаковки та сценаріїв, званих dpkg-архітектура . Він включає в себе як те, що налаштовано для створення, так і поточний хост. (Зазвичай вони однакові.) Приклад виведення на 64-бітній машині:

DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_OS=linux
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu

Ви можете надрукувати лише одну із цих змінних або зробити тест на їх значення за допомогою параметрів командного рядка до dpkg -architecture.

Я поняття не маю, як dpkg-архітектура виводить архітектуру, але ви можете подивитися на її документацію чи вихідний код (dpkg-архітектура та велика частина системи dpkg взагалі Perl).


Ви можете просто скористатися: dpkg --architectureотримати архітектуру хост-системи, яка не потребує встановлення dpkg-devпакета.
Марк Лонгейр

Це створює dpkg: error: unknown option --architectureдля dpkg 1.17.5ubuntu 14.04. dpkg-архітектура (із встановленим dpkg-dev) працює чудово.
timurb

2
Команда dpkg --print-architectureпрацювала над Debian з усіх віків. Цей працює, але обмежується Debian та його похідними.
користувач3710044

11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}

2
Працює, але, схоже, є деталізацією реалізації stdio.h для Linux, існують кращі рішення, наприклад: limit.h, НЕ ВИКОРИСТОВУЙТЕ.
користувач3710044

10

Якщо у вас 64-розрядна ОС замість i686, у вас є x86_64або ia64у вихідному файлі uname -a. У тому, що у вас немає жодної з цих двох рядків; у вас 32-розрядна ОС (зауважте, що це не означає, що ваш процесор не є 64-розрядним).


1
Це повертає типи процесів, які ядро ​​може підтримувати. Можна запустити і навіть розумно запустити 32-бітну область користувача на 64-бітовому ядрі.
користувач3710044

Є й інші значення у unameвиході, які вказують на 64-бітну ОС. Не весь світ - це x86 або Itanium ...
Toby Speight

6

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

Linux mars 2.6.9-67.0.15.ELsmp #1 SMP Tue Apr 22 13:50:33 EDT 2008 x86_64 i686 x86_64 x86_64 GNU/Linux

1
Це повертає типи процесів, які ядро ​​може підтримувати. Можна запустити і навіть розумно запустити 32-бітну область користувача на 64-бітовому ядрі.
користувач3710044

6

Сьогодні система може бути багатохарчовою, так що це не має сенсу. Ви можете знайти ціль компілятора за замовчуванням:

$ cc -v 2> & 1 | grep ^ Ціль
Мета: x86_64-pc-linux-gn

Ви можете спробувати скласти привіт:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ файл foo
foo: ELF 64-бітний виконуваний LSB, x86-64, версія 1 (SYSV), динамічно пов'язаний, інтерпретатор /lib64/ld-linux-x86-64.so.2, для GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, не позбавлений

1
Оскільки cc -v | grep …в будь-якому випадку є специфічним для компілятора, його можна просто використовувати cc -dumpmachine, що не вимагає прив'язки і підтримується не тільки GCC.
Антон Самсонов

Зважаючи на те, що питання передбачає, що це сценарій налаштування, це, мабуть, найбільш корисна і відповідна відповідь тут. Він зробить все, що ви хочете, у всіх важливих випадках (включаючи 32-бітну хронографію користувача на 64-бітній ОС, крос-компіляцію для іноземної архітектури та інше).
Toby Speight

5

Стосовно відповіді "getconf LONG_BIT" .

Я написав просту функцію, щоб зробити це в "C":

/*
 * check_os_64bit
 *
 * Returns integer:
 *   1 = it is a 64-bit OS
 *   0 = it is NOT a 64-bit OS (probably 32-bit)
 *   < 0 = failure
 *     -1 = popen failed
 *     -2 = fgets failed
 *
 * **WARNING**
 * Be CAREFUL! Just testing for a boolean return may not cut it
 * with this (trivial) implementation! (Think of when it fails,
 * returning -ve; this could be seen as non-zero & therefore true!)
 * Suggestions?
 */
static int check_os_64bit(void)
{
    FILE *fp=NULL;
    char cb64[3];

    fp = popen ("getconf LONG_BIT", "r");
    if (!fp)
       return -1;

    if (!fgets(cb64, 3, fp))
        return -2;

    if (!strncmp (cb64, "64", 3)) {
        return 1;
    }
    else {
        return 0;
    }
}

Гарна ідея, "getconf"!


5
Дурна думка! Використовуйте CHAR_BIT*sizeof(void*)або__WORDSIZE в C.
закінчення

3
Ні, це не дурно. У вас може бути 32-бітний виконуваний файл, і ви хочете розібратися, чи підтримувала б система, наприклад 64-розрядна.
Людвіг А. Норін

Отримує довжину за замовчуванням у бібліотеці GNU-C за замовчуванням . Це працює!
користувач3710044

1
Насправді це неправильно, тому що якщо ви працюєте з 32-бітовим простором користувача на 64-бітному ядрі, або навіть з простором користувача X32, це скаже, що ОС 32-бітна.
Руслан

Настійно рекомендується не використовувати fgets: stackoverflow.com/questions/16323185 / ...
ceving

4

Ви також можете перевірити за допомогою змінної середовища:

echo $HOSTTYPE

Результат:

i386 -> 32 біта

x86_64 -> 64 біт

Витягнуто з: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html


1
Це вбудована змінна, оскільки /bin/bashвона не є змінною середовища. Якщо ви вже залежні від Bash, це працює чудово. Тим НЕ менше, результат може бути i386, i486, i586, i686та інші , так що будьте обережні.
користувач3710044

3

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

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

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


2
Bash (може бути?) Складений для використання 64-бітових вкладишів, якщо цей тип доступний, зазвичай це є сьогодні, тому 32-бітові системи зазвичай використовують тип "long long"
користувач3710044

2
bash в Debian був складений для використання 64-бітової арифметики не пізніше з 2008 року, ймовірно, раніше цього. Ця відповідь була порушена з моменту існування потокового потоку.
Пітер Кордес

3

getconf використовує найменші системні виклики:

$ strace getconf LONG_BIT | wc -l
253

$ strace arch | wc -l
280

$ strace uname -m | wc -l
281

$ strace grep -q lm /proc/cpuinfo | wc -l
301

2

Якщо ви змістите 1 ліворуч на 32 і отримаєте 1, ваша система 32-бітна. Якщо ви змістите 1 лівий на 64 і отримаєте 1, ваша система 64-бітна.

Іншими словами,

if echo $((1<<32)) gives 1 then your system is 32 bit.

if echo $((1<<64)) gives 1 then your system is 64 bit.


Та ж проблема з bash з використанням "long longs".
користувач3710044

Це працювало для мене, тому що якщо він повертає 32 біт, то це на 100% підтверджується запуском 32. Якщо він повертається 64, можливо, bash був складений з великими довгими.
JCM

1

Якщо один із сильно обмежених доступних бінарних файлів (наприклад, в initramfs), мої колеги запропонували:

$ ls -l /lib*/ld-linux*.so.2

У моїх системах ALT Linux i586 має, /lib/ld-linux.so.2а x86_64 має /lib64/ld-linux-x86-64.so.2.


Я отримав ТРИ з них, один для 32, один для 64 і один для mx32.
користувач3710044

Так, якщо він не повертає тонни 64-бітних бібліотек, то він працює 32-бітної ОС: ls -aR | греп 64 | grep -v proc
JCM


1

Я не можу повірити, що за весь цей час ніхто не згадував:

sudo lshw -class cpu

щоб отримати детальну інформацію про швидкість, кількість, розмір та можливості апаратного забезпечення процесора.


1

Простий скрипт, щоб отримати 64 біт або 32 біт

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi

1

[ -z `uname -m | grep 64` ] && echo "32-bit" || echo "64-bit"

Виходячи з того, що 64-бітний звичайно, x86_64а 32-розрядний і i686т.д.


-6

Спочатку потрібно завантажити Virtual Box. Потім виберіть новий і 32-розрядний Linux. Потім завантажте linux за допомогою нього. Якщо він завантажується, то він є 32-бітовим, якщо не - це 64-бітний.


2
Це дійсно надуманий спосіб визначити, чи є система 32 чи 64 біт.
1616

Але це справді спосіб вирішити цю проблему. Тож я це відзначу.
фіро

Це нагадує мені спосіб сказати парні числа від непарних: математика перегляне решту після поділу на два; програміст буде дивитись на найменш суттєвий біт; спеціаліст з MS SQL створив би дві таблиці, одну для парних чисел та одну для непарних, і подивився б, де закінчується вхід ... цифри
Майкл Шигорін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.