Bagaimana cara menentukan apakah Linux yang diberikan adalah 32 bit atau 64 bit?

470

Ketika saya mengetik uname -a, itu memberikan output berikut.

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

Bagaimana saya bisa tahu dari ini bahwa OS yang diberikan adalah 32 atau 64 bit?

Ini berguna saat menulis configureskrip, misalnya: untuk arsitektur apa saya membangun?

swapnonil
sumber

Jawaban:

735

Coba uname -m. Yang singkat uname --machinedan hasilnya:

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

Jika tidak, bukan untuk kernel Linux, tetapi untuk CPU , Anda mengetik:

cat /proc/cpuinfo

atau:

grep flags /proc/cpuinfo

Di bawah parameter "flags", Anda akan melihat berbagai nilai: lihat " Apa arti flag dalam / proc / cpuinfo? " Di antara mereka, satu bernama lm: Long Mode( x86-64 : amd64, juga dikenal sebagai Intel 64, yaitu 64-bit mampu)

lm ==> 64-bit processor

Atau menggunakanlshw (seperti yang disebutkan di bawah oleh Rolf of Saxony ), tanpa sudo(hanya untuk menangkap lebar cpu):

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

Catatan: Anda dapat memiliki CPU 64-bit dengan kernel 32-bit diinstal .
(seperti ysdx menyebutkan dalam jawabannya sendiri , "Saat ini, sebuah sistem bisa multiarch sehingga tidak masuk akal juga. Anda mungkin ingin mencari target default dari kompiler")

VONC
sumber
3
grep flags / proc / cpuinfo hanya memberi tahu Anda apakah CPU 64bit. Ketika saya mengerti pertanyaan itu tentang OS. uname -m hanya memberi tahu saya "i686".
Kim Stebel
3
Saya memiliki kernel 32 bit pada perangkat keras 64 bit dan mendapatkan "x86_64" dari 'uname -m' (di Debian). Halaman manual uname mengatakan bahwa -m menunjukkan nama perangkat keras mesin, sehingga sepertinya benar.
Tony Meyer
1
Jika saya memiliki kernel 32-bit yang berjalan pada mesin / prosesor 64-bit, apa yang akan uname -i, uname -pdan uname -mtampilkan?
ruben2020
4
bagaimana jika tm dan lm keduanya ada?
Javier Novoa C.
4
@JavierNovoaC. tm (Monitor Termal) menunjukkan kontrol jam Otomatis. Ini tidak ada hubungannya dengan membedakan prosesor 32-bit. Bahkan, lm (mode panjang) hadir jika dan hanya jika Anda memiliki CPU 64-bit. Jadi itu sebabnya Anda hanya mengandalkan lm. kalau tidak, jawaban yang diberikan oleh Thomas Watnedal adalah yang terbaik. Jawaban ini salah dan telah menyesatkan banyak orang, tetapi moderator melakukan sesuatu tentangnya.
Issam T.
153

Jika Anda menjalankan platform 64 bit, Anda akan melihat x86_64 atau sesuatu yang sangat mirip pada output dari uname -a

Untuk menjalankan nama perangkat keras mesin spesifik Anda

uname -m

Anda juga bisa menelepon

getconf LONG_BIT

yang mengembalikan 32 atau 64

Thomas Watnedal
sumber
4
uname -mkeluaran x86_64 getconf LONG_BITkeluaran 32mana yang benar ?? : \
Stephan
10
Itu berarti CPU-nya 64-bit, tetapi Anda hanya menginstal sistem operasi 32-bit, meskipun Anda bisa menggunakan yang 64-bit.
1
Steve Kemp benar, jadi berhati-hatilah (Mac OS X 10.5 pada 2009 MacBook datang ke pikiran, di mana OS 32-bit tetapi mampu menjalankan aplikasi 64-bit)
jww
1
Ini uname -mtidak berguna untuk QP configurekarena dapat memberikan hasil yang salah. The getconf LONG_BITmendapatkan ukuran bit default dari C library yang mungkin tidak menjadi ukuran yang benar untuk ditentukan, oleh CC, compiler.
user3710044
2
getconf LONG_BITmungkin menyediakan 32 ig itu telah dibangun sebagai aplikasi 32 bit (biasanya 64 bit kernel menjalankan userland 32 bit).
ysdx
42

lscpu akan mencantumkan ini di antara informasi lain mengenai CPU Anda:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...
asharma
sumber
3
Output kemampuan fisik CPU, berguna, tetapi tidak dapat diandalkan untuk ruang pengguna saat ini dari OS saat ini.
user3710044
33

Perintah lain yang berguna untuk penentuan mudah adalah sebagai berikut:

Perintah:

getconf LONG_BIT

Menjawab:

  • 32, jika OS 32 bit
  • 64, jika OS 64 bit
user3207041
sumber
2
Tidak benar dalam kasus HP-UX 11.31i pada Itanium 64: perintah ini mengembalikan 32.
Gabriel Hautclocq
Saya kira itu semua tergantung pada apa yang dimaksud oleh penanya dengan "64-bit" - ini dulu berarti ukuran alami dari bilangan bulat, tetapi sekarang sering digunakan untuk mengartikan ukuran pengalamatan.
Toby Speight
12

