วิธีการตรวจสอบว่าลินุกซ์ที่ได้รับคือ 32 บิตหรือ 64 บิต?


470

เมื่อฉันพิมพ์uname -aมันจะให้ผลลัพธ์ต่อไปนี้

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

ฉันจะรู้ได้อย่างไรว่าระบบปฏิบัติการที่กำหนดคือ 32 หรือ 64 บิต

สิ่งนี้มีประโยชน์เมื่อเขียนconfigureสคริปต์ตัวอย่างเช่น: ฉันกำลังสร้างสถาปัตยกรรมอะไร

คำตอบ:


735

ลองuname -mดู อันไหนสั้นuname --machineและเอาท์พุท:

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

มิฉะนั้นไม่ใช่สำหรับเคอร์เนล Linux แต่สำหรับ CPUคุณพิมพ์:

cat /proc/cpuinfo

หรือ:

grep flags /proc/cpuinfo

ภายใต้พารามิเตอร์ "ค่าสถานะ" คุณจะเห็นค่าต่าง ๆ : ดู " ค่าสถานะใน / proc / cpuinfo หมายถึงอะไร " ในบรรดาค่านี้มีชื่อหนึ่งชื่อlm: Long Mode( x86-64 : amd64 หรือที่รู้จักกันในชื่อ Intel 64 เช่น 64 บิต ความสามารถ)

lm ==> 64-bit processor

หรือใช้lshw (ตามที่ระบุไว้ด้านล่างโดยRolf of Saxony ) โดยไม่ต้องsudo(สำหรับการโละความกว้างของ cpu):

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

หมายเหตุ: คุณสามารถมี CPU 64 บิตเคอร์เนล 32 บิตติดตั้ง
(ตามที่ysdxระบุไว้ในคำตอบของเขา / เธอ "ทุกวันนี้ระบบสามารถมีหลายแบบได้ดังนั้นจึงไม่สมเหตุสมผลคุณอาจต้องการค้นหาเป้าหมายเริ่มต้นของคอมไพเลอร์")


3
grep ตั้งค่าสถานะ / proc / cpuinfo เพียงบอกคุณว่า CPU เป็น 64 บิต เมื่อฉันเข้าใจคำถามเกี่ยวกับระบบปฏิบัติการ uname -m เพียงบอกฉันว่า "i686"
Kim Stebel

3
ฉันมีเคอร์เนล 32 บิตบนฮาร์ดแวร์ 64 บิตและรับ "x86_64" จาก 'uname -m' (บน Debian) man page สำหรับ uname บอกว่า -m แสดงชื่อฮาร์ดแวร์ของเครื่องดังนั้นจึงดูเหมือนว่าถูกต้อง
Tony Meyer

1
ถ้าผมมีเคอร์เนล 32 บิตที่ทำงานบน 64 บิต / เครื่องประมวลผลสิ่งที่จะuname -i, uname -pและuname -mการแสดง?
ruben2020

4
เกิดอะไรขึ้นถ้ามีทั้ง tm และ lm
Javier Novoa C.

4
@JavierNovoaC tm (ตรวจสอบความร้อน) หมายถึงการควบคุมนาฬิกาอัตโนมัติ มันไม่มีส่วนเกี่ยวข้องกับการแยกโปรเซสเซอร์ 32 บิต ในความเป็นจริง lm (โหมดยาว) จะปรากฏหากคุณมี CPU 64 บิต นั่นคือเหตุผลที่คุณควรพึ่งพา LM เท่านั้น มิฉะนั้นคำตอบที่ได้รับจาก Thomas Watnedal นั้นดีที่สุด คำตอบนี้เป็นเพียงผิดและมีหลายคนทำผิดผู้ดูแลกรุณาทำอะไรกับมัน
Issam T.

153

หากคุณใช้แพลตฟอร์ม 64 บิตคุณจะเห็น x86_64 หรือสิ่งที่คล้ายกันมากในเอาต์พุตจากuname -a

