Jak ustalić, czy dany Linux jest 32-bitowy czy 64-bitowy?

470

Kiedy piszę uname -a, daje następujący wynik.

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

Skąd mam wiedzieć, że dany system operacyjny jest 32- lub 64-bitowy?

Jest to przydatne podczas pisania configureskryptów, na przykład: dla jakiej architektury buduję?

swapnonil
źródło

Odpowiedzi:

735

Spróbować uname -m. Którego brakuje uname --machinei daje:

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

W przeciwnym razie nie dla jądra Linuksa, ale dla procesora wpisujesz:

cat /proc/cpuinfo

lub:

grep flags /proc/cpuinfo

Pod parametrem „flags” zobaczysz różne wartości: patrz „ Co oznaczają flagi w / proc / cpuinfo? ” Jedna z nich nazywa się lm: Long Mode( x86-64 : amd64, znana również jako Intel 64, tj. 64-bit zdolny)

lm ==> 64-bit processor

Lub używająclshw (jak wspomniano poniżej przez Rolfa z Saksonii ), bez sudo(tylko do zmiany szerokości procesora):

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

Uwaga: możesz mieć 64-bitowy procesor z zainstalowanym 32-bitowym jądrem .
(jak wspomina ysdx w swojej własnej odpowiedzi : „W dzisiejszych czasach system może być wielodostępny, więc i tak nie ma sensu. Możesz znaleźć domyślny cel kompilatora”)

VonC
źródło
3
flagi grep / proc / cpuinfo informują tylko, czy procesor jest 64-bitowy. Jak rozumiem pytanie dotyczyło systemu operacyjnego. uname -m mówi mi tylko „i686”.
Kim Stebel
3
Mam 32-bitowe jądro na 64-bitowym sprzęcie i otrzymuję „x86_64” z 'uname -m' (na Debianie). Strona podręcznika dla uname mówi, że -m pokazuje nazwę sprzętową komputera, więc wydaje się to poprawne.
Tony Meyer,
1
Jeśli mam jądra 32-bitowego działa na 64-bitowej maszyny / procesorze, co będzie uname -i, uname -pa uname -mshow?
ruben2020
4
co jeśli tm i lm są obecne?
Javier Novoa C.
4
@JavierNovoaC. tm (monitor termiczny) wskazuje automatyczne sterowanie zegarem. Nie ma to nic wspólnego z odróżnianiem procesora 32-bitowego. W rzeczywistości lm (tryb długi) występuje tylko wtedy, gdy masz 64-bitowy procesor. Dlatego powinieneś polegać tylko na lm. w przeciwnym razie odpowiedź udzielona przez Thomasa Watnedala jest najlepsza. Ta odpowiedź jest po prostu błędna i wprowadziła w błąd wielu moderatorów, którzy coś z tym robią.
Issam T.
153

Jeśli korzystasz z 64-bitowej platformy, zobaczysz x86_64 lub coś bardzo podobnego w danych wyjściowych uname -a

Aby uruchomić nazwę sprzętu dla określonej maszyny

uname -m

Możesz także zadzwonić

getconf LONG_BIT

która zwraca 32 lub 64

Thomas Watnedal
źródło
4
uname -mwyjścia x86_64 getconf LONG_BITwyjścia 32Który z nich jest poprawny? : \
Stephan,
10
Oznacza to, że procesor jest 64-bitowy, ale zainstalowałeś na nim tylko 32-bitowy system operacyjny, nawet jeśli mógłbyś użyć 64-bitowego.
1
Steve Kemp ma rację, więc bądź ostrożny (Mac OS X 10.5 na MacBookach 2009 przychodzi na myśl, gdzie system operacyjny jest 32-bitowy, ale jest zdolny do uruchamiania aplikacji 64-bitowych)
jww
1
Nie uname -mjest to przydatne dla QP, configureponieważ może dać zły wynik. getconf LONG_BITUzyskać domyślny rozmiar bitowej biblioteki C, które może nie być odpowiedni rozmiar dla określonego, przez CCkompilator.
user3710044
2
getconf LONG_BITmoże zapewniać 32 ig został zbudowany jako aplikacja 32-bitowa (zazwyczaj 64-bitowe jądro z 32-bitową przestrzenią użytkownika).
ysdx,
42

lscpu wyświetli następujące informacje dotyczące twojego procesora:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
asharma
źródło
3
Generuje fizyczne możliwości procesora, przydatne, ale niewiarygodne dla bieżącej przestrzeni użytkownika bieżącego systemu operacyjnego.
user3710044
33

Kolejnym przydatnym poleceniem ułatwiającym określenie jest jak poniżej:

Komenda:

getconf LONG_BIT

Odpowiedź:

  • 32, jeśli system operacyjny jest 32-bitowy
  • 64, jeśli system operacyjny jest 64-bitowy
3207041
źródło
2
Nieprawda w przypadku HP-UX 11.31i na Itanium 64: to polecenie zwraca 32.
Gabriel Hautclocq
Wydaje mi się, że wszystko zależy od tego, co pytający rozumie przez „64-bit” - kiedyś oznaczało to naturalny rozmiar liczb całkowitych, ale obecnie często oznacza rozmiar adresowania.
Toby Speight
12

