วิธีการตรวจสอบสถาปัตยกรรมเคอร์เนล Linux?


92

uname -mให้ i686 และuname -mให้ผลลัพธ์ i686 i386 ใน Red Hat Enterprise Linux Server รีลีสเครื่อง 5.4 (Tikanga) ฉันต้องติดตั้ง Oracle Database 10g Release 2 บนเครื่องนั้น ดังนั้นฉันจะตัดสินใจได้อย่างไรว่าสถาปัตยกรรมเคอร์เนลเป็น 32 บิตหรือ 64 บิต


10
นั่นคือการพิมพ์ผิดในประโยคแรก: uname -mและuname -m?
tshepang

ดูที่คำสั่ง Linux เพื่อส่งคืนจำนวนบิต (32 หรือ 64)? . ถ้าuname -mแสดง i? 86 คุณมีระบบ 32 บิต
Gilles


ลิงค์คำถามของ Gilles เพื่อให้ทางออกที่น่าสนใจ: getconf WORD_BIT.
Mikel

7
getconf WORD_BITส่งคืน 32 บน Ubuntu แบบ 64 บิตของฉัน
minaev

คำตอบ:


90

i386 และ i686 มีทั้งแบบ 32 บิต
x86_64 คือ 64 บิต

ตัวอย่างสำหรับ 64 บิต:

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

แก้ไข:
ดูลินุกซ์ของฉัน ARM 32 หรือ 64 บิตคืออะไร? สำหรับ ARM


แล้ว armv7l ล่ะ? ไม่ว่าในกรณีใดคำสั่งที่มีการตอบกลับแบบบูลีนก็น่าจะอร่อย
user7543

1
@ user7543 มันคือ ARM 32- บิตเพราะเรายังไม่มี ARM 64- บิตเมื่อเราทำมันจะแตกต่างกัน
Behrooz

ฉันรู้สึกว่าฉันควรจะทำให้ชุมชนคำตอบของฉัน wiki แต่ไม่รู้ว่าจะทำอย่างไร
Behrooz

1
ลอง: uname -m. นั่นจะแสดงเฉพาะสถาปัตยกรรม
Alexej Magura

39

ง่ายมาก! ใช้archคำสั่ง


5
แปลก ... เมื่อ 2013 MacBook Pro ของฉันarchผลตอบแทนi386แต่แสดงให้เห็นว่าuname -a x86_64
turboladen

3
@turboladen "ทำไม uname และ arch จึงแตกต่างกันในเอาต์พุต" = superuser.com/questions/835514/…
user10607

note arch ไม่ได้ถูกกำหนดโดย POSIX pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html
Steven Penny

32

@behroozถูกต้อง น่าเสียดายที่unameคุณต้องรู้สถาปัตยกรรม จริงๆแล้วฉันกำลังมองหารายชื่อสถาปัตยกรรมและฉันพบบทความนี้ที่ตอบคำถามของคุณ เกี่ยวกับuname -m:

x86_64 GNU / Linux บ่งชี้ว่าคุณมีเคอร์เนล 64 บิตที่ใช้งานได้ หากคุณใช้ดู i386 / i486 / i586 / i686 มันเป็นเคอร์เนล 32 บิต

เพื่อตรวจสอบว่าฮาร์ดแวร์สามารถเรียกใช้เคอร์เนล 64 บิตได้หรือไม่

grep flags /proc/cpuinfo

ค้นหาสิ่งต่อไปนี้ในผลลัพธ์ (แฟล็กทั้งหมดที่ดึงมาจากคำตอบสแต็คโอเวอร์โฟลว์นี้สำหรับคำถามเดียวกัน)

  • lm flag หมายถึง CPU ในโหมด Long - CPU 64 บิต
  • tm flag หมายถึงโหมดที่ได้รับการป้องกัน - CPU แบบ 32 บิต
  • rm flag หมายถึง Real Mode - 16 บิต CPU

การตั้งค่าสถานะ lm นั้นหมายถึงว่า CPU รองรับ 64 บิตหรือหมายความว่าทำงานใน 64 บิต ฉันขอแนะนำให้ใช้ arch โดยรู้ว่าจะเป็น x86_64 สำหรับ 64-bit หรือ i? 86 สำหรับ 32-bit
penguin359

