Làm cách nào để xác định xem một Linux đã cho là 32 bit hay 64 bit?


470

Khi tôi gõ uname -a, nó cho đầu ra sau.

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

Làm thế nào tôi có thể biết rằng hệ điều hành đã cho là 32 hoặc 64 bit?

Điều này hữu ích khi viết configurecác kịch bản, ví dụ: tôi đang xây dựng kiến ​​trúc nào?

Câu trả lời:


735

Hãy thử uname -m. Đó là thiếu uname --machinevà nó xuất ra:

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

Mặt khác, không phải cho nhân Linux, mà cho CPU , bạn gõ:

cat /proc/cpuinfo

hoặc là:

grep flags /proc/cpuinfo

Trong tham số "flags", bạn sẽ thấy các giá trị khác nhau: xem " Các cờ trong / Proc / cpuinfo có nghĩa là gì? " Trong số đó, một cái có tên lm: Long Mode( x86-64 : amd64, còn được gọi là Intel 64, tức là 64-bit có khả năng)

lm ==> 64-bit processor

Hoặc sử dụnglshw (như được đề cập dưới đây bởi Rolf of Sachsen ), mà không sudo(chỉ để lấy chiều rộng cpu):

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

Lưu ý: bạn có thể có CPU 64 bit được cài đặt kernel 32 bit .
(như ysdx đề cập trong câu trả lời của riêng anh ấy / cô ấy , "Ngày nay, một hệ thống có thể là đa quốc gia nên sao nó cũng không có ý nghĩa. Bạn có thể muốn tìm mục tiêu mặc định của trình biên dịch")


3
cờ grep / Proc / cpuinfo chỉ cho bạn biết CPU có 64 bit. Theo tôi hiểu câu hỏi đó là về hệ điều hành. uname -m chỉ cho tôi biết "i686".
Kim Stebel

3
Tôi có kernel 32 bit trên phần cứng 64 bit và nhận "x86_64" từ 'uname -m' (trên Debian). Trang man cho uname nói rằng -m hiển thị tên phần cứng của máy, vì vậy điều đó có vẻ đúng.
Tony Meyer

1
Nếu tôi có một hạt nhân 32-bit chạy trên một phiên bản 64-bit / máy xử lý, điều gì sẽ uname -i, uname -puname -mchương trình?
ruben2020

4
Nếu tm và lm đều có mặt thì sao?
Javier Novoa C.

4
@JavierNovoaC. tm (Màn hình nhiệt) cho biết điều khiển đồng hồ tự động. Nó không có gì để làm với việc phân biệt bộ xử lý 32 bit. Trong thực tế, lm (chế độ dài) có mặt khi và chỉ khi bạn có CPU 64 bit. Vì vậy, đó là lý do tại sao bạn chỉ nên dựa vào lm. nếu không thì câu trả lời của Thomas Watnedal là tốt nhất. Câu trả lời này là sai và đã đánh lừa nhiều người điều hành plz làm điều gì đó về nó.
Issam T.

153

Nếu bạn đang chạy một nền tảng 64 bit, bạn sẽ thấy x86_64 hoặc một cái gì đó rất giống trong đầu ra từ uname -a

Để có được tên phần cứng máy cụ thể của bạn chạy

uname -m

Bạn cũng có thể gọi

getconf LONG_BIT

trả về 32 hoặc 64


4
uname -mđầu ra đầu x86_64 getconf LONG_BITra 32cái nào đúng ?? : \
Stephan

10
Điều đó có nghĩa là CPU là 64 bit, nhưng bạn chỉ cài đặt hệ điều hành 32 bit trên nó, mặc dù bạn có thể đã sử dụng hệ điều hành 64 bit.

1
Steve Kemp đã đúng, vì vậy hãy cẩn thận (Mac OS X 10.5 trên MacBook 2009 xuất hiện, trong đó HĐH là 32 bit nhưng có khả năng chạy các ứng dụng 64 bit)
jww

