Khi tôi gõ uname -a
, nó sẽ 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 các tập lệnh configure
, ví dụ: tôi đang xây dựng kiến trúc nào?
Hãy thử uname -m
. Đó là thiếu uname --machine
và nó xuất ra:
x86_64 ==> 64-bit kernel
i686 ==> 32-bit kernel
Mặt khác, không dành cho nhân Linux, mà dành cho CPU , bạn nhập:
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ố chúng, một cái có tên lm
: Long Mode
( x86-64 : AMD64, còn được gọi là Intel 64, tức là có khả năng 64 bit)
lm ==> 64-bit processor
Hoặc sử dụng lshw
(như đã đề cập bên dưới bởi Rolf of Sachsen ), không có 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 .
[.__.] (as ysdx đề cập đến câu trả lời của anh ấy/cô ấy , "Ngày nay, một hệ thống có thể là multiarch vì vậy dù 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 ")
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ừ name -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
lscpu
NAME _ sẽ liệt kê những thông tin này trong số các 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
...
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:
Lệnh
$ Arch
tương đương với
$ uname -m
nhưng nhanh gấp đôi để gõ
#include <stdio.h>
int main(void)
{
printf("%d\n", __WORDSIZE);
return 0;
}
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 chế độ tương thích 64 bit thay vì 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 dpkg-architecture . 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 thành dpkg - 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).
Nếu bạn có HĐH 64 bit, thay vì i686, bạn có x86_64
hoặc ia64
trong đầ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).
Hệ thống đó là 32 bit. iX86 trong uname
có nghĩa là 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
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 ^ Target [.__.] Target: 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 [.__.] $ file 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, đối với GNU/Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c, không bị tước [.__.]
Đố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'!
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
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
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.
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
.
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
$ grep "CONFIG_64" /lib/modules/*/build/.config
# CONFIG_64BIT is not set
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.
[ -z `uname -m | grep 64` ] && echo "32-bit" || echo "64-bit"
Dựa trên thực tế rằng 64 bit thường là x86_64
và 32 bit là i686
, v.v.
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ụ: trong initramfs), các đồng nghiệp của tôi đã đề xuất:
$ 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.2
và x86_64 có /lib64/ld-linux-x86-64.so.2
.