Jak określić architekturę jądra systemu Linux?


92

uname -mdaje i686 i uname -mdaje wyjście i686 i386 w maszynie Red Hat Enterprise Linux Server wersja 5.4 (Tikanga). Muszę zainstalować Oracle Database 10g Release 2 na tym komputerze. Jak więc zdecydować, czy architektura jądra jest 32-bitowa czy 64-bitowa?


10
Czy to literówka w pierwszym zdaniu: uname -mi uname -m?
tshepang

Zobacz także polecenie Linux, aby zwrócić liczbę bitów (32 lub 64)? . Jeśli uname -mpokazuje i? 86, masz system 32-bitowy.
Gilles


Pytanie Gilles linki do daje ciekawe rozwiązanie: getconf WORD_BIT.
Mikel

7
getconf WORD_BITzwraca 32 na moim 64-bitowym Ubuntu
minaev

Odpowiedzi:


90

i386 i i686 są 32-bitowe.
x86_64 jest 64-bitowy

przykład dla wersji 64-bitowej:

behrooz@behrooz:~$ uname -a  
Linux behrooz 2.6.32-5-amd64 #1 SMP Mon Mar 7 21:35:22 UTC 2011 **x86_64** GNU/Linux

EDYCJA:
Widzisz, czy mój Linux ARM 32 lub 64 bit? dla ARM


Co z armv7l? W każdym razie polecenie z prostą odpowiedzią logiczną byłoby smaczne.
user7543,

1
@ user7543 To ARM 32-bit, ponieważ nie mamy jeszcze 64-bitowej ARM. Kiedy to zrobimy, będzie to coś innego.
Behrooz

Wydaje mi się, że powinienem utworzyć wiki wiki społeczności, ale nie wiem jak.
Behrooz

1
Spróbuj: uname -m. To pokaże tylko architekturę.
Alexej Magura,


32

@behrooz jest poprawny. Niestety unamewymaga znajomości architektury. Właściwie szukałem listy architektur i znalazłem ten artykuł, który odpowiada na twoje pytanie. W odniesieniu do uname -m:

x86_64 GNU / Linux wskazuje, że masz uruchomione 64-bitowe jądro Linuksa. Jeśli używasz patrz i386 / i486 / i586 / i686, jest to 32-bitowe jądro.

Aby ustalić, czy sprzęt jest w stanie uruchomić 64-bitowe jądro

grep flags /proc/cpuinfo

Poszukaj następujących danych wyjściowych (wszystkie flagi pobrane z odpowiedzi na przepełnienie stosu dla tego samego pytania)

  • lm Flaga oznacza procesor w trybie Long - procesor 64-bitowy
  • tm Flaga oznacza tryb chroniony - 32-bitowy procesor
  • rm Flaga oznacza tryb rzeczywisty - 16-bitowy procesor

Czy flaga lm oznacza po prostu, że procesor obsługuje 64-bit, czy oznacza to, że działa w wersji 64-bitowej? Polecam polegać na łuku wiedząc, że będzie to x86_64 dla 64-bitowych lub i? 86 dla 32-bitowych.
penguin359

1
@ penguin359 oznacza, że ​​procesor obsługuje 64-bit.
ksenoterrakid

@xeno, więc nie można go użyć do określenia architektury jądra.
penguin359

@ penguin359 nie, czy to było niejasne w odpowiedzi?
ksenoterracid

1
@ penguin359, nie, ale często przydatne jest sprawdzenie, czy system operacyjny działa w wersji 64-bitowej, a jeśli nie, czy sprzęt jest w stanie, imo
xenoterracide

22

(EDYCJA: ta odpowiedź jest NIEPRAWIDŁOWA. Dzięki komentarzowi @ Lizardx)

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

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

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


3
tak sprytne, a także przypomina nam, na czym polega architektura chipów
code_monk

2
Choć elegancki, niestety nie jest poprawny: uname -m == i686 ALE jeśli ((1 << 32)); następnie echo 64 bity; fi == 64 bity To jest jądro PAE, 32-bitowe, a nie 64-bitowe. Procesor jest jednak zdolny do obsługi 64 bitów, amd64. Ponieważ pytanie dotyczyło sposobu określania łuku jądra, to rozwiązanie przyniosłoby nieprawidłowe wyniki.
Lizardx,