เพื่อให้ชื่อฮาร์ดแวร์เครื่องของคุณทำงานโดยเฉพาะ

uname -m

นอกจากนี้คุณยังสามารถโทร

getconf LONG_BIT

ซึ่งส่งกลับทั้ง 32 หรือ 64


4
uname -mเอาท์พุทx86_64 getconf LONG_BITเอาท์พุท32เป็นที่หนึ่งที่ถูกต้อง ?? : \
เตฟาน

10
นั่นหมายความว่า CPU เป็น 64 บิต แต่คุณได้ติดตั้งระบบปฏิบัติการ 32 บิตไว้แล้วเท่านั้นแม้ว่าคุณจะสามารถใช้ 64 บิตได้ก็ตาม

1
Steve Kemp ถูกต้องดังนั้นควรระมัดระวัง (Mac OS X 10.5 ในปี 2009 MacBooks คำนึงถึงแล้วว่าระบบปฏิบัติการเป็นแบบ 32 บิต แต่สามารถเรียกใช้แอป 64 บิตได้)
jww

1
uname -mไม่เป็นประโยชน์สำหรับ QP ที่คล้ายกันconfigureเท่าที่จะสามารถให้ผลที่ไม่ถูกต้อง getconf LONG_BITได้รับบิตขนาดเริ่มต้นของห้องสมุด C ซึ่งอาจจะไม่ขนาดที่ถูกต้องสำหรับการระบุโดยCCคอมไพเลอร์
user3710044

2
getconf LONG_BITอาจให้ 32 ig มันถูกสร้างขึ้นเป็นแอปพลิเคชัน 32 บิต (โดยทั่วไปเคอร์เนล 64 บิตใช้ userland 32 บิต)
ysdx

42

lscpu จะแสดงรายการเหล่านี้ท่ามกลางข้อมูลอื่น ๆ ที่เกี่ยวข้องกับ CPU ของคุณ:

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

3
เอาต์พุตความสามารถทางกายภาพของ CPU มีประโยชน์ แต่ไม่น่าเชื่อถือสำหรับ userspace ปัจจุบันของระบบปฏิบัติการปัจจุบัน
user3710044

33

คำสั่งที่มีประโยชน์อื่นสำหรับการพิจารณาอย่างง่ายมีดังนี้:

คำสั่ง:

getconf LONG_BIT

ตอบ:

  • 32 ถ้าระบบปฏิบัติการเป็น 32 บิต
  • 64 ถ้าระบบปฏิบัติการเป็น 64 บิต

2
ไม่เป็นความจริงในกรณีของ HP-UX 11.31i บน Itanium 64: คำสั่งนี้คืนค่า 32
Gabriel Hautclocq

ฉันเดาว่าทั้งหมดขึ้นอยู่กับความหมายของผู้ถามด้วย "64- บิต" - ใช้เพื่อหมายถึงขนาดของจำนวนเต็ม แต่ตอนนี้มักใช้เพื่อหมายถึงขนาดที่อยู่แทน
Toby Speight

12

คำสั่ง

$ arch    

เทียบเท่ากับ

$ uname -m

แต่เร็วกว่าพิมพ์สองเท่า


2
เห็นด้วย แต่ฉันแน่ใจว่าความเร็วในการพิมพ์ไม่ใช่ปัญหาสำหรับนักพัฒนาส่วนใหญ่
williamcarswell

2
สิ่งนี้จะคืนค่าประเภทกระบวนการที่เคอร์เนลสามารถรองรับได้ มีความเป็นไปได้และเหมาะสมในการรัน 32 บิต userspace บน 64 บิต
user3710044

1
คำสั่ง arch ไม่สามารถใช้ได้กับระบบยูนิกซ์ทุกระบบในขณะที่ uname ควรเป็น
Gabriel Hautclocq

11