Perintah

$ arch    

setara dengan

$ uname -m

tetapi dua kali lebih cepat untuk mengetik

Greg von Winckel
sumber
2
Setuju, tapi saya yakin kecepatan mengetik tidak menjadi masalah bagi sebagian besar pengembang.
williamcarswell
2
Ini mengembalikan tipe proses yang dapat didukung oleh kernel. Adalah mungkin dan bahkan masuk akal untuk menjalankan userspace 32 bit pada kernel 64bit.
user3710044
1
Perintah lengkung tidak tersedia pada setiap sistem unix, sedangkan uname seharusnya.
Gabriel Hautclocq
11

Saya bertanya-tanya tentang hal ini khusus untuk membangun perangkat lunak dalam Debian (sistem Debian yang diinstal dapat berupa versi 32-bit dengan kernel 32-bit, pustaka, dll., Atau dapat berupa versi 64-bit dengan hal-hal yang dikompilasi untuk 64- bit daripada mode kompatibilitas 32-bit).

Paket Debian sendiri perlu tahu untuk apa arsitekturnya (tentu saja) ketika mereka benar-benar membuat paket dengan semua metadata-nya, termasuk arsitektur platform, jadi ada alat pengemasan yang mengeluarkannya untuk alat pengemasan dan skrip lain untuk digunakan, disebut dpkg-arsitektur . Ini mencakup apa yang dikonfigurasi untuk membangun, serta host saat ini. (Biasanya ini sama saja.) Contoh output pada mesin 64-bit:

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

Anda dapat mencetak hanya satu dari variabel-variabel itu atau melakukan tes terhadap nilainya dengan opsi baris perintah ke dpkg -architecture.

Saya tidak tahu bagaimana arsitektur dpkg menyimpulkan arsitektur, tetapi Anda bisa melihat dokumentasi atau kode sumbernya (arsitektur dpkg dan sebagian besar sistem dpkg pada umumnya adalah Perl).

Reed Hedges
sumber
Anda bisa menggunakan: dpkg --architectureuntuk mendapatkan arsitektur sistem host, yang tidak memerlukan dpkg-devpaket untuk diinstal.
Mark Longair
Ini menghasilkan dpkg: error: unknown option --architectureuntuk dpkg 1.17.5ubuntu dari 14.04. dpkg-architecture (dengan dpkg-dev diinstal) berfungsi dengan baik.
timurb
2
Perintah dpkg --print-architecturetelah bekerja pada Debian sejak selamanya. Yang ini berfungsi tetapi terbatas pada Debian dan turunannya.
user3710044
11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}
sangat buruk
sumber
2
Bekerja tetapi tampaknya merupakan detail implementasi stdio.h di Linux, ada solusi yang lebih baik, misalnya: limit.h, JANGAN GUNAKAN.
user3710044
10

Jika Anda memiliki OS 64-bit, bukan i686, Anda memiliki x86_64atau ia64dalam output uname -a. Dalam hal ini Anda tidak memiliki salah satu dari dua string ini; Anda memiliki OS 32-bit (perhatikan bahwa ini tidak berarti bahwa CPU Anda tidak 64-bit).

Denis R.
sumber
1
Ini mengembalikan tipe proses yang dapat didukung oleh kernel. Adalah mungkin dan bahkan masuk akal untuk menjalankan userspace 32 bit pada kernel 64bit.
user3710044
Ada nilai-nilai lain dalam unameoutput yang menunjukkan OS 64-bit. Tidak semua dunia adalah x86 atau Itanium ...
Toby Speight
6

Sistem itu 32bit. iX86 in unameberarti arsitekturnya adalah 32-bit. Jika 64 bit, itu akan kembali

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
sumber
1
Ini mengembalikan tipe proses yang dapat didukung oleh kernel. Adalah mungkin dan bahkan masuk akal untuk menjalankan userspace 32 bit pada kernel 64bit.
user3710044
6

Saat ini, suatu sistem bisa multiarch sehingga tidak masuk akal pula. Anda mungkin ingin menemukan target default dari kompiler:

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

Anda dapat mencoba mengompilasi hello world:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ file foo
foo: ELF 64-bit LSB yang dapat dieksekusi, x86-64, versi 1 (SYSV), ditautkan secara dinamis, interpreter /lib64/ld-linux-x86-64.so.2, untuk GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, tidak dilucuti
ysdx
sumber
1
Karena khusus untuk cc -v | grep …kompiler, seseorang hanya dapat menggunakan cc -dumpmachine, yang tidak memerlukan grepping dan didukung tidak hanya oleh GCC.
Anton Samsonov
Mengingat bahwa pertanyaannya menyarankan untuk skrip konfigurasi, ini mungkin jawaban yang paling berguna dan relevan di sini. Ini akan melakukan apa yang Anda inginkan dalam semua kasus yang penting (termasuk chroot pengguna 32-bit pada OS 64-bit, kompilasi silang untuk arsitektur asing, dan lainnya).
Toby Speight
5