1
@ penguin359 หมายความว่า cpu รองรับ 64- บิต
xenoterracide

@xeno ดังนั้นจึงไม่สามารถใช้เพื่อกำหนดสถาปัตยกรรมเคอร์เนลได้
penguin359

@ penguin359 ไม่คำตอบนั้นไม่ชัดเจนใช่ไหม
xenoterracide

1
@ penguin359 ไม่ แต่มักจะมีประโยชน์ในการตรวจสอบว่าระบบปฏิบัติการของคุณใช้ 64- บิตหรือไม่ถ้าฮาร์ดแวร์มีความสามารถ imo
xenoterracide

22

(แก้ไข: คำตอบนี้คือผิดขอบคุณความคิดเห็นของ @ Lizardx)

ใน Bash โดยใช้จำนวนเต็มมากเกินไป:

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

มันมีประสิทธิภาพมากกว่าการเรียกใช้กระบวนการอื่นหรือเปิดไฟล์


3
ฉลาดและเตือนเราด้วยว่าสถาปัตยกรรมชิปนั้นเกี่ยวกับอะไร
code_monk

2
ในขณะที่สง่างามนี้น่าเสียดายที่ไม่ถูกต้อง: uname -m == i686 แต่ถ้า ((1 << 32)); echo 64bits; fi == 64bits นี่คือเคอร์เนล PAE, 32 บิตไม่ใช่เคอร์เนล 64 บิต ซีพียูมีความสามารถ 64 บิต แต่ amd64 เนื่องจากคำถามคือวิธีการกำหนด kernel arch โซลูชันนี้จะให้ผลลัพธ์ที่ไม่ถูกต้อง
Lizardx