1
Điều uname -mnày không hữu ích cho QP configurevì nó có thể cho kết quả sai. Các getconf LONG_BITcó được kích thước chút mặc định của thư viện C có thể không phải là kích thước chính xác cho một quy định, bởi CC, biên dịch.
dùng3710044

2
getconf LONG_BITcó thể cung cấp 32 ig, nó đã được xây dựng dưới dạng ứng dụng 32 bit (thường là kernel 64 bit chạy vùng người dùng 32 bit).
ysdx

42

lscpu sẽ liệt kê ra những thông tin khác liên quan đến CPU của bạn:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
...

3
Xuất ra các khả năng vật lý của CPU, hữu ích, nhưng không đáng tin cậy cho không gian người dùng hiện tại của HĐH hiện tại.
dùng3710044

33

Một lệnh hữu ích khác để xác định dễ dàng là như sau:

Chỉ huy:

getconf LONG_BIT

Câu trả lời:

  • 32, nếu HĐH là 32 bit
  • 64, nếu HĐH là 64 bit

2
Không đúng trong trường hợp HP-UX 11.31i trên Itanium 64: lệnh này trả về 32.
Gabriel Hautclocq

Tôi đoán tất cả phụ thuộc vào ý nghĩa của người hỏi đối với "64-bit" - nó thường có nghĩa là kích thước tự nhiên của số nguyên, nhưng giờ đây nó thường được sử dụng để thay đổi kích thước địa chỉ.
Toby Speight

12

Lệnh

$ arch    

tương đương với

$ uname -m

nhưng nhanh gấp đôi để gõ


2
Đồng ý, nhưng tôi chắc chắn tốc độ gõ không phải là vấn đề đối với hầu hết các nhà phát triển.
williamcarswell

2
Điều này trả về các loại quy trình mà kernel có thể hỗ trợ. Có thể và thậm chí hợp lý khi chạy không gian người dùng 32 bit trên kernel 64 bit.
dùng3710044

1
Lệnh arch không có sẵn trên mọi hệ thống unix, trong khi uname nên có.
Gabriel Hautclocq

11

Tôi đã tự hỏi về điều này đặc biệt cho việc xây dựng phần mềm trong Debian (hệ thống Debian đã cài đặt có thể là phiên bản 32 bit với kernel 32 bit, thư viện, v.v. hoặc có thể là phiên bản 64 bit với nội dung được biên dịch cho 64- bit chứ không phải chế độ tương thích 32 bit).

Bản thân các gói Debian cần biết kiến ​​trúc của chúng là gì (tất nhiên) khi chúng thực sự tạo ra gói với tất cả siêu dữ liệu của nó, bao gồm kiến ​​trúc nền tảng, do đó, có một công cụ đóng gói xuất ra nó cho các công cụ đóng gói và tập lệnh khác được sử dụng, được gọi là kiến trúc dpkg . Nó bao gồm cả những gì nó được cấu hình để xây dựng, cũng như máy chủ hiện tại. (Thông thường đây là giống nhau.) Ví dụ đầu ra trên máy 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

Bạn chỉ có thể in một trong các biến đó hoặc thực hiện kiểm tra đối với các giá trị của chúng bằng các tùy chọn dòng lệnh để dpkg -arch architecture.

Tôi không biết làm thế nào kiến ​​trúc dpkg suy ra kiến ​​trúc, nhưng bạn có thể xem tài liệu hoặc mã nguồn của nó (kiến trúc dpkg và phần lớn hệ thống dpkg nói chung là Perl).


Bạn chỉ có thể sử dụng: dpkg --architectuređể có được kiến ​​trúc hệ thống máy chủ, không yêu cầu dpkg-devgói phải được cài đặt.
Mark Longair

Điều này tạo ra dpkg: error: unknown option --architecturecho dpkg 1.17.5ubfox của 14.04. dpkg-architecture (đã cài đặt dpkg-dev) hoạt động tốt.
timurb

2
Lệnh dpkg --print-architectuređã hoạt động trên Debian mãi mãi. Cái này hoạt động nhưng bị giới hạn ở Debian và nó là dẫn xuất.
dùng3710044