Sehubungan dengan jawaban "getconf LONG_BIT" .

Saya menulis fungsi sederhana untuk melakukannya di '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;
    }
}

Ide bagus, 'getconf'!

kaiwan
sumber
5
Ide konyol! Gunakan CHAR_BIT*sizeof(void*)atau __WORDSIZEdalam C.
ceving
3
Tidak, itu tidak konyol. Anda mungkin memiliki 32-bit yang dapat dieksekusi dan Anda ingin mencari tahu apakah sistem akan mendukung 64-bit, misalnya.
Ludvig A. Norin
Mendapat panjang default lama di pustaka GNU-C .. yang ini berfungsi!
user3710044
1
Itu sebenarnya salah, karena jika Anda menjalankan 32 bit userspace pada 64 bit kernel, atau bahkan X32 userspace, itu akan mengatakan bahwa OS adalah 32 bit.
Ruslan
Sangat disarankan untuk tidak menggunakan fgets: stackoverflow.com/questions/16323185/…
ceving
4

Anda juga dapat memeriksa menggunakan variabel lingkungan:

echo $HOSTTYPE

Hasil:

i386 -> 32 bit

x86_64 -> 64 bit

Diambil dari: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html

LinuxMaintwo
sumber
1
Ini adalah variabel bawaan karena /bin/bashbukan variabel lingkungan. Jika Anda sudah bergantung pada Bash, ini berfungsi dengan baik. Namun, hasilnya bisa i386, i486, i586, i686dan lain-lain jadi hati-hati.
user3710044
3

Di Bash, menggunakan integer overflow:

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

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

Luchostein
sumber
2
Bash dikompilasi untuk menggunakan int 64bit jika jenis itu tersedia, biasanya saat ini dan sistem 32bit biasanya akan menggunakan tipe "long long"
user3710044
2
bash di Debian telah dikompilasi untuk menggunakan aritmatika 64bit sejak 2008 paling lambat, mungkin lebih awal dari itu. Jawaban ini telah rusak sejak sebelum stackoverflow ada.
Peter Cordes
3

getconf menggunakan panggilan sistem paling sedikit:

$ 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
pengguna5859111
sumber
2

Jika Anda menggeser 1 ke kiri sebesar 32 dan Anda mendapatkan 1, sistem Anda adalah 32 bit. Jika Anda menggeser 1 kiri sebesar 64 dan Anda mendapatkan 1, sistem Anda adalah 64 bit.

Dengan kata lain,

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
sumber
Masalah yang sama dengan bash menggunakan "long long".
user3710044
Ini bekerja untuk saya, karena jika mengembalikan 32 bit maka 100% dikonfirmasi berjalan 32. Jika mengembalikan 64 mungkin bash dikompilasi dengan lama.
JCM
1

Jika satu sangat terbatas dalam binari yang tersedia (misalnya dalam initramfs), kolega saya menyarankan:

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

Pada sistem ALT Linux saya, i586 memiliki /lib/ld-linux.so.2dan x86_64 memiliki /lib64/ld-linux-x86-64.so.2.

Michael Shigorin
sumber
Saya mendapat TIGA dari mereka, satu untuk 32 satu untuk 64 dan satu untuk mx32.
user3710044
Ya, jika itu tidak mengembalikan banyak pustaka 64-bit, maka itu menjalankan OS 32 bit: ls -aR | grep 64 | grep -v proc
JCM
1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
alex
sumber
Saya mendapat dua baris, satu dengan itu mengatur satu tanpa.
user3710044
1

Saya tidak percaya bahwa selama ini, tidak ada yang menyebutkan:

sudo lshw -class cpu

untuk mendapatkan perincian tentang kecepatan, kuantitas, ukuran dan kemampuan perangkat keras CPU.

Rolf of Saxony
sumber
1

Skrip sederhana untuk mendapatkan 64 bit atau 32 bit

        if $(getconf LONG_BIT | grep '64'); then
           echo "64 bit system"
        else
            echo "32 bit system"
        fi
lakshmikandan
sumber
1

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

Berdasarkan fakta bahwa 64-bit biasanya x86_64 dan 32-bit i686dll.

79man
sumber
-6

Pertama, Anda harus mengunduh Virtual Box. Kemudian pilih Linux baru dan 32-bit. Kemudian boot linux menggunakannya. Jika boot maka 32 bit jika tidak maka 64 bit.

Vikram Thaman
sumber
2
Ini adalah cara yang sangat tidak masuk akal untuk menentukan apakah sistemnya 32 atau 64 bit.
marlar
Tetapi ini benar-benar cara untuk menyelesaikan masalah ini. Jadi saya akan menandainya.
firo
Ini mengingatkan saya pada cara untuk mengetahui bilangan genap dari ganjil: sebuah perhitungan matematika akan melihat sisanya setelah membaginya menjadi dua; seorang programmer akan melihat bagian paling tidak penting; spesialis MS SQL akan membuat dua tabel, satu untuk angka genap dan satu untuk yang aneh, dan lihat di mana input berakhir ... angka
Michael Shigorin