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

966   21  

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 (как указано ниже by Рольф Саксонии), без sudo (только для захвата ширины процессора):

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

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

если бы вы работали на 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

но в два раза быстрее, чтобы типа

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

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

#include <stdio.h>

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

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

эта система 32bit. iX86 in 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

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

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

вы можете попробовать скомпилировать hello world:

$ echo 'int main() { return 0; }' | cc -x c - -o foo
$ file foo
foo: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=b114e029a08abfb3c98db93d3dcdb7435b5bba0c, not stripped

С уважением ответ "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'!

вы также можете проверить с помощью переменной среды:

echo $HOSTTYPE

результат:

i386 -> 32 бит

x86_64 -> 64 бит

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

в 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

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

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

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

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

sudo lshw -class cpu

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

простой скрипт, чтобы получить 64 бит или 32 бит

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

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

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

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

Comments

    Ничего не найдено.