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ę?

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”)


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


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
...

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

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


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).


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;
}

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).


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

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

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”!


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


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.


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

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.


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.


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

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.


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

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.


-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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.