Làm thế nào để xác định kiến ​​trúc nhân Linux?


92

uname -mcung cấp cho i686 và uname -mcung cấp đầu ra i686 i386 trong máy phát hành Red Hat Enterprise Linux Server 5.4 (Tikanga). Tôi cần cài đặt Cơ sở dữ liệu Oracle 10g Phiên bản 2 trên máy đó. Vì vậy, làm thế nào tôi có thể quyết định liệu kiến ​​trúc kernel là 32 bit hay 64 bit?


10
Đó có phải là một lỗi đánh máy trong câu đầu tiên: uname -muname -m?
tshepang

Xem thêm lệnh Linux để trả về số bit (32 hoặc 64)? . Nếu uname -mhiển thị i? 86, bạn có hệ thống 32 bit.
Gilles


Câu hỏi Gilles liên kết để đưa ra một giải pháp thú vị : getconf WORD_BIT.
Mikel

7
getconf WORD_BITtrả về 32 trên Ubuntu 64 bit của tôi
minaev

Câu trả lời:


90

i386 và i686 đều là 32 bit.
x86_64 là 64 bit

ví dụ cho 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:
Xem là ARM ARM 32 hoặc 64 bit của tôi? cho ARM


Còn armv7l thì sao? Trong mọi trường hợp, một lệnh với một phản ứng boolean đơn giản sẽ rất ngon.
dùng7543

1
@ user7543 Đó là ARM 32-bit, vì chúng tôi chưa có ARM 64-bit. Khi chúng tôi làm, nó sẽ là một cái gì đó khác biệt.
Behrooz

Tôi cảm thấy mình nên tạo wiki cộng đồng trả lời nhưng không biết làm thế nào.
Behrooz

1
Hãy thử : uname -m. Điều đó sẽ chỉ hiển thị kiến ​​trúc.
Alexej Magura


32

@behrooz đúng. Thật không may unameđòi hỏi bạn phải biết kiến ​​trúc. Trên thực tế, tôi đang tìm kiếm một danh sách các kiến ​​trúc và tôi tìm thấy bài viết này trả lời câu hỏi của bạn. Liên quan đến uname -m:

x86_64 GNU / Linux cho biết bạn đã chạy kernel Linux 64 bit. Nếu bạn sử dụng xem i386 / i486 / i586 / i686 thì đó là kernel 32 bit.

Để xác định xem phần cứng có khả năng chạy kernel 64 bit không

grep flags /proc/cpuinfo

Tìm kiếm những điều sau trong đầu ra (tất cả các cờ được lấy từ câu trả lời stackoverflow này cho cùng một câu hỏi)

  • lm cờ có nghĩa là cpu chế độ dài - CPU 64 bit
  • tm cờ có nghĩa là Chế độ được bảo vệ - CPU 32 bit
  • rm cờ có nghĩa là Chế độ thực - CPU 16 bit

Cờ lm có nghĩa đơn giản là CPU hỗ trợ 64 bit hay không có nghĩa là nó chạy ở 64 bit. Tôi khuyên bạn nên dựa vào vòm biết rằng nó sẽ là x86_64 cho 64 bit hoặc i? 86 cho 32 bit.
chim cánh cụt359

1
@ penguin359 có nghĩa là cpu hỗ trợ 64-bit.
xenoterracide

@xeno vì vậy không thể được sử dụng để xác định kiến ​​trúc kernel.
chim cánh cụt359

@ penguin359 không, điều đó không rõ ràng trong câu trả lời?
xenoterracide

1
@ penguin359, không nhưng thường rất hữu ích khi tìm hiểu xem HĐH của bạn có chạy 64-bit hay không và nếu không phần cứng có khả năng, imo
xenoterracide

22

(EDIT: câu trả lời này là SAI. Nhờ bình luận của @ Lizardx)

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

if ((1<<32)); then
  echo 64bits
else
  echo 32bits
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.


3
thật thông minh và cũng nhắc nhở chúng ta về kiến ​​trúc chip là gì
code_monk 19/2/2015

2
Mặc dù thanh lịch, nhưng điều này không may là không chính xác: uname -m == i686 NHƯNG nếu ((1 << 32)); sau đó echo 64bits; fi == 64bits Đây là kernel PAE, 32 bit, không phải kernel 64 bit. Cpu có khả năng 64 bit, tuy nhiên, amd64. Vì câu hỏi là làm thế nào để xác định vòm kernel, giải pháp này sẽ mang lại kết quả không chính xác.
Lizardx

