Bagaimana cara menentukan arsitektur kernel Linux?

92

uname -mmemberikan i686 dan uname -mmemberikan output i686 i386 di mesin Red Hat Enterprise Linux Server rilis 5.4 (Tikanga). Saya perlu menginstal Oracle Database 10g Release 2 di mesin itu. Jadi, bagaimana saya bisa memutuskan apakah arsitektur kernel 32bit atau 64bit?

pengguna2914
sumber
10
Apakah itu salah ketik pada kalimat pertama: uname -mdan uname -m?
tshepang
Lihat juga perintah Linux untuk mengembalikan jumlah bit (32 atau 64)? . Jika uname -mmenunjukkan i? 86, Anda memiliki sistem 32-bit.
Gilles
Pertanyaan Gilles link ke memberikan solusi menarik: getconf WORD_BIT.
Mikel
7
getconf WORD_BITmengembalikan 32 pada Ubuntu 64-bit saya
minaev

Jawaban:

90

i386 dan i686 keduanya 32-bit.
x86_64 adalah 64-bit

contoh untuk 64 bit:

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:
Lihat apakah linux ARM 32 atau 64 bit saya? untuk ARM

Behrooz
sumber
Bagaimana dengan armv7l? Bagaimanapun, perintah dengan respons boolean sederhana akan lezat.
user7543
1
@ user7543 ARM 32-bit, karena kami belum memiliki ARM 64-bit. Ketika kami melakukannya, itu akan menjadi sesuatu yang berbeda.
Behrooz
Saya merasa saya harus membuat komunitas jawaban saya wiki tetapi tidak tahu caranya.
Behrooz
1
Cobalah: uname -m. Itu hanya akan menunjukkan arsitektur.
Alexej Magura
32

@behrooz benar. Sayangnya unamemengharuskan Anda untuk mengetahui arsitektur. Sebenarnya, saya sedang mencari daftar arsitektur dan saya menemukan artikel ini yang menjawab pertanyaan Anda. Berkenaan dengan uname -m:

x86_64 GNU / Linux menunjukkan bahwa Anda telah menjalankan kernel Linux 64bit. Jika Anda menggunakan lihat i386 / i486 / i586 / i686 itu adalah kernel 32 bit.

Untuk menentukan apakah perangkat keras mampu menjalankan kernel 64-bit

grep flags /proc/cpuinfo

Cari yang berikut ini di output (semua flag diambil dari jawaban stackoverflow ini untuk pertanyaan yang sama)

  • lm flag berarti cpu mode Panjang - CPU 64 bit
  • tm flag berarti Mode terlindungi - CPU 32-bit
  • rm flag berarti Real Mode - 16 bit CPU
xenoterracide
sumber
Apakah flag lm berarti CPU mendukung 64-bit atau apakah itu berarti berjalan di 64-bit. Saya sarankan mengandalkan lengkungan mengetahui bahwa itu akan menjadi x86_64 untuk 64-bit atau saya? 86 untuk 32-bit.
penguin359
1
@ penguin359 itu berarti cpu mendukung 64-bit.
xenoterracide
@xeno demikian maka tidak dapat digunakan untuk menentukan arsitektur kernel.
penguin359
@ penguin359 tidak, apakah itu tidak jelas dalam jawabannya?
xenoterracide
1
@ penguin359, tidak, tetapi sering kali berguna untuk mengetahui apakah OS Anda berjalan 64-bit dan jika tidak, jika perangkat kerasnya mampu, imo
xenoterracide
22

(EDIT: jawaban ini SALAH. Terima kasih atas komentar @ Lizardx)

Di Bash, menggunakan integer overflow:

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

Ini jauh lebih efisien daripada memanggil proses lain atau membuka file.

