Bagaimana saya tahu jika kernel linux saya berjalan dalam 32bit atau 64bit?

10

Ketika saya melakukan cat di / proc / cpuinfo ia menunjukkan baris dengan clflushsize: 64

Apakah ini berarti kernel saya berjalan dalam 64 bit?

Daniel Cukier
sumber

Jawaban:

15
uname -a

akan memberi tahu Anda kernel - bit akhirnya memberi tahu Anda arsitekturnya.

Dua contoh:

Mac saya:

Darwin Mac.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386

Hosting Dreamhost saya:

Linux ecco 2.6.24.5-serf-xeon-c6.1-grsec #1 SMP Tue Oct 7 06:18:04 PDT 2008 x86_64 GNU/Linux

i386 = 32 bit

x86_64 = 64 bit

Bradshaw yang kaya
sumber
3
Jawaban ini salah. Bit akhir memberi tahu Anda arsitektur yang terpapar pada proses, bukan arsitektur kernel. Lihat tautan ini .
David Schwartz
12

uname -makan memberi Anda arsitektur tempat Anda menyusun kernel. Jika ia mencetak i686maka kernel Anda adalah 32 bit, jika x86_64kemudian 64 bit, dengan asumsi Anda memiliki chip Intel / AMD.

drrlvn
sumber
Bisa juga i386pada platform 32-bit yang lebih tua (dan saya bahkan telah melihat beberapa paket dikompilasi untuk i586- tidak yakin apakah itu akan pernah menjadi output oleh uname, meskipun)
a_m0d
3
Jawaban ini salah. uname -mmemberi Anda arsitektur yang kernel pilih untuk mengekspos ke proses khusus ini, bukan arsitektur asli kernel. Lihat tautan ini .
David Schwartz
@ David Schwartz: Komentar Anda terlalu keras tanpa alasan dan fakta bahwa Anda telah memposting tidak ada alternatif membuatnya terlihat lebih buruk. Pokoknya dicatat bahwa secara default uname -m tidak melaporkan arsitektur nyata. Jika tidak, maka kemungkinan besar admin benar-benar ingin Anda percaya bahwa Anda menggunakan arsitektur lain itu dan taruhan terbaik Anda adalah menerima bahwa dia tahu apa yang dia lakukan. Jika Anda adalah admin dan Anda mengacaukannya setarchmaka Anda sudah lebih tahu.
ndemou
Saya tidak tahu apa yang kasar tentang pernyataan faktual yang sebenarnya bahwa jawabannya salah. Apa yang Anda maksud dengan "membuatnya terlihat lebih buruk". Mungkin tidak ada jalan. Mungkin ada cara yang baik. Saya tidak tahu, jadi saya tidak menjawab pertanyaan ini. Adapun akhir komentar Anda, saya hanya tidak setuju. Skrip dapat, dan melakukan, menggunakan setarchdan Anda dapat menjalankan skrip seperti itu tanpa tahu bahwa itu menyebabkan uname -muntuk mengembalikan sesuatu yang berbeda. Mungkin saja, bahkan mungkin, bahwa masalah-masalah seperti inilah mengapa OP bertanya.
David Schwartz
@anda admin mungkin telah mengatur sistem sedemikian rupa sehingga aplikasi apa pun termasuk initberpikir itu 32-bit: situasi untuk ini adalah 64-bit kernel dengan 32-bit userspace. Banyak sistem kompilasi bergantung pada uname -muntuk menentukan flag-flag compiler, mis. Bahwa dari GDB, mereka harus dilengkapi dengan kepribadian palsu. Tetapi beberapa aplikasi userspace lain masih ingin mengetahui jenis kernel apa yang dimilikinya (misalnya untuk beberapa kebutuhan tingkat rendah), terlepas dari kepribadiannya.
Ruslan
9

Saya pikir cara yang paling tepat adalah

getconf LONG_BIT

di sini persis menunjukkan 64

ditemukan di tip ini

getconf berasal dari package libc-bin (di ubuntu)

Aquarius Power
sumber
2

Jika Anda menginginkan laporan yang mudah namun terperinci tentang sistem Anda (CPU, Kernel dan perangkat lunak Core OS) dan bukan hanya kernel maka inilah skrip bash kecil yang akan memberi Anda jawaban dengan cepat.

Jika Anda cukup tahu tentang kekhasan CPU 32bit / 64bit dan S / W, ini cukup mudah. Jika Anda tidak tahu banyak dan berpikir bahwa "sistem" Anda adalah 32bit atau 64bit maka itu akan membantu Anda menemukan bahwa kebenaran bisa lebih kompleks (bagian dari sistem Anda mungkin 64bit sementara yang lain 32bit) tanpa membingungkan Anda.

Sekali lagi skrip ini (dan jawabannya) bukan untuk pertanyaan literal "Bagaimana saya tahu jika kernel Linux saya berjalan dalam 32bit atau 64bit?" tetapi bagi mereka yang juga ingin tahu lengkungan CPU mereka, dan inti OS SW.

Contoh laporan

Ini adalah contoh untuk kasus yang agak tidak biasa:

Laporan dari skrip mini (untuk pengguna berpengalaman)

You have a 64 bit CPU
Your kernel reports that the architecture is 32 bit
Your /sbin/init process is 64 bit
Your C compiler is configured to produce 32 bit executables