1
lưu ý ((là một Bashism và không được xác định bởi POSIX mywiki.wooledge.org/Bashism#Cond điều kiện
Steven Penny

Tôi đã thử điều này trên một số kiến ​​trúc 32 bit và điều này nghĩ rằng nó là 64 bit.
dannyw

Điều này có thể hoạt động((1<<32)-1)
Ivijan Stefan Stipić

15

Đối với Debian :

Trên PC của tôi

    ~> dpkg --print-architecture
    amd64
    ~> dpkg --print-nước ngoài-kiến trúc
    i386

Quả mâm xôi của tôi 2

    ~> dpkg --print-architecture
    áo giáp

1
Điều này hoạt động tốt nhất khi xác định kiến ​​trúc gói để sử dụng với checkinstall, thx!
Sức mạnh Bảo Bình

Cảm ơn bạn. Tôi đã tìm kiếm thứ gì đó sẽ bỏ tên kiến ​​trúc 'tiêu chuẩn' "amd64" / "i386" thay vì chỉ "x86_64". Không ai sử dụng thuật ngữ đó khi đặt tên các bản phát hành được biên dịch trước.
Vách đá

12

Cách đơn giản nhất là chạy:

getconf LONG_BIT

sẽ xuất 64 hoặc 32 tùy thuộc vào việc nó là 32 hay 64 bit.

ví dụ:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
Câu trả lời này là sai lệch. Nếu bạn bật hỗ trợ multiarch và cài đặt kernel 64 bit thì cài đặt 32 bit getconf LONG_BITsẽ in 32mặc dù bạn đang chạy kernel 64 bit.
kenn

2

sử dụng tòa nhà chọc trời từ dự án Formake

syscap cho phép thăm dò nhiều thuộc tính hệ thống và phụ thuộc kiểm tra. Nó là một kịch bản shell di động.

Nhận kiến ​​trúc CPU:

syscap info -arch

Nhận tên và phiên bản kernel:

syscap info -kernel -kernver

1

Một cách khác là kiểm tra kiến ​​trúc một số tệp hệ thống đã được biên dịch cho, như

$ 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
Đó là kiến ​​trúc hệ thống, không phải lúc nào cũng là kiến ​​trúc kernel. Xem câu trả lời này tại SU để biết thêm các biến thể.
Gilles

Về mặt lý thuyết, chúng có thể khác nhau, nhưng có khả năng chúng sẽ không khớp với bất kỳ cài đặt thực tế nào không?
minaev

Một số bản phân phối gửi hạt nhân amd64 trên phiên bản x86. Tôi không biết có bao nhiêu người sử dụng chúng, tôi đã kiểm tra popcon Debian nhưng nó không tương quan giữa các số liệu thống kê khác nhau. Tôi nghĩ trường hợp sử dụng chính là có HĐH chính 32 bit và chạy HĐH 64 bit trong một chroot hoặc trong VM.
Gilles

@Gilles Bạn sẽ thích những gì bạn sẽ đọc về kiến ​​trúc x32 mới, Nếu tôi không quá muộn, tất nhiên. wiki.debian.org/X32Port
Behrooz

0

Hoặc bạn có thể sử dụng cách thức của lệnh uname trong nội bộ nếu bạn muốn tự mình thực hiện một số nội dung:

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

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

0

Đây là một phương pháp khác sử dụng uname.

Từ man uname:

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

# uname -i x86_64 #


Cho đến khi nó cho "ẩn số"
Dagelf

0

Nếu bạn đang tìm kiếm một lớp lót đơn giản, đây là giải pháp đáng tin cậy nhất mà tôi đã tìm thấy trả về 64 hoặc 32 . Không quan tâm bạn có chạy ARM hay không và nó sẽ hoạt động trên mọi hệ thống sử dụng bash hoặc sh .

Coi chừng, điều này sẽ cho rằng hệ thống là 32 bit hoặc 64 bit. Xem giải thích của tôi dưới đây nếu bạn cần phát hiện kiến ​​trúc 8- 16- hoặc một số bit khác.

[$ ((0xffffffff)) -eq -1] && echo 32 || tiếng vang 64

Cái gì ở đây?
Logic rất đơn giản và tất cả tập trung vào cách máy tính lưu trữ các số nguyên đã ký. Kiến trúc 32 bit chỉ có 32 bit mà nó có thể sử dụng để lưu trữ các số nguyên đã ký trong khi kiến ​​trúc 64 bit có 64 bit! Nói cách khác, tập hợp các số nguyên có thể được lưu trữ là hữu hạn. Một nửa bộ này đại diện cho số âm và một nửa đại diện cho số dương. Số nguyên đã ký bằng -1 được biểu diễn dưới dạng số lớn nhất có thể được lưu trữ trong một số bit nhất định cho kiến ​​trúc đó. Trên hệ thống 32 bit, -1 có thể được biểu thị bằng giá trị hex 0xFFFFFFFF (là 32 bit nhị phân, tất cả đều bằng 1). Trên hệ thống 64 bit, 0xFFFFFFFF chuyển thành 4.294.967.295, cơ sở 10 trong khi 0xFFFFFFFFFFFFFFFF là đại diện cho -1). Bạn có thể thấy cách điều này sẽ dễ dàng chia tỷ lệ cho các hệ thống 8- hoặc 16 bit cũng bằng -1 tại 0xFF và 0xFFFF,

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.