1
note ((เป็น Bashism และไม่ได้กำหนดโดย POSIX mywiki.wooledge.org/Bashism#Conditionals
Steven Penny

ฉันได้ลองสิ่งนี้กับสถาปัตยกรรม 32 บิตแล้วและคิดว่ามันเป็น 64 บิต
dannyw

สิ่งนี้สามารถใช้ได้((1<<32)-1)
Ivijan Stefan Stipić

15

สำหรับDebian :

บนพีซีของฉัน

    ~> dpkg - print-architecture
    amd64
    ~> dpkg - พิมพ์ - สถาปัตยกรรมต่างประเทศ
    i386

My Raspberry Pi 2

    ~> dpkg - print-architecture
    armhf

1
สิ่งนี้จะทำงานได้ดีที่สุดเมื่อพิจารณาสถาปัตยกรรมแพ็คเกจที่จะใช้กับcheckinstallขอบคุณ!
กุมภ์

ขอขอบคุณ. ฉันกำลังมองหาบางอย่างที่จะทำให้ชื่อสถาปัตยกรรม "มาตรฐาน" "amd64" / "i386" มากกว่า "x86_64" ไม่มีใครใช้คำศัพท์นั้นเมื่อตั้งชื่อการคอมไพล์ล่วงหน้า
หน้าผา

12

วิธีที่ง่ายที่สุดคือเรียกใช้:

getconf LONG_BIT

ซึ่งจะส่งออก 64 หรือ 32 ขึ้นอยู่กับว่ามันเป็น 32 หรือ 64 บิต

เช่น:

dannyw@dannyw-redhat:~$ getconf LONG_BIT
64

2
คำตอบนี้ทำให้เข้าใจผิด หากคุณเปิดใช้งานการสนับสนุน multiarch และติดตั้งเคอร์เนล 64 บิตที่การติดตั้ง 32 บิตgetconf LONG_BITจะพิมพ์32แม้ว่าคุณจะใช้เคอร์เนล 64 บิต
kenn

2

ใช้syscapจากโครงการ Formake

syscapช่วยให้สามารถตรวจสอบคุณสมบัติของระบบจำนวนมากและทดสอบการพึ่งพา มันเป็นสคริปต์เชลล์แบบพกพา

รับสถาปัตยกรรม CPU:

syscap info -arch

รับชื่อเคอร์เนลและเวอร์ชัน:

syscap info -kernel -kernver

1

อีกวิธีคือตรวจสอบสถาปัตยกรรมที่ไฟล์ระบบบางไฟล์ถูกคอมไพล์เช่น

$ 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
นั่นคือสถาปัตยกรรมระบบซึ่งไม่ได้เป็นสถาปัตยกรรมเคอร์เนลเสมอไป ดูคำตอบนี้ได้ที่ SUเพื่อรับรูปแบบเพิ่มเติม
Gilles

ในทางทฤษฎีพวกเขาอาจแตกต่างกัน แต่มีโอกาสที่พวกเขาจะไม่ตรงกันในการติดตั้งในชีวิตจริงใด ๆ ?
minaev

การแจกแจงบางอย่างจัดส่งเคอร์เนล amd64 ในรุ่น x86 ฉันไม่รู้ว่ามีผู้ใช้กี่คนฉันตรวจสอบDebian popconแต่มันไม่สัมพันธ์กันระหว่างสถิติต่างๆ ฉันคิดว่ากรณีการใช้งานหลักมีระบบปฏิบัติการหลัก 32 บิตและใช้งานระบบปฏิบัติการ 64 บิตใน chroot หรือใน VM
Gilles

@Gilles คุณจะรักในสิ่งที่คุณจะได้อ่านเกี่ยวกับสถาปัตยกรรม x32 ใหม่ถ้าฉันยังไม่สายเกินไป wiki.debian.org/X32Port
Behrooz

0

หรือคุณสามารถใช้วิธีการที่คำสั่งuname ทำภายในถ้าคุณต้องการที่จะใช้บางสิ่งด้วยตัวคุณเอง:

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

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

0

unameนี่เป็นอีกวิธีหนึ่งที่ใช้

จากman uname:

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

# uname -i x86_64 #


จนกว่ามันจะให้ "ไม่รู้จัก"
Dagelf

0

หากคุณกำลังมองหาง่ายหนึ่งซับนี้เป็นทางออกที่น่าเชื่อถือมากที่สุดที่ผมเคยพบว่าผลตอบแทนที่ได้64หรือ32 มันไม่สนหรอกว่าคุณกำลังใช้ ARM หรือไม่และมันควรจะทำงานในระบบใด ๆ โดยใช้ทุบตีหรือการดวลจุดโทษ

ระวังนี่จะถือว่าระบบเป็นแบบ 32 บิตหรือ 64 บิต ดูคำอธิบายของฉันด้านล่างหากคุณต้องการตรวจสอบ 8-16- หรือสถาปัตยกรรมอื่นบิต

[$ ((0xffffffff)) -eq -1] && echo 32 || echo 64

เกิดอะไรขึ้นที่นี่?
ตรรกะนั้นง่ายมากและทุกอย่างก็ลงเอยด้วยวิธีการที่คอมพิวเตอร์เก็บจำนวนเต็มลงนาม สถาปัตยกรรม 32- บิตมีเพียง 32 บิตที่สามารถใช้สำหรับการจัดเก็บจำนวนเต็มลงนามในขณะที่สถาปัตยกรรม 64- บิตมี 64 บิต! กล่าวอีกนัยหนึ่งชุดของจำนวนเต็มที่สามารถเก็บได้นั้นมี จำกัด ครึ่งหนึ่งของชุดนี้แสดงถึงจำนวนลบและครึ่งหนึ่งแสดงถึงจำนวนบวก เลขจำนวนเต็มที่ลงนามเท่ากับ -1 จะแสดงเป็นจำนวนมากที่สุดที่สามารถเก็บไว้ในจำนวนบิตที่กำหนดสำหรับสถาปัตยกรรมนั้น บนระบบ 32 บิต -1 สามารถแสดงด้วยค่าเลขฐานสิบหก 0xFFFFFFFF (ซึ่งเป็น 32 บิตบิตซึ่งเท่ากับ 1 ทั้งหมด) บนระบบ 64 บิต 0xFFFFFFFF แปลเป็น 4,294,967,295 ฐาน 10 ขณะที่ 0xFFFFFFFFFFFFFFFF เป็นตัวแทนสำหรับ -1) คุณสามารถดูว่าสิ่งนี้จะปรับขนาดได้อย่างง่ายดายสำหรับระบบที่ 8- หรือ 16- บิตเช่นกันซึ่งจะเท่ากับ -1 ที่ 0xFF และ 0xFFFF

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.