11
#include <stdio.h>

int main(void)
{
    printf("%d\n", __WORDSIZE);
    return 0;
}

2
Hoạt động nhưng dường như là một chi tiết triển khai của stdio.h trên Linux, tồn tại các giải pháp tốt hơn, ví dụ: giới hạn.h, KHÔNG SỬ DỤNG.
dùng3710044

10

Nếu bạn có HĐH 64 bit, thay vì i686, bạn có x86_64hoặc ia64ở đầu ra của uname -a. Trong đó bạn không có bất kỳ chuỗi nào trong hai chuỗi này; bạn có HĐH 32 bit (lưu ý rằng điều này không có nghĩa là CPU của bạn không phải là 64 bit).


1
Điều này trả về các loại quy trình mà kernel có thể hỗ trợ. Có thể và thậm chí hợp lý khi chạy không gian người dùng 32 bit trên kernel 64 bit.
dùng3710044

Có các giá trị khác trong unameđầu ra chỉ ra HĐH 64 bit. Không phải tất cả thế giới là một x86 hoặc Itanium ...
Toby Speight

6

Hệ thống đó là 32 bit. iX86 unamecó nghĩa là nó là một kiến ​​trúc 32 bit. Nếu là 64 bit, nó sẽ trở lại

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

1
Điều này trả về các loại quy trình mà kernel có thể hỗ trợ. Có thể và thậm chí hợp lý khi chạy không gian người dùng 32 bit trên kernel 64 bit.
dùng3710044

6

Ngày nay, một hệ thống có thể là đa quốc gia nên dù sao nó cũng không có ý nghĩa gì. Bạn có thể muốn tìm mục tiêu mặc định của trình biên dịch:

$ cc -v 2> & 1 | grep ^ mục tiêu
Mục tiêu: x86_64-pc-linux-gn

Bạn có thể thử biên dịch một thế giới xin chào:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ tập tin foo
foo: ELF 64-bit LSB thực thi, x86-64, phiên bản 1 (SYSV), được liên kết động, trình thông dịch /lib64/ld-linux-x86-64.so.2, cho GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, không bị tước

1
cc -v | grep …dù sao là dành riêng cho trình biên dịch, người ta chỉ có thể sử dụng cc -dumpmachine, không yêu cầu grepping và không chỉ được GCC hỗ trợ.
Anton Samsonov

Cho rằng câu hỏi gợi ý cho kịch bản cấu hình, đây có lẽ là câu trả lời hữu ích và phù hợp nhất ở đây. Nó sẽ làm những gì bạn muốn trong tất cả các trường hợp quan trọng (bao gồm cả người dùng 32 bit chroot trên HĐH 64 bit, biên dịch chéo cho kiến ​​trúc nước ngoài và phần còn lại).
Toby Speight

5

Đối với câu trả lời "getconf LONG_BIT" .

Tôi đã viết một chức năng đơn giản để làm điều đó trong '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;
    }
}

Ý kiến ​​hay đấy, 'getconf'!


5
Ý tưởng ngớ ngẩn! Sử dụng CHAR_BIT*sizeof(void*)hoặc __WORDSIZEtrong C.
ceving

3
Không, nó không ngớ ngẩn. Bạn có thể có một tệp thực thi 32 bit và bạn muốn tìm hiểu xem hệ thống có hỗ trợ 64 bit không, chẳng hạn.
Ludvig A. Norin

Lấy độ dài mặc định của một đoạn dài trong thư viện GNU-C .. cái này hoạt động!
dùng3710044

1
Thực tế là nó sai, bởi vì nếu bạn đang chạy không gian người dùng 32 bit trên kernel 64 bit, hoặc thậm chí là không gian người dùng X32, thì nó sẽ nói rằng HĐH là 32 bit.
Ruslan

Chúng tôi khuyên bạn không nên sử dụng fgets: stackoverflow.com/questions/16323185/ trên
ceving

4

Bạn cũng có thể kiểm tra bằng biến môi trường:

echo $HOSTTYPE