Komenda

$ arch    

jest równa

$ uname -m

ale jego pisanie jest dwa razy szybsze

Greg von Winckel
źródło
2
Zgadzam się, ale jestem pewien, że szybkość pisania nie jest problemem dla większości programistów.
williamcarswell
2
Zwraca typy procesów obsługiwane przez jądro. Możliwe jest, a nawet rozsądne, uruchomienie 32-bitowej przestrzeni użytkownika na 64-bitowym jądrze.
user3710044
1
Polecenie arch nie jest dostępne w każdym systemie uniksowym, a uname powinno być.
Gabriel Hautclocq
11

Zastanawiałem się nad tym specjalnie do budowania oprogramowania w Debianie (zainstalowany system Debian może być wersją 32-bitową z 32-bitowym jądrem, bibliotekami itp. Lub może to być wersja 64-bitowa z materiałami skompilowanymi dla 64- bit zamiast 32-bitowego trybu zgodności).

Same pakiety Debiana muszą wiedzieć, do czego służą (oczywiście), kiedy faktycznie tworzą pakiet ze wszystkimi jego metadanymi, w tym architekturą platformy, dlatego istnieje narzędzie do pakowania, które wysyła je do innych narzędzi do pakowania i skryptów, które są nazywane architektura dpkg . Obejmuje zarówno to, do czego jest skonfigurowany, jak i bieżący host. (Zwykle są takie same.) Przykład danych wyjściowych na komputerze 64-bitowym:

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

Możesz wydrukować tylko jedną z tych zmiennych lub wykonać test pod kątem ich wartości za pomocą opcji wiersza poleceń, aby dpkg -architecture.

Nie mam pojęcia, jak architektura dpkg dedukuje architekturę, ale możesz zajrzeć do jej dokumentacji lub kodu źródłowego (architektura dpkg i większość systemu dpkg ogólnie to Perl).

Reed Hedges
źródło
Możesz po prostu użyć: dpkg --architectureaby uzyskać architekturę systemu hosta, która nie wymaga instalacji dpkg-devpakietu.
Mark Longair,
To produkuje dpkg: error: unknown option --architecturedla dpkg 1.17.5ubuntu z 14.04. dpkg-architecture (z zainstalowanym dpkg-dev) działa jednak dobrze.
timurb
2
Polecenie dpkg --print-architecturedziałało na Debianie od zawsze. Ten działa, ale jest ograniczony do Debiana i jego pochodnych.
user3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
szkocki
źródło
2
Działa, ale wydaje się być szczegółem implementacji stdio.h w systemie Linux, istnieją lepsze rozwiązania, np .: limit.h, NIE UŻYWAJ.
user3710044
10

Jeśli masz 64-bitowy system operacyjny, a nie i686, trzeba x86_64albo ia64na wyjściu uname -a. W tym, że nie masz żadnego z tych dwóch łańcuchów; masz 32-bitowy system operacyjny (pamiętaj, że nie oznacza to, że twój procesor nie jest 64-bitowy).

Denis R.
źródło
1
Zwraca typy procesów obsługiwane przez jądro. Możliwe jest, a nawet rozsądne, uruchomienie 32-bitowej przestrzeni użytkownika na 64-bitowym jądrze.
user3710044
Dane unamewyjściowe zawierają inne wartości wskazujące na 64-bitowy system operacyjny. Nie cały świat to x86 lub Itanium ...
Toby Speight
6

Ten system jest 32-bitowy. iX86 unameoznacza, że ​​jest to architektura 32-bitowa. Gdyby był 64-bitowy, zwróciłoby

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
źródło
1
Zwraca typy procesów obsługiwane przez jądro. Możliwe jest, a nawet rozsądne, uruchomienie 32-bitowej przestrzeni użytkownika na 64-bitowym jądrze.
user3710044
6

W dzisiejszych czasach system może być wielodostępny, więc i tak nie ma sensu. Możesz znaleźć domyślny cel kompilatora:

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

Możesz spróbować skompilować hello world:

$ echo 'int main () {return 0; } „| cc -xc - -o foo
plik $ foo
foo: ELF 64-bitowy plik wykonywalny LSB, x86-64, wersja 1 (SYSV), dynamicznie połączony, interpreter /lib64/ld-linux-x86-64.so.2, dla GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, bez izolacji
ysdx
źródło
1
Ponieważ i tak cc -v | grep …jest specyficzny dla kompilatora, można po prostu użyć cc -dumpmachine, który nie wymaga grepowania i jest obsługiwany nie tylko przez GCC.
Anton Samsonov,
Biorąc pod uwagę, że pytanie sugeruje, że jest to skrypt konfiguracyjny, jest to prawdopodobnie najbardziej użyteczna i odpowiednia odpowiedź tutaj. Robi to, co chcesz we wszystkich sprawach, które mają znaczenie (w tym 32-bitowy chroot użytkownika w 64-bitowym systemie operacyjnym, kompilacja krzyżowa dla architektury obcej i cała reszta).
Toby Speight
5