ฉันสงสัยเกี่ยวกับสิ่งนี้โดยเฉพาะสำหรับการสร้างซอฟต์แวร์ในDebian (ระบบ Debian ที่ติดตั้งสามารถเป็นรุ่น 32 บิตพร้อมเคอร์เนล 32 บิตไลบรารี ฯลฯ หรืออาจเป็นรุ่น 64 บิตที่รวบรวมสิ่งสำหรับ 64- บิตแทนโหมดความเข้ากันได้ 32 บิต)

แพ็คเกจเดเบียนจำเป็นต้องรู้ว่าสถาปัตยกรรมนั้นมีไว้เพื่ออะไร (แน่นอน) เมื่อสร้างแพ็คเกจด้วยข้อมูลเมตาทั้งหมดรวมถึงสถาปัตยกรรมแพลตฟอร์มดังนั้นจึงมีเครื่องมือบรรจุภัณฑ์ที่ให้ผลลัพธ์สำหรับเครื่องมือบรรจุภัณฑ์และสคริปต์อื่น ๆ ที่ใช้เรียกว่าdpkg สถาปัตยกรรม มันมีทั้งสิ่งที่มันถูกกำหนดค่าให้สร้างเช่นเดียวกับโฮสต์ปัจจุบัน (โดยปกติสิ่งเหล่านี้จะเหมือนกัน) ตัวอย่างผลลัพธ์ในเครื่อง 64 บิต:

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

คุณสามารถพิมพ์เพียงหนึ่งในตัวแปรเหล่านั้นหรือทำการทดสอบกับค่าของพวกเขาด้วยตัวเลือกบรรทัดคำสั่งเพื่อdpkg -สถาปัตยกรรม

ฉันไม่รู้ว่า dpkg-architecture ช่วยลดความซับซ้อนของสถาปัตยกรรมได้อย่างไร แต่คุณสามารถดูเอกสารหรือซอร์สโค้ด (dpkg-architecture และระบบ dpkg โดยทั่วไปเป็น Perl)


คุณสามารถใช้: dpkg --architectureเพื่อรับสถาปัตยกรรมระบบโฮสต์ซึ่งไม่จำเป็นต้องdpkg-devติดตั้งแพคเกจ
Mark Longair

สิ่งนี้สร้างdpkg: error: unknown option --architectureสำหรับ dpkg 1.17.5 Ubuntu จาก 14.04 สถาปัตยกรรม dpkg (เมื่อติดตั้ง dpkg-dev) ทำงานได้ดี
timeline

2
คำสั่งdpkg --print-architectureทำงานบนเดเบียนมานานแล้ว อันนี้ใช้ได้ แต่ถูก จำกัด Debian และมันเป็นอนุพันธ์
user3710044

11
#include <stdio.h>

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

2
ใช้งานได้ แต่ดูเหมือนว่าจะเป็นรายละเอียดการใช้งานของ stdio.h บน Linux มีวิธีแก้ปัญหาที่ดีกว่าเช่น: limits.h ห้ามใช้
user3710044

10

หากคุณมีระบบปฏิบัติการ 64 บิตแทน i686 คุณมีx86_64หรือในการส่งออกของia64 uname -aในที่ที่คุณไม่ได้มีสองสายนี้ คุณมีระบบปฏิบัติการ 32 บิต (โปรดทราบว่านี่ไม่ได้หมายความว่า CPU ของคุณไม่ใช่ 64 บิต)


1
สิ่งนี้จะคืนค่าประเภทกระบวนการที่เคอร์เนลสามารถรองรับได้ มีความเป็นไปได้และเหมาะสมในการรัน 32 บิต userspace บน 64 บิต
user3710044

มีค่าอื่น ๆ ในunameผลลัพธ์ที่บ่งชี้ระบบปฏิบัติการ 64 บิต ไม่ใช่ทุกคนในโลกที่เป็น x86 หรือ Itanium ...
Toby Speight

6

ระบบนั้นคือ 32 บิต iX86 unameหมายถึงเป็นสถาปัตยกรรมแบบ 32 บิต ถ้าเป็น 64 บิตมันจะกลับมา

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
สิ่งนี้จะคืนค่าประเภทกระบวนการที่เคอร์เนลสามารถรองรับได้ มีความเป็นไปได้และเหมาะสมในการรัน 32 บิต userspace บน 64 บิต
user3710044