1
note ((jest Bashismem i nie jest zdefiniowany przez POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny

Próbowałem tego na 32-bitowych architekturach i wydaje mi się, że jest to wersja 64-bitowa.
dannyw

To może zadziałać((1<<32)-1)
Ivijan Stefan Stipić

15

W przypadku Debiana :

Na moim komputerze

    ~> dpkg --print-architecture
    amd64
    ~> dpkg --print-obcych-architektur
    i386

My Raspberry Pi 2

    ~> dpkg --print-architecture
    armhf

1
działa to najlepiej przy określaniu architektury pakietu do użycia checkinstall, thx!
Wodnik Moc

Dziękuję Ci. Szukałem czegoś, co porzuciłoby nazwy „standardowych” architektur „amd64” / „i386”, a nie tylko „x86_64”. Nikt nie używa tej terminologii podczas nazywania prekompilowanych wersji.
Cliff

12

Najprostszym sposobem jest uruchomienie:

getconf LONG_BIT

który wyśle ​​64 lub 32 w zależności od tego, czy jest to 32 czy 64 bity.

na przykład:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Ta odpowiedź jest myląca. Jeśli włączysz obsługę wielu ścieżek i zainstalujesz 64-bitowe jądro, instalacja 32-bitowa getconf LONG_BITzostanie wydrukowana, 32mimo że używasz 64-bitowego jądra.
kenn

2

użyj syscap z projektu Formake

syscap pozwala na sondowanie wielu właściwości systemu i zależności testowych. Jest to przenośny skrypt powłoki.

Uzyskaj architekturę procesora:

syscap info -arch

Uzyskaj nazwę i wersję jądra:

syscap info -kernel -kernver

1

Innym sposobem jest sprawdzenie architektury, dla której skompilowano jakiś plik systemowy

$ file /usr/bin/ld
/usr/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped

1
Taka jest architektura systemu, która nie zawsze jest architekturą jądra. Zobacz tę odpowiedź w SU, aby uzyskać więcej wariantów.
Gilles

Teoretycznie mogą się różnić, ale czy istnieje szansa, że ​​będą niezgodne z rzeczywistą instalacją?
minaev

Niektóre dystrybucje dostarczają jądro amd64 w wersji x86. Nie wiem, ile osób z nich korzysta, sprawdziłem popcona Debiana, ale nie koreluje to między poszczególnymi statystykami. Myślę, że głównym przypadkiem użycia jest 32-bitowy główny system operacyjny i 64-bitowy system operacyjny w chroot lub maszynie wirtualnej.
Gilles

@Gilles Spodoba ci się to, co przeczytasz o nowej architekturze x32. Jeśli nie spóźnię się, oczywiście. wiki.debian.org/X32Port
Behrooz

0

Możesz też skorzystać ze sposobu, w jaki wewnętrznie robi to polecenie uname , jeśli chcesz zaimplementować niektóre rzeczy na własną rękę:

#include <sys/utsname.h>
#include <stdio.h>

int main() {
    struct utsname name;
    uname(&name);
    printf("%s\n",name.machine);
    return 0;
}

0

Oto inna metoda użycia uname.

Od man uname:

... -i, --hardware-platform print the hardware platform or "unknown" ...

# uname -i x86_64 #


Aż da „nieznane”
Dagelf

0

Jeśli szukasz prostego jedno-liniowego, jest to najbardziej niezawodne rozwiązanie, jakie znalazłem, które zwraca 64 lub 32 . Nie ma znaczenia, czy korzystasz z ARM, czy nie, i powinien działać na każdym systemie używającym bash lub sh .

Uwaga, zakłada się, że system jest 32-bitowy lub 64-bitowy. Zobacz moje wyjaśnienie poniżej, jeśli chcesz wykryć architekturę 8-16 lub nieco inną.

[$ ((0xffffffff)) -eq -1] && echo 32 || echo 64

Co tu się dzieje?
Logika jest bardzo prosta i wszystko sprowadza się do sposobu, w jaki komputery przechowują podpisane liczby całkowite. Architektura 32-bitowa ma tylko 32 bity, które może wykorzystać do przechowywania podpisanych liczb całkowitych, podczas gdy architektura 64-bitowa ma 64 bity! Innymi słowy, zbiór liczb całkowitych, które można zapisać, jest skończony. Połowa tego zestawu reprezentuje liczby ujemne, a połowa reprezentuje liczby dodatnie. Liczba całkowita ze znakiem równa -1 jest reprezentowana jako największa liczba, jaką można zapisać w danej liczbie bitów dla tej architektury. W systemie 32-bitowym -1 może być reprezentowane przez wartość szesnastkową 0xFFFFFFFF (która jest 32 bitami binarnymi, wszystkie równe 1). W systemie 64-bitowym 0xFFFFFFFF tłumaczy się na 4 294 967 295, podstawa 10, podczas gdy 0xFFFFFFFFFFFFFFFF jest reprezentacją dla -1). Możesz zobaczyć, jak łatwo to skaluje w przypadku systemów 8- lub 16-bitowych, które będą równe -1 przy 0xFF i 0xFFFF,

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.