Linux çekirdek mimarisi nasıl belirlenir?


92

uname -mi686 uname -mverir ve Red Hat Enterprise Linux Server 5.4 (Tikanga) makinesinde i686 i386 çıktı verir. Bu makineye Oracle Database 10g Release 2'yi yüklemem gerekiyor. Peki, çekirdek mimarisinin 32bit mi yoksa 64bit mi olduğuna nasıl karar verebilirim?


10
Bu ilk cümlede bir yazım hatası mı: uname -mve uname -m?
tshepang

Bit sayısını döndürmek için Linux komutuna da bakın (32 veya 64)? . Eğer uname -mgösterileri i? 86, bir 32 bit sistem var.
Gilles


Gilles bağlanan soruya ilginç bir çözüm sunar: getconf WORD_BIT.
Mikel

7
getconf WORD_BIT64-bit
Ubuntu'mda

Yanıtlar:


90

i386 ve i686'nın her ikisi de 32-bit'tir.
x86_64 64 bit

64 bit için örnek:

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

EDIT:
Bakın linux ARM 32 veya 64 bit mi? ARM için


Peki ya armv7l? Her durumda, basit bir boolean yanıtı olan bir komut lezzetli olur.
kullanıcı7543

1
@ user7543 ARM 32-bit, çünkü henüz 64-bit ARM yok. Yaptığımızda, farklı bir şey olacak.
Behrooz

Cevap topluluğumu wiki yapmam gerektiğini hissediyorum ama nasıl yapılacağını bilmiyorum.
Behrooz

1
Deneyin: uname -m. Bu sadece mimariyi gösterir.
Alexej Magura


32

@behrooz doğru. Ne yazık ki unamemimarileri bilmenizi gerektirir. Aslında, bir mimarlık listesi arıyordum ve sorunuzu yanıtlayan bu makaleyi buldum . İle ilgili olarak uname -m:

x86_64 GNU / Linux 64 bit bir Linux çekirdeğinin çalıştığını gösterir. Eğer i386 / i486 / i586 / i686'yı görürseniz, 32 bitlik bir çekirdektir.

Donanımın 64 bit çekirdek çalıştırabildiğini belirlemek için

grep flags /proc/cpuinfo

Çıktıda aşağıdakine bakın ( aynı sorgu için bu stackoverflow yanıtından alınan tüm bayraklar )

  • lm flag Uzun mod işlemci anlamına gelir - 64 bit CPU
  • tm flag, Korumalı mod anlamına gelir - 32 bit CPU
  • rm flag, Gerçek Mod anlamına gelir - 16 bit CPU

Lm bayrağı basitçe CPU'nun 64-bit'i desteklediği anlamına mı geliyor, yoksa 64-bit'te çalıştığı anlamına mı geliyor. 64-bit için x86_64 veya 32-bit için i-86 olacağını bilerek arch'a güvenmenizi tavsiye ederim.
penguin359

1
@ penguin359 bu cpu 64-bit destekler anlamına gelir.
xenoterracide

Bu nedenle @ xeno, çekirdek mimarisini belirlemek için kullanılamaz.
penguin359

@ penguin359 hayır, cevaptaki belirsiz miydi?
xenoterracide

1
@ penguin359, hayır, ancak işletim sisteminizin 64-bit kullanıp kullanmadığını ve donanımın çalışıp çalışmadığını öğrenmek
imka

22

(EDIT: bu cevap YANLIŞ. @ Lizardx'ın yorumuna teşekkürler)

Bash'de tamsayı taşması kullanarak:

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

Başka bir işlemi başlatmak veya dosyaları açmaktan çok daha etkilidir.


3
çok zekice ve bize çip mimarisinin ne hakkında olduğunu hatırlatıyor
code_monk

2
Zarif olsa da, bu ne yazık ki doğru değil: uname -m == i686 AMA eğer ((1 << 32)); sonra yankı 64 bit; fi == 64 bit Bu PAE çekirdeği, 32 bit, 64 bit çekirdeği değil. İşlemci 64 bit kapasitesine sahip, ancak amd64. Soru çekirdek kemerinin nasıl belirleneceği olduğundan, bu çözüm yanlış sonuçlar doğurur.
Lizardx

1
notu ((bir basarizmdir ve POSIX tarafından tanımlanmamıştır. mywiki.wooledge.org/Bashism#Conditionals
Steven Penny

Bunu 32 bit mimaride denedim ve bu 64 bit olduğunu düşünüyor.
dannyw,

Bu işe yarayabilir((1<<32)-1)
Ivijan Stefan Stipić

15

İçin Debian :

Benim bilgisayarımda

    ~> dpkg --print mimarisi
    amd64
    ~> dpkg - dış baskı mimarileri
    i386

Ahududu Pi 2

    ~> dpkg --print mimarisi
    armhf

1
Kullanılacak paket mimarisini belirlerken en iyi checkinstallsonuç budur, thx!
Kova Gücü

Teşekkür ederim. Sadece "x86_64" yerine "standart" "amd64" / "i386" mimari adlarını bırakacak bir şey arıyorum. Hiç kimse önceden derlenmiş sürümleri adlandırırken bu terminolojiyi kullanmaz.
Cliff

12

En basit yol koşmaktır:

getconf LONG_BIT

32 veya 64 bit olup olmadığına bağlı olarak 64 veya 32 çıkacaktır.

Örneğin:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Bu cevap yanıltıcıdır. Multiarch desteğini etkinleştirirseniz ve 64 bit çekirdeği çalıştırıyor olsanız bile getconf LONG_BIT, 32 bit yüklemeden 64 bit çekirdeği yüklerseniz yazdırılır 32.
kenn

2

kullanmak SYSCAP gelen Formake projesi

Syscap birçok sistem özelliği ve test bağımlılığı araştırabilir. Taşınabilir bir kabuk betiğidir.

CPU mimarisini edinin:

syscap info -arch

Çekirdek adı ve sürümünü edinin:

syscap info -kernel -kernver

1

Başka bir yol da, bazı sistem dosyalarının derlendiği mimariyi kontrol etmektir.

$ 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
Bu her zaman çekirdek mimarisi olmayan sistem mimarisidir. Daha fazla varyasyon için SU'daki bu cevaba bakınız .
Gilles

Teorik olarak farklı olabilirler, ancak herhangi bir gerçek hayat kurulumunda uyuşmama ihtimali var mı?
minaev

Bazı dağıtımlar, x86 sürümünde bir amd64 çekirdeği gönderir. Onları kaç kişinin kullandığını bilmiyorum, Debian popcon'u kontrol ettim, ancak çeşitli istatistikler arasında bir ilişki yok. Ana kullanım durumunun 32 bit ana işletim sistemine sahip olduğunu ve bir chroot veya VM'de 64 bit işletim sistemi çalıştığını düşünüyorum.
Gilles

@Gilles Yeni x32 mimarisi hakkında okuyacağınız şeyi seveceksiniz, Çok geç kalmazsam, elbette. wiki.debian.org/X32Port
Behrooz

0

Veya bazı şeyleri kendi başınıza uygulamak istiyorsanız , uname komutunun dahili olarak ne yaptığını kullanabilirsiniz :

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

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

0

İşte kullanarak başka bir yöntem uname.

Kimden man uname:

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

# uname -i x86_64 #


"Bilinmeyen" i
verinceye

0

Basit bir tek gömlek arıyorsanız, 64 veya 32 döndüren bulduğum en güvenilir çözüm budur . ARM kullanıp kullanmamanız önemli değil ve bash veya sh kullanan herhangi bir sistemde çalışması gerekiyor .

Dikkat, bu sistemin 32 bit veya 64 bit olduğunu varsayar. 8 - 16 veya başka bir bit mimarisini tespit etmeniz gerekiyorsa aşağıdaki açıklamalarıma bakınız.

[$ ((0xffffffff)) -eq -1] && eko 32 || yankı 64

Burada ne dolaşıyor?
Mantık çok basittir ve bilgisayarların imzalı tamsayıları nasıl depoladıklarına bağlı olarak kısalır. 32-bit bir mimaride işaretli tamsayıları depolamak için kullanabileceği 32 bit varken 64-bit bir mimaride 64 bit! Başka bir deyişle, saklanabilecek tam sayı kümesi sonludur. Bu kümenin yarısı negatif sayıları, yarısı pozitif sayıları temsil eder. -1'ye eşit işaretli tamsayı, bu mimari için belirli sayıda bitte depolanabilen en büyük sayı olarak temsil edilir. 32-bit bir sistemde -1, 0xFFFFFFFF (hepsi 1'e eşit olan 32 bit, onaltılık) değeriyle gösterilebilir. 64 bitlik bir sistemde, 0xFFFFFFFF, 4,294,967,295, üs 10'a karşılık gelirken, 0xFFFFFFFFFFFFFFFF -1 ile aynıdır. Bunun 0xFF ve 0xFFFF'de -1'e eşit olacak şekilde 8- veya 16 bit sistemler için nasıl kolayca ölçeklenebileceğini görebilirsiniz,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.