W odniesieniu do odpowiedzi „getconf LONG_BIT” .

Napisałem prostą funkcję, aby to zrobić w „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;
    }
}

Dobry pomysł, „getconf”!

kaiwan
źródło
5
Głupi pomysł! Użyj CHAR_BIT*sizeof(void*)lub __WORDSIZEw C.
ceving
3
Nie, to nie jest głupie. Możesz mieć 32-bitowy plik wykonywalny i chcesz dowiedzieć się, czy system obsługuje na przykład 64-bitowy plik.
Ludvig A. Norin
Pobiera domyślną długość długiej biblioteki GNU-C .. ta działa!
user3710044
1
W rzeczywistości jest źle, ponieważ jeśli używasz 32-bitowej przestrzeni użytkownika na 64-bitowym jądrze, a nawet przestrzeni użytkownika X32, powiesz, że system operacyjny jest 32-bitowy.
Ruslan
Zaleca się, aby nie używać fgets: stackoverflow.com/questions/16323185/…
ceving
4

Możesz również sprawdzić za pomocą zmiennej środowiskowej:

echo $HOSTTYPE

Wynik:

i386 -> 32 bity

x86_64 -> 64 bity

Wyodrębniono z: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

LinuxMaintwo
źródło
1
Jest to zmienna wbudowana, /bin/bashponieważ nie jest zmienną środowiskową. Jeśli jesteś już zależny od Bash, działa to dobrze. Jednakże, wynik może być i386, i486, i586, i686i inni więc należy być ostrożnym.
user3710044
3

W Bash, używając przepełnienia liczb całkowitych:

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

Jest to o wiele bardziej wydajne niż wywoływanie innego procesu lub otwieranie plików.

Luchostein
źródło
2
Bash jest (może być?) Skompilowany w celu użycia 64-bitowych liczb wewnętrznych, jeśli ten typ jest dostępny, zwykle jest to obecnie, więc systemy 32-bitowe zwykle używają typu „długi długi”
użytkownik3710044
2
bash w Debianie został skompilowany do użycia 64-bitowej arytmetyki najpóźniej od 2008 roku, prawdopodobnie wcześniej. Ta odpowiedź została zerwana, ponieważ przed przepełnieniem stosu.
Peter Cordes,
3

getconf używa najmniej wywołań systemowych:

$ 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
użytkownik5859111
źródło
2

Jeśli przesuniesz 1 w lewo o 32 i otrzymasz 1, twój system jest 32-bitowy. Jeśli przesuniesz 1 w lewo o 64 i otrzymasz 1, twój system jest 64-bitowy.

Innymi słowy,

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
źródło
Ten sam problem z bash przy użyciu „długich długich”.
user3710044
To działało dla mnie, ponieważ jeśli zwróci 32-bit, to w 100% zostanie potwierdzone uruchomienie 32. Jeśli zwróci 64, być może bash został skompilowany z długimi długimi.
JCM
1

Jeśli jeden jest poważnie ograniczony w dostępnych plikach binarnych (np. W initramfs), moi koledzy zasugerowali:

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

W moich systemach ALT Linux, i586 ma, /lib/ld-linux.so.2a x86_64 ma /lib64/ld-linux-x86-64.so.2.

Michael Shigorin
źródło
Mam TRZY z nich, jeden za 32, jeden za 64 i jeden za mx32.
użytkownik3710044
Tak, jeśli nie zwraca ton 64-bitowych bibliotek, to działa na 32-bitowym systemie operacyjnym: ls -aR | grep 64 | grep -v proc
JCM
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
alex
źródło
Mam dwie linijki, jedną bez niej.
user3710044
1

Nie mogę uwierzyć, że przez cały ten czas nikt nie wspominał:

sudo lshw -class cpu

aby uzyskać szczegółowe informacje na temat szybkości, ilości, wielkości i możliwości sprzętu procesora.

Rolf z Saksonii
źródło
1

Prosty skrypt, aby uzyskać 64-bitowy lub 32-bitowy

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi
lakshmikandan
źródło
1

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

Oparte na fakcie, że 64-bit jest zwykle x86_64i 32-bitowy jest i686itp.

79man
źródło
-6

Najpierw musisz pobrać Virtual Box. Następnie wybierz nowy i 32-bitowy system Linux. Następnie uruchom Linuksa, używając go. Jeśli uruchamia się, to jest 32-bitowy, jeśli nie, to jest 64-bitowy.

Vikram Thaman
źródło
2
Jest to naprawdę zbyt daleko idący sposób na określenie, czy system ma 32 czy 64 bity.
marlar
Ale to naprawdę sposób na rozwiązanie tego problemu. Więc zaznaczę to.
firo
Przypomina mi to sposób odróżnienia liczb parzystych od nieparzystych: matematyka spojrzałaby na resztę po podzieleniu jej na dwie części; programista spojrzałby na najmniej znaczący bit; specjalista MS SQL stworzyłby dwie tabele, jedną dla liczb parzystych i jedną dla nieparzystych, i sprawdziłby, gdzie kończy się wejście ... liczby
Michael Shigorin