6

ทุกวันนี้ระบบสามารถมีหลายฝ่ายได้ดังนั้นจึงไม่สมเหตุสมผล คุณอาจต้องการค้นหาเป้าหมายเริ่มต้นของคอมไพเลอร์:

$ cc -v 2> & 1 | grep ^ Target
เป้าหมาย: x86_64-pc-linux-gn

คุณสามารถรวบรวมโลกสวัสดี:

$ echo 'int main () {return 0; } '| cc -xc - -o foo
$ file foo
foo: ปฏิบัติการ ELB 64- บิต LSB, x86-64, รุ่น 1 (SYSV), ลิงก์แบบไดนามิก, ล่าม /lib64/ld-linux-x86-64.so.2, สำหรับ GNU / Linux 2.6.32, BuildID [sha1] = b114e029a08abfb3c98db93d3dcdb7435b5bba0c ไม่ได้ถูกปล้น

1
เนื่องจากcc -v | grep …เป็นคอมไพเลอร์ที่เฉพาะเจาะจงอยู่แล้วเราสามารถใช้เพียงcc -dumpmachineซึ่งไม่จำเป็นต้องมี grepping และได้รับการสนับสนุนโดย GCC
Anton Samsonov

ระบุว่าคำถามแสดงให้เห็นว่ามีไว้สำหรับสคริปต์กำหนดค่าซึ่งอาจเป็นคำตอบที่มีประโยชน์และเกี่ยวข้องที่สุดที่นี่ มันจะทำสิ่งที่คุณต้องการในทุกกรณีที่มีความสำคัญ (รวมถึงผู้ใช้แบบ 32 บิตบนระบบปฏิบัติการ 64 บิตการรวบรวมข้ามสำหรับสถาปัตยกรรมต่างประเทศและส่วนที่เหลือ)
Toby Speight

5

ด้วยความเคารพต่อคำตอบที่ "getconf LONG_BIT"

ฉันเขียนฟังก์ชันง่าย ๆ เพื่อทำใน '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;
    }
}

ความคิดที่ดี 'getconf'!


5
ความคิดที่โง่! ใช้งานCHAR_BIT*sizeof(void*)หรือ__WORDSIZEใน C.
ceving

3
ไม่มันไม่ได้โง่ คุณอาจมีไฟล์สั่งการ 32 บิตและคุณต้องการทราบว่าระบบรองรับ 64 บิตหรือไม่
ลุดวิกเอ. โนริน

รับความยาวเริ่มต้นของความยาวในไลบรารี GNU-C .. อันนี้ใช้งานได้!
user3710044

1
ในความเป็นจริงมันผิดเพราะถ้าคุณใช้ 32 บิต userspace บน 64 bit kernel หรือแม้กระทั่ง X32 userspace มันจะบอกว่า OS เป็น 32 บิต
Ruslan

ขอแนะนำอย่างยิ่งที่จะไม่ใช้fgets: stackoverflow.com/questions/16323185/…
ceving

4

คุณสามารถตรวจสอบโดยใช้ตัวแปรสภาพแวดล้อม:

echo $HOSTTYPE

ผลลัพธ์:

i386 -> 32 บิต

x86_64 -> 64 บิต

แยกจาก: http://www.sysadmit.com/2016/02/linux-como-saber-si-es-32-o-64-bits.html


1
นี่เป็นตัวแปรบิวด์อินเพราะ/bin/bashมันไม่ใช่ตัวแปรสภาพแวดล้อม หากคุณขึ้นอยู่กับ Bash แล้วก็ใช้งานได้ดี แต่ผลที่ได้สามารถi386, i486, i586, i686และอื่น ๆ ดังนั้นจึงควรระวัง
3710044

3

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

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

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


