Как определить, является ли данный Linux 32-битным или 64-битным?

Когда я печатаю 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 сценарии, например: для какой архитектуры я строю?

21 ответ

Решение

Пытаться 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 of Saxony), без sudo (только для уменьшения ширины процессора):

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

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

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

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

uname -m

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

getconf LONG_BIT

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

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

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

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

Команда:

getconf LONG_BIT

Ответ:

  • 32, если ОС 32-битная
  • 64, если ОС 64-битная

Команда

$ arch    

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

$ uname -m

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

#include <stdio.h>

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

Мне было интересно узнать об этом специально для сборки программного обеспечения в 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).

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

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

$ 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, не удален

Вы также можете проверить, используя переменную окружения:

echo $HOSTTYPE

Результат:

i386 -> 32 бита

x86_64 -> 64 бита

Извлечено из: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

Эта система является 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

Относительно ответа "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!

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

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

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

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

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

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

Если вы сдвинете 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,

Если один из них сильно ограничен в доступных двоичных файлах (например, в 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,

Простой скрипт для получения 64 бит или 32 бит

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

Я не могу поверить, что за все это время никто не упомянул:

sudo lshw -class cpu

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

$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set

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

Другие вопросы по тегам