Kết quả:

i386 -> 32 bit

x86_64 -> 64 bit

Trích xuất từ: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html


1
Đây là một biến tích hợp cho /bin/bashnó không phải là biến môi trường. Nếu bạn đã phụ thuộc vào Bash thì điều này hoạt động tốt. Tuy nhiên, kết quả có thể được i386, i486, i586, i686và những người khác vì vậy hãy cẩn thận.
dùng3710044

3

Trong Bash, sử dụng tràn số nguyên:

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

Nó hiệu quả hơn nhiều so với việc gọi một quá trình khác hoặc mở tệp.


2
Bash được (có thể?) Được biên dịch để sử dụng int 64bit nếu loại đó có sẵn, ngày nay nó thường và vì vậy các hệ thống 32 bit thường sẽ sử dụng loại "dài dài"
user3710044

2
bash trong Debian đã được biên dịch để sử dụng số học 64 bit kể từ năm 2008 muộn nhất, có thể sớm hơn thế. Câu trả lời này đã bị phá vỡ kể từ trước khi stackoverflow tồn tại.
Peter Cordes

3

getconf sử dụng các cuộc gọi hệ thống ít nhất:

$ 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

2

Nếu bạn thay đổi 1 trái 32 và bạn nhận được 1, hệ thống của bạn là 32 bit. Nếu bạn thay đổi 1 trái 64 và bạn nhận được 1, hệ thống của bạn là 64 bit.

Nói cách khác,

if echo $((1<<32)) gives 1 then your system is 32 bit.

if echo $((1<<64)) gives 1 then your system is 64 bit.


Vấn đề tương tự với bash sử dụng "longs dài".
dùng3710044

Điều này làm việc cho tôi, bởi vì nếu nó trả về 32 bit thì nó đã được xác nhận 100% khi chạy 32. Nếu nó trả về 64 thì bash có thể được biên dịch trong thời gian dài.
JCM

1

Nếu một trong những hạn chế nghiêm trọng trong các nhị phân có sẵn (ví dụ như trong initramfs), các đồng nghiệp của tôi đề nghị:

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

Trên các hệ thống ALT Linux của tôi, i586 có /lib/ld-linux.so.2và x86_64 có /lib64/ld-linux-x86-64.so.2.


Tôi đã nhận được BA trong số đó, một cho 32 một cho 64 và một cho mx32.
dùng3710044

Vâng, nếu nó không trả về hàng tấn thư viện 64 bit, thì nó đang chạy HĐH 32 bit: ls -aR | grep 64 | grep -v Proc
JCM

1
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set

Tôi có hai dòng, một với nó đặt một mà không có.
dùng3710044

1

Tôi không thể tin rằng trong tất cả thời gian này, không ai nhắc đến:

sudo lshw -class cpu

để biết chi tiết về tốc độ, số lượng, kích thước và khả năng của phần cứng CPU.


1

Kịch bản đơn giản để có được 64 bit hoặc 32 bit

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

1

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

Dựa trên thực tế là 64 bit thường x86_64và 32 bit là i686v.v.


-6

Đầu tiên bạn phải tải xuống Virtual Box. Sau đó chọn Linux mới và 32 bit. Sau đó khởi động linux bằng cách sử dụng nó. Nếu nó khởi động thì nó là 32 bit nếu không thì nó là 64 bit.


2
Đây là một cách thực sự rất xa để xác định xem hệ thống là 32 hay 64 bit.
tuyên bố

Nhưng nó thực sự là một cách để giải quyết vấn đề này. Vì vậy, tôi sẽ đánh dấu nó lên.
firo

Điều này nhắc nhở tôi về một cách để nói các số chẵn từ lẻ: một phép toán sẽ nhìn vào phần còn lại sau khi chia cho hai; một lập trình viên sẽ nhìn vào bit có ý nghĩa ít nhất; một chuyên gia MS SQL sẽ tạo hai bảng, một bảng cho số chẵn và một bảng lẻ và xem nơi đầu vào kết thúc ... số liệu
Michael Shigorin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.