Как определить, является ли данный 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, а для процессора , введите:

cat /proc/cpuinfo

или:

grep flags /proc/cpuinfo

Под параметром «flags» вы увидите различные значения: см. « Что означают флаги в / 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 упоминает в своем собственном ответе : «В настоящее время система может быть многоархивной, так что в любом случае это не имеет смысла. Возможно, вы захотите найти цель компилятора по умолчанию»)

VonC
источник
3
grep flags / proc / cpuinfo сообщает только о том, 64-битный процессор. Как я понял вопрос был именно об ОС. uname -m только говорит мне "i686".
Ким Стебель
3
У меня 32-битное ядро ​​на 64-битном оборудовании и я получаю «x86_64» из «uname -m» (в Debian). Страница man для uname говорит, что -m показывает имя оборудования компьютера, так что это кажется правильным.
Тони Мейер
1
Если у меня есть 32-разрядное ядро работает на 64-битной машине / процессора, что бы uname -i, uname -pи uname -mпоказать?
ruben2020
4
что если присутствуют оба тм и лм?
Хавьер Новоа C.
4
@JavierNovoaC. tm (Thermal Monitor) указывает на автоматическое управление часами. Это никак не связано с выделением 32-битного процессора. На самом деле, lm (длинный режим) присутствует тогда и только тогда, когда у вас 64-битный процессор. Вот почему вы должны полагаться только на ЛМ. в противном случае ответ, данный Томасом Ватнедалом, является лучшим. Этот ответ просто неверен и ввел в заблуждение многих людей. PLZ Модераторы делают что-то с этим.
Иссам Т.
153

Если бы вы работали на 64-битной платформе, вы бы увидели x86_64 или что-то очень похожее в выводе uname -a

Чтобы получить название вашего конкретного компьютера, запустите

uname -m

Вы также можете позвонить

getconf LONG_BIT

который возвращает 32 или 64

Thomas Watnedal
источник
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, составителя.
user3710044
2
getconf LONG_BITможет обеспечить 32 ig, это было построено как 32-битное приложение (обычно 64-битное ядро, работающее под 32-битным пользовательским пространством).
ysdx
42

lscpu перечислю это среди другой информации относительно вашего процессора:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
asharma
источник
3
Выводит физические возможности ЦП, полезные, но не надежные для текущего пользовательского пространства текущей ОС.
user3710044
33

Еще одна полезная команда для легкого определения:

Команда:

getconf LONG_BIT

Ответ:

  • 32, если ОС 32-битная
  • 64, если ОС 64-битная
user3207041
источник
2
Неверно в случае HP-UX 11.31i на Itanium 64: эта команда возвращает 32.
Габриэль Хаутлок
Я предполагаю, что все зависит от того, что спрашивающий имеет в виду под «64-разрядным» - раньше он имел в виду натуральный размер целых чисел, но теперь он часто используется вместо обозначения размера адресации.
Тоби Спейт
12

Команда

$ arch    

эквивалентно

$ uname -m

но в два раза быстрее набрать

Грег фон Винкель
источник
2
Согласен, но я уверен, что скорость набора не является проблемой для большинства разработчиков.
Уильямкарсвелл
2
Это возвращает типы процессов, которые может поддерживать ядро. Возможно и даже разумно запустить 32-битное пользовательское пространство на 64-битном ядре.
user3710044
1
Команда arch доступна не во всех системах Unix, а uname должна быть.
Габриэль Хаутлок
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).

Reed Hedges
источник
Вы можете просто использовать: dpkg --architectureдля получения архитектуры хост-системы, которая не требует установки dpkg-devпакета.
Марк Лонгэйр
Это производит dpkg: error: unknown option --architectureдля dpkg 1.17.5ubuntu от 14.04. Архитектура dpkg (с установленным dpkg-dev) работает нормально.
Тимур
2
Команда dpkg --print-architectureработает на Debian с незапамятных времен. Этот работает, но ограничен Debian и его производными.
user3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
Скотти
источник
2
Работает, но выглядит как деталь реализации stdio.h в Linux, существуют лучшие решения, например: limit.h, НЕ ИСПОЛЬЗУЙТЕ.
user3710044
10

Если у вас есть 64-битная ОС, а не i686, у вас есть x86_64или ia64на выходе uname -a. В том, что у вас нет ни одной из этих двух строк; у вас 32-битная ОС (обратите внимание, что это не означает, что ваш процессор не 64-битный).

Денис Р.
источник
1
Это возвращает типы процессов, которые может поддерживать ядро. Возможно и даже разумно запустить 32-битное пользовательское пространство на 64-битном ядре.
user3710044
В unameвыводе есть другие значения, которые указывают на 64-битную ОС. Не весь мир - это x86 или Itanium ...
Тоби Спейт
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
Louis Gerbarg
источник
1
Это возвращает типы процессов, которые может поддерживать ядро. Возможно и даже разумно запустить 32-битное пользовательское пространство на 64-битном ядре.
user3710044
6

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

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

Вы можете попытаться скомпилировать привет мир:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ file foo
foo: исполняемый 64-разрядный LSB ELF, x86-64, версия 1 (SYSV), динамически связанный, интерпретатор /lib64/ld-linux-x86-64.so.2, для GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, без зачистки
ysdx
источник
1
Так cc -v | grep …как в любом случае это зависит от компилятора, можно просто использовать cc -dumpmachine, который не требует grepping и поддерживается не только GCC.
Антон Самсонов
Учитывая, что вопрос предполагает, что это для скрипта настройки, это, вероятно, самый полезный и актуальный ответ здесь. Он будет делать то, что вы хотите во всех важных случаях (включая 32-битный пользовательский chroot в 64-битной ОС, кросс-компиляцию для сторонней архитектуры и все остальное).
Тоби Спейт
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!

kaiwan
источник
5
Глупая идея! Используйте CHAR_BIT*sizeof(void*)или __WORDSIZEв C.
ceving
3
Нет, это не глупо. У вас может быть 32-битный исполняемый файл, и вы хотите выяснить, например, будет ли система поддерживать 64-битный.
Людвиг А. Норин
Получает длину по умолчанию long в библиотеке GNU-C .. эта работает!
user3710044
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

LinuxMaintwo
источник
1
Это встроенная переменная, поскольку /bin/bashона не является переменной окружения. Если вы уже зависите от Bash, это работает нормально. Тем не менее, результат может быть i386, i486, i586, i686и другие , так что будьте осторожны.
user3710044
3

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

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

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

оборота Лучостейн
источник
2
Bash (может быть?) Скомпилирован для использования 64-битных чисел, если этот тип доступен, обычно это происходит в настоящее время, и поэтому 32-битные системы обычно используют тип "long long"
user3710044
2
bash в Debian скомпилирован для использования 64-битной арифметики самое позднее с 2008 года, возможно, раньше. Этот ответ был нарушен еще до того, как существовал stackoverflow.
Питер Кордес
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
user5859111
источник
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,

Sandeep Giri
источник
Та же проблема с bash при использовании "long longs".
user3710044
Это сработало для меня, потому что если он возвращает 32 бита, то он на 100% подтверждает выполнение 32. Если он возвращает 64, возможно, bash был скомпилирован с длинными long.
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.
user3710044
Да, если он не возвращает тонны 64-битных библиотек, тогда он работает под управлением 32-битной ОС: ls -aR | grep 64 | grep -v proc
JCM
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
Алекс
источник
У меня есть две строки, одна с ним установлена ​​одна без.
user3710044
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
lakshmikandan
источник
1

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

Исходя из того, что 64-битные это обычно x86_64и 32-битные это i686и т.д.

79man
источник
-6

Сначала вы должны загрузить Virtual Box. Затем выберите новый и 32-битный Linux. Затем загрузите Linux, используя его. Если он загружается, то он 32-битный, если нет, то это 64-битный.

Викрам Таман
источник
2
Это действительно надуманный способ определить, является ли система 32- или 64-разрядной.
marlar
Но это действительно способ решить эту проблему. Поэтому я отмечу это.
FIRO
Это напоминает мне способ отличить четные числа от нечетных: математическое вычисление будет смотреть на остаток после деления его на два; программист посмотрел бы на наименее значимый бит; Специалист по MS SQL создаст две таблицы, одну для четных чисел и одну для нечетных, и посмотрит, где заканчивается ввод ... цифры
Михаил Шигорин