Laporkan dari skrip yang lebih besar (untuk pengguna yang kurang berpengalaman)

You have a 64 bit CPU
Your kernel reports that the architecture is 32 bit
    If you are not the admin he can make a 64bit kernel report 32bit (see man setarch)
    In this case he has (because we have 64bit programs)
Your /sbin/init process is 64 bit
    Most other core OS programs will probably be 64 bits also.
    You may use the following command to check a specific program.
      file -L /path/to/program
Your C compiler is configured to produce 32 bit executables
    (Note that a 64bit compiler may be setup to produce 32bit code)

Skrip

Skrip mini (untuk admin berpengalaman)

4 baris ini memberikan semua informasi penting.

grep -w 'lm' /proc/cpuinfo > /dev/null && echo "You have a 64 bit CPU" || echo "You have a 32 bit CPU"
echo "Your kernel reports that the architecture is $(uname -m|sed -e 's/x86_64/64 bit/' -e 's/i.86/32 bit/')"
echo "Your /sbin/init process is $(file /sbin/init|sed -e 's/^.* \(32\|64\) bit.*$/\1bit/')"
echo "Your C compiler is configured to produce $(getconf LONG_BIT) bit executables"

Skrip yang lebih besar (untuk pengguna yang kurang berpengalaman)

Script ini mencetak banyak penjelasan dan berguna jika Anda tidak memiliki pengalaman pada subjek dan dihadapkan dengan kasus yang aneh.

#!/bin/bash

# collect system info
grep -w 'lm' /proc/cpuinfo > /dev/null && CPU=64 || CPU=32
ARCH=$(uname -m|sed -e 's/x86_64/64/' -e 's/i.86/32/')
INIT=$(file -L /sbin/init|sed -e 's/^.* \(32\|64\)-bit.*$/\1/')
COMPILER=$(getconf LONG_BIT)

# if all values are the same we set UNIFORM="YES"
! echo "$CPU $ARCH $INIT $COMPILER" | grep -q "$CPU $CPU $CPU $CPU" && UNIFORM="NO" || UNIFORM="YES"

# report to the user
echo "You have a $CPU bit CPU"
echo "Your kernel reports that the architecture is $ARCH bit"
if [ "$UNIFORM" = "NO" ] && [ "$ARCH" = "32" ] ; then
       echo "    If you are not the admin he can make a 64bit kernel report 32bit (see man setarch)"
       if  [ "$INIT" = "64" ] ||  [ "$COMPILER" = "64" ] ; then
           echo "    In this case he has (because we have 64bit programs)"
       else
           echo "    We don't see such signs so you most likely run a 32bit kernel"
           echo "    (A 64bit CPU can run 32bit kernels)"
       fi
fi
echo "Your /sbin/init process is $INIT bit"
if [ "$CPU" = "64" ] ; then
     echo "    Most other core OS programs will probably be $INIT bits also."
     echo "    You may use the following command to check a specific program."
     echo "      file -L /path/to/program"
fi
if [ "$UNIFORM" = "NO" ] && [ "$INIT" = "32" ] ; then
     echo "    (Note that a 64bit kernel may start a 32bit init process)"
fi
echo "Your C compiler is configured to produce $COMPILER bit executables"
if [ "$UNIFORM" = "NO" ] && [ "$COMPILER" = "32" ] ; then
        echo "    (Note that a 64bit compiler may be setup to produce 32bit code)"
fi

Jika Anda ingin tahu lebih banyak, baca dua halaman ini dari tempat saya mendapatkan sebagian besar informasi a) /programming/246007/how-to-determine-whether-a-given-linux-is-32- bit-or-64-bit b) /unix//a/134394/73271

ndemou
sumber
0

Jika Anda hanya ingin melihat platform yang sedang Anda jalankan, Anda dapat menggunakannya

uname -i

Daftar lengkap opsi yang didukung unameadalah

$ uname --help
Usage: uname [OPTION]...
Print certain system information.  With no OPTION, same as -s.

  -a, --all                print all information, in the following order,
                             except omit -p and -i if unknown:
  -s, --kernel-name        print the kernel name
  -n, --nodename           print the network node hostname
  -r, --kernel-release     print the kernel release
  -v, --kernel-version     print the kernel version
  -m, --machine            print the machine hardware name
  -p, --processor          print the processor type or "unknown"
  -i, --hardware-platform  print the hardware platform or "unknown"
  -o, --operating-system   print the operating system
      --help     display this help and exit
      --version  output version information and exit
a_m0d
sumber
uname -icetakan GenuineIntel, yang sebenarnya bukan yang dia cari.
drrlvn
dan Unknowndi Mac.
Rich Bradshaw
cetakan i386di mesin saya!
a_m0d
0

CLFLUSHSIZEtidak memberi tahu Anda apa-apa tentang mode operasi prosesor. Menurut jawaban ini , ini mengacu pada unit cache yang paling kecil yang dapat disiram. Dalam kasus Anda, baris cache dibaca / ditulis dalam satuan 64 byte.

unameoutput terlalu banyak untuk berguna, seperti yang terlihat pada tabel contoh Wikipedia . Metode yang paling dapat diandalkan adalah getconf LONG_BITseperti yang ditunjukkan dalam jawaban Aquarius Power . Ini berfungsi terlepas dari arsitektur prosesor, begitu juga di rumah pada ARM, Power, atau MIPS seperti pada x86.

Toby Speight
sumber