2
Bash คือ (สามารถเป็นได้หรือไม่) รวบรวมเพื่อใช้ 64 บิต int ถ้าประเภทนั้นมีอยู่ก็มักจะเป็นในปัจจุบันและระบบ 32 บิตโดยปกติจะใช้ประเภท "ยาวยาว"
user3710044

2
bash ใน Debian ได้รับการคอมไพล์ให้ใช้ 64bit arithmetic ตั้งแต่ปี 2008 เป็นอย่างน้อยอาจเร็วกว่านั้น คำตอบนี้ถูกใช้งานไม่ได้ตั้งแต่ก่อนที่จะมี stackoverflow
Peter Cordes

3

getconfใช้การเรียกระบบน้อยที่สุด:

$ 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

ถ้าคุณเลื่อน 1 เหลือ 32 และคุณได้ 1 ระบบของคุณคือ 32 บิต ถ้าคุณเลื่อน 1 เหลือ 64 และได้ 1 ระบบของคุณคือ 64 บิต

ในคำอื่น ๆ

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

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


ปัญหาเดียวกันกับทุบตีโดยใช้ "long longs"
user3710044

สิ่งนี้ได้ผลสำหรับฉันเพราะถ้ามันคืน 32 บิตมันก็ยืนยันแล้ว 100% ที่ทำงาน 32 ถ้ามันคืน 64 ก็อาจจะทุบตีถูกคอมไพล์ด้วยความยาว
JCM

1

หากมีข้อ จำกัด อย่างรุนแรงในไบนารีที่มี (เช่นใน initramfs) เพื่อนร่วมงานของฉันแนะนำ:

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

บนระบบลินุกซ์ ALT ของฉัน i586 มี/lib/ld-linux.so.2และ x86_64 /lib64/ld-linux-x86-64.so.2มี


ฉันได้รับสามอันนี้หนึ่งอันสำหรับ 32 หนึ่งอันสำหรับ 64 และอันหนึ่งสำหรับ mx32
user3710044

ใช่ถ้ามันไม่ส่งคืนไลบรารี 64- บิตจำนวนมากแสดงว่ามีการใช้งาน 32 บิต OS: ls -aR | grep 64 | grep -v proc
JCM


1

ฉันไม่อยากจะเชื่อเลยว่าตลอดเวลานี้ไม่มีใครพูดถึง:

sudo lshw -class cpu

เพื่อรับรายละเอียดเกี่ยวกับความเร็วปริมาณขนาดและความสามารถของฮาร์ดแวร์ CPU


1

สคริปต์อย่างง่ายเพื่อรับ 64 บิตหรือ 32 บิต

        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"

ตามความจริงที่ว่า 64- บิตเป็นปกติx86_64และ 32- บิตi686เป็นต้น


-6

ก่อนอื่นคุณต้องดาวน์โหลด Virtual Box จากนั้นเลือกใหม่และ Linux แบบ 32 บิต จากนั้นให้บูต linux โดยใช้ หากบูทจากนั้นเป็น 32 บิตหากไม่เป็นก็จะเป็น 64 บิต


2
นี่เป็นวิธีที่นำมาใช้จริง ๆ เพื่อตรวจสอบว่าระบบเป็น 32 หรือ 64 บิต
marlar

แต่มันเป็นวิธีการแก้ปัญหานี้อย่างแท้จริง ดังนั้นฉันจะทำเครื่องหมายขึ้น
firo

สิ่งนี้ทำให้ฉันนึกถึงวิธีที่จะบอกตัวเลขแม้เป็นเลขคี่: คณิตศาสตร์จะดูที่เหลือหลังจากหารด้วยสอง โปรแกรมเมอร์จะดูบิตที่สำคัญน้อยที่สุด ผู้เชี่ยวชาญ MS SQL จะสร้างตารางสองตารางหนึ่งตารางสำหรับเลขคู่และอีกตารางสำหรับเลขคี่และดูว่าอินพุตจบลงที่ใด ... ตัวเลข
Michael Shigorin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.