Luchostein
sumber
3
sangat pintar dan juga mengingatkan kita tentang arsitektur chip
code_monk
2
Meskipun elegan, sayangnya ini tidak benar: uname -m == i686 NAMUN jika ((1 << 32)); kemudian echo 64bits; fi == 64bits Ini adalah kernel PAE, 32 bit, bukan kernel 64 bit. CPU ini mampu 64 bit namun, amd64. Karena pertanyaannya adalah bagaimana menentukan lengkungan kernel, solusi ini akan menghasilkan hasil yang salah.
Lizardx
1
note ((adalah Bashism dan tidak didefinisikan oleh POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny
Saya telah mencoba ini pada beberapa arsitektur 32 bit dan ini berpikir itu 64 bit.
dannyw
Ini bisa berhasil((1<<32)-1)
Ivijan Stefan Stipić
15

Untuk Debian :

Di PC saya

    ~> dpkg --print-architecture
    amd64
    ~> dpkg - print-foreign-architecture
    i386

Raspberry Pi 2 saya

    ~> dpkg --print-architecture
    armhf
Артем Телешев
sumber
1
ini berfungsi paling baik ketika menentukan arsitektur paket untuk digunakan checkinstall, thx!
Aquarius Power
Terima kasih. Saya telah mencari sesuatu yang akan menjatuhkan nama arsitektur 'standar' "amd64" / "i386" daripada hanya "x86_64". Tidak ada yang menggunakan terminologi itu ketika menamai rilis yang telah dikompilasi.
Tebing
12

Cara paling sederhana adalah menjalankan:

getconf LONG_BIT

yang akan menghasilkan 64 atau 32 tergantung pada apakah itu 32 atau 64 bit.

misalnya:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64
dannyw
sumber
2
Jawaban ini menyesatkan. Jika Anda mengaktifkan dukungan multiarch dan menginstal kernel 64 bit lebih dari 32 bit instalasi getconf LONG_BITakan mencetak 32meskipun Anda menjalankan kernel 64 bit.
kenn
2

gunakan syscap dari proyek Formake

syscap memungkinkan untuk menyelidiki banyak properti sistem dan menguji dependensi. Ini adalah skrip shell portabel.

Dapatkan arsitektur CPU:

syscap info -arch

Dapatkan nama dan versi kernel:

syscap info -kernel -kernver
Alex
sumber
1

Cara lain adalah dengan memeriksa arsitektur beberapa file sistem dikompilasi, seperti

$ 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
minaev
sumber
1
Itulah arsitektur sistem, yang tidak selalu arsitektur kernel. Lihat jawaban ini di SU untuk variasi yang lebih banyak.
Gilles
Secara teoritis, mereka mungkin berbeda, tetapi apakah ada kemungkinan mereka tidak cocok pada instalasi kehidupan nyata?
minaev
Beberapa distribusi mengirimkan kernel amd64 pada versi x86. Saya tidak tahu berapa banyak orang yang menggunakannya, saya memeriksa Debian popcon tetapi tidak berkorelasi antara berbagai statistik. Saya pikir use case utama adalah memiliki OS utama 32-bit dan menjalankan OS 64-bit di chroot atau di VM.
Gilles
@Gilles Anda akan menyukai apa yang akan Anda baca tentang arsitektur x32 yang baru, Jika saya tidak terlambat, tentunya. wiki.debian.org/X32Port
Behrooz
0

Atau Anda dapat menggunakan cara apa yang dilakukan perintah uname secara internal jika Anda ingin mengimplementasikan beberapa hal sendiri:

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

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

Berikut metode lain yang digunakan uname.

Dari man uname:

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

# uname -i x86_64 #

clusterdude
sumber
Sampai itu memberi "tidak diketahui"
Dagelf
0

Jika Anda mencari satu-liner sederhana, ini adalah solusi paling andal yang saya temukan yang mengembalikan 64 atau 32 . Tidak peduli apakah Anda menjalankan ARM atau tidak, dan itu harus bekerja pada sistem apa pun menggunakan bash atau sh .

Hati-hati, ini akan menganggap sistem 32-bit atau 64-bit. Lihat penjelasan saya di bawah ini jika Anda perlu mendeteksi arsitektur 8- 16- atau beberapa bit lainnya.

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

Apa yang terjadi di sini?
Logikanya sangat sederhana dan semuanya bermuara pada bagaimana komputer menyimpan bilangan bulat yang ditandatangani. Arsitektur 32-bit hanya memiliki 32 bit yang dapat digunakan untuk menyimpan bilangan bulat yang ditandatangani sementara arsitektur 64-bit memiliki 64 bit! Dengan kata lain, himpunan bilangan bulat yang dapat disimpan terbatas. Setengah dari himpunan ini mewakili angka negatif dan setengah mewakili angka positif. Bilangan bulat bertanda sama dengan -1 direpresentasikan sebagai angka terbesar yang dapat disimpan dalam jumlah bit tertentu untuk arsitektur itu. Pada sistem 32-bit, -1 dapat diwakili oleh nilai hex 0xFFFFFFFF (yang merupakan 32 bit biner, semua sama dengan 1). Pada sistem 64-bit, 0xFFFFFFFF diterjemahkan menjadi 4.294.967.295, basis 10 sedangkan 0xFFFFFFFFFFFFFFFF adalah representasi untuk -1). Anda dapat melihat bagaimana ini akan dengan mudah skala untuk sistem yang 8- atau 16-bit juga yang akan sama dengan -1 pada 0xFF dan 0xFFFF,

b_laoshi
sumber