วิธีให้สคริปต์ Linux ตรวจพบว่ากำลังทำงานอยู่ในเครื่องเสมือน

เผยแพร่แล้ว: 2022-06-27
สองมือ ข้างหนึ่งถือเม็ดสีแดงและอีกข้างหนึ่งเม็ดสีน้ำเงิน
diy13/Shutterstock.com

เครื่องเสมือนพยายามอย่างหนักที่จะโน้มน้าวให้ระบบปฏิบัติการของตนทำงานบนฮาร์ดแวร์จริง คุณสามารถบอกได้จากบรรทัดคำสั่ง Linux ว่าคอมพิวเตอร์เป็นแบบกายภาพหรือเสมือน?

เครื่องเสมือนและไฮเปอร์ไวเซอร์

คอมพิวเตอร์แบบดั้งเดิมเป็นวัตถุทางกายภาพ เป็นคอลเล็กชันของฮาร์ดแวร์ต่างๆ ที่เสียบและยึดเข้าด้วยกัน เพื่อให้คุณสามารถโหลดระบบปฏิบัติการ ติดตั้งแอปพลิเคชัน เปิดใช้งาน และใช้งานได้

ฮาร์ดแวร์มีราคาแพง การจำกัดระบบปฏิบัติการไว้เพียงระบบปฏิบัติการเดียวต่อเครื่องคอมพิวเตอร์จริง หมายความว่าค่าใช้จ่ายในการเรียกใช้ระบบปฏิบัติการหลายระบบในเร็วๆ นี้จะกลายเป็นสิ่งต้องห้าม ทางออกที่ดีกว่าคือการอนุญาตให้คอมพิวเตอร์เครื่องเดียวสามารถเรียกใช้ระบบปฏิบัติการที่เลือกได้ในเวลาเดียวกัน โดยที่แต่ละเครื่องคิดว่ากำลังทำงานอยู่ในฮาร์ดแวร์ของตนเองและมีเอกลักษณ์เฉพาะตัว

Hypervisor เครื่องเสมือนคืออะไร?
ที่เกี่ยวข้อง Hypervisor เครื่องเสมือนคืออะไร?

ไฮเปอร์ไวเซอร์ทำให้สิ่งนี้เป็นไปได้ ไฮเปอร์ไวเซอร์—เรียกอีกอย่างว่าตัวจัดการเครื่องเสมือนหรือมอนิเตอร์เครื่องเสมือน—เป็นซอฟต์แวร์ที่ช่วยให้คุณสร้างเครื่องเสมือนได้ สิ่งเหล่านี้ทำงานราวกับว่าเป็นคอมพิวเตอร์ส่วนบุคคล แม้ว่าจะทำงานบนโฮสต์จริงเดียวกัน โดยใช้พื้นที่ฮาร์ดไดรฟ์ หน่วยความจำ และแกนของ CPU ร่วมกัน

แน่นอน คอมพิวเตอร์แม่ข่ายต้องมีพลังมากพอที่จะรับมือกับความต้องการของคอลเลกชันของเครื่องเสมือน แต่ด้วยแรมที่เพียงพอและพลังในการประมวลผลในโฮสต์ เครื่องเสมือนสามารถทำงานที่ความเร็วเกือบเท่าโลหะเปล่า

นับตั้งแต่เปิดตัวเคอร์เนล 2.6.20 ในปี 2550 Linux ได้รองรับ V irtual M achine แบบ K ernel แล้ว Linux มีไฮเปอร์ไวเซอร์หลายตัวที่พร้อมใช้งาน เช่น VirtualBox, GNOME Boxes และ QEMU-KVM พวกเขาใช้ประโยชน์จากความสามารถ KVM ดั้งเดิมของ Linux โดยสร้างจากฟังก์ชันเคอร์เนลดั้งเดิมโดยเพิ่มส่วนต่อประสานผู้ใช้และฟังก์ชันการทำงาน เช่น ความสามารถในการถ่ายภาพสแน็ปช็อตของเครื่องเสมือน

เครื่องเสมือนนำมาซึ่งการประหยัดต้นทุน ประสิทธิภาพ การปรับใช้ที่ง่ายขึ้น และ—การจัดเตรียมอย่างถูกต้อง—ผลประโยชน์ด้านความปลอดภัย พวกเขายังอำนวยความสะดวกในการขยายขนาด เซิร์ฟเวอร์ใหม่สามารถหมุนได้โดยอัตโนมัติเมื่อความต้องการใช้บริการเพิ่มขึ้นและปิดตัวลงเมื่อความต้องการลดลง สิ่งนี้ทำให้พวกเขาได้รับความนิยมอย่างมากทั้งในระบบคลาวด์และในโครงสร้างพื้นฐานภายในองค์กร

บางทีคุณกำลังดูแลเซิร์ฟเวอร์ Linux จากระยะไกล และคุณจำเป็นต้องรู้ว่าเป็นเครื่องเสมือนหรือกล่องจริงหรือไม่ หรือคุณมีสคริปต์ที่ต้องการทราบประเภทของแพลตฟอร์มที่กำลังดำเนินการอยู่ คุณสามารถตรวจสอบได้หลายวิธีดังนี้ว่าคอมพิวเตอร์ที่คุณกำลังใช้งานนั้นเป็นเครื่องจริงหรือเครื่องเสมือน

คำสั่ง dmidecode

คำสั่ง dmidecode รองรับอ็อพชันและโมดิฟายเออร์จำนวนมาก มันสอบปากคำตาราง Desktop Management Interface (DMI) และพิมพ์ข้อมูลในหน้าต่างเทอร์มินัล

วิธีแสดงรายการอุปกรณ์ของคอมพิวเตอร์ของคุณจาก Linux Terminal
ที่เกี่ยวข้อง วิธีการแสดงรายการอุปกรณ์ของคอมพิวเตอร์ของคุณจาก Linux Terminal

เราจะใช้กับตัวเลือก -s (แสดงสตริงเดียว) และขอชื่อผลิตภัณฑ์ระบบ โปรดทราบว่าเราต้องใช้ sudo

เราจะเรียกใช้คำสั่งบน VirtualBox VM ที่ใช้ Ubuntu 22.04

 sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ 

คำสั่ง dmidecode ระบุ VirtualBox VM . ได้อย่างถูกต้อง

แพลตฟอร์มได้รับการระบุอย่างถูกต้องว่าเป็น VirtualBox

บน QEMU-KVM VM ที่รัน Fedora 35 เราได้รับผลลัพธ์นี้

 sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ 

คำสั่ง dmidecode ระบุ GNOME Boxes VM . ได้อย่างถูกต้อง

แม้ว่าสิ่งนี้จะถูกรายงานว่าเป็นพีซีมาตรฐาน แต่ก็เป็นพีซีเสมือน QEMU มาตรฐานประเภท Q35 ดังนั้นแพลตฟอร์มจึงได้รับการยอมรับว่าเป็นเครื่องเสมือนอย่างถูกต้อง

หากเราใช้คำสั่งเดียวกันบนคอมพิวเตอร์ที่มีอยู่จริง เราก็จะได้รับข้อมูลบางอย่างเกี่ยวกับผู้ผลิต

 sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ 

คำสั่ง dmidecode ส่งกลับข้อมูลเกี่ยวกับคอมพิวเตอร์จริง

คอมพิวเตอร์เครื่องนี้เป็นเครื่องที่สร้างขึ้นเองโดยใช้มาเธอร์บอร์ดของ Micro-Star International Company Limited โดยมีรหัสผลิตภัณฑ์ของ MS-7B86

คำสั่ง lshw

คำสั่ง lshw แสดงรายการรายละเอียดของฮาร์ดแวร์คอมพิวเตอร์ประเภทต่างๆ เราสามารถเลือกประเภทของฮาร์ดแวร์ที่เราต้องการให้ lshw รายงาน

วิธีใช้ lshw ใน Linux (พร้อมตัวอย่างเชิงปฏิบัติ)
วิธีใช้ lshw ใน Linux ที่เกี่ยวข้อง (พร้อมตัวอย่างเชิงปฏิบัติ)

เราจะใช้ตัวเลือก -class กับตัวแก้ไข system การใช้ sudo กับคำสั่งนี้ช่วยให้เรามองเห็นรายละเอียดทั้งหมดได้

เราจะเรียกใช้คำสั่งนี้บน Ubuntu VirtualBox VM ของเรา

 sudo lshw -ระบบคลาส 

คำสั่ง lshw รายงานบน VirtualBox VM

  • ฟิลด์ "คำอธิบาย" มีรายการทั่วไปของ "คอมพิวเตอร์"
  • ฟิลด์ "ผลิตภัณฑ์" บอกเราว่านี่คือเครื่องเสมือนที่ทำงานอยู่ใน VirtualBox
  • ฟิลด์ "ผู้ขาย" มีชื่อของบริษัทเยอรมันที่สร้าง VirtualBox, Innotek GmbH Oracle Corporation เข้าซื้อกิจการ Innotek ในปี 2010 โดยเป็นส่วนหนึ่งของการเข้าซื้อกิจการ Sun Microsystems, Inc.

เราต้องติดตั้ง lshw บน Fedora

 sudo dnf ติดตั้ง lshw 

การติดตั้ง lshw บน Fedora ด้วยคำสั่ง dnf

ลองใช้คำสั่งนั้นใน Fedora VM ของเราที่ทำงานอยู่ในกล่อง GNOME

 sudo lshw -ระบบคลาส 

คำสั่ง lshw รายงานบนกล่อง GNOME VM

  • อีกครั้ง ฟิลด์ "คำอธิบาย" มีรายการทั่วไปของ "คอมพิวเตอร์"
  • ฟิลด์ "ผลิตภัณฑ์" ให้ข้อมูล QEMU PC มาตรฐานเดียวกันกับที่เราเห็นด้วยคำสั่ง dmidecode
  • ฟิลด์ "ผู้ขาย" มี "QEMU" ซึ่งค่อนข้างชัดเจนว่านี่คือเครื่องเสมือน

นี่เป็นผลมาจากการเรียกใช้คำสั่งเดียวกันบนคอมพิวเตอร์ที่มีอยู่จริงของเรา

 sudo lshw -ระบบคลาส 

คำสั่ง lshw รายงานบนคอมพิวเตอร์จริง

เราจะเห็นได้ว่านี่คือคอมพิวเตอร์ฮาร์ดแวร์ที่มีมาเธอร์บอร์ดไมโครสตาร์

  • ฮาร์ดแวร์ถูกระบุว่าเป็นคอมพิวเตอร์เดสก์ท็อป
  • ช่อง "ผลิตภัณฑ์" แสดงประเภทมาเธอร์บอร์ด MS-7B86
  • ช่อง "ผู้ขาย" มีชื่อผู้ผลิต

คำสั่ง hostnamectl

คำสั่งนี้มีข้อได้เปรียบที่คุณไม่จำเป็นต้องมีสิทธิ์ sudo เพื่อเรียกใช้ อย่างไรก็ตาม มีเฉพาะในการกระจายที่เปิดใช้งาน systemd เท่านั้น การแจกแจงที่ทันสมัยส่วนใหญ่ใช้ systemd

นี่คือการตอบสนองจากการรันคำสั่งบน Ubuntu VirtualBox VM ของเรา

 hostnamectl 

ผลลัพธ์จากคำสั่ง hostnamectl ใน VirtualBox VM โดยเน้นที่บรรทัดการจำลองเสมือน

  • ฟิลด์ "ชื่อไอคอน" มี "-vm" ต่อท้าย
  • ช่อง "แชสซี" มี "vm"
  • ฟิลด์ "การจำลองเสมือน" มี "oracle"
  • ฟิลด์ "ผู้จำหน่ายฮาร์ดแวร์" ประกอบด้วย "innotek GmbH"
  • ฟิลด์ "Hardware Model" ประกอบด้วย "VirtualBox"

ผลลัพธ์บน Fedora VM ของเราภายใน GNOME Boxes นั้นคล้ายกันมาก

 hostnamectl 

ผลลัพธ์จากคำสั่ง hostnamectl ในกล่อง VM ของ GNOME โดยเน้นที่บรรทัดการจำลองเสมือน

  • ฟิลด์ "ชื่อไอคอน" มี "-vm" ต่อท้าย
  • ช่อง "แชสซี" มี "vm"
  • ฟิลด์ "การจำลองเสมือน" มี "kvm"
  • ฟิลด์ "ผู้จำหน่ายฮาร์ดแวร์" ประกอบด้วย "QEMU"
  • ฟิลด์ "Hardware Model" ประกอบด้วย "Standard PC (Q35 + ICH9, 2009)"

หากเราใช้คำสั่ง hostnamectl บนเดสก์ท็อปจริง เอาต์พุตจะไม่มีบรรทัด "การจำลองเสมือน"

 hostnamectl 

เอาต์พุตจากคำสั่ง hostnamectl บนคอมพิวเตอร์ที่มีอยู่จริง โดยไม่มีข้อมูล "การจำลองเสมือน"

หากไม่มีฟิลด์ "Virtualization" คุณต้องใช้งาน Bare Metal

คำสั่ง systemd-detect-virt

หากคุณต้องการคำตอบสั้น ๆ ที่สุด systemd-detect-virt อาจเป็นสิ่งที่คุณกำลังมองหา อีกครั้งต้องมีการแจกจ่ายที่ติดตั้งระบบ systemd แต่ไม่ต้องการสิทธิ์ sudo สิ่งนี้—และผลลัพธ์ที่สั้น—ทำให้เหมาะสำหรับใช้ในสคริปต์

นี่คือผลลัพธ์ของการรันคำสั่งบน Ubuntu VirtualBox VM ของเรา

 systemd-detect-virt 

การระบุ VirtualBox VM ด้วย systemd-detect-virt

สำเนา Fedora ของเราที่ทำงานอยู่ใน GNOME Boxes ได้รับการรายงานว่าใช้การจำลองเสมือนของ KVM

 systemd-detect-virt 

การระบุ GNOME Boxes VM ด้วย systemd-detect-virt

การรัน systemd-detect-virt บนเครื่องฮาร์ดแวร์ของเราส่งผลให้ "ไม่มี" ถูกพิมพ์ไปยังเทอร์มินัล

 systemd-detect-virt 

คอมพิวเตอร์ที่มีอยู่จริงถูกระบุอย่างถูกต้องว่าไม่มีการจำลองเสมือน

สคริปต์ที่ละเอียดอ่อนของแพลตฟอร์ม

เพื่อให้สคริปต์สามารถตรวจจับได้ว่ากำลังทำงานในสภาพแวดล้อมเสมือนจริงหรือบนฮาร์ดแวร์จริง เราสามารถใช้คำสั่ง systemd-detect-virt และใช้คำสั่ง case ของ Bash เพื่อจัดการกับตัวเลือกต่างๆ

นี่คือสคริปต์ที่เราจะใช้ คัดลอกข้อความนี้และบันทึกลงในไฟล์ชื่อ “platform.sh”

 #!/bin/bash

shopt -s nocasematch

กรณี $(systemd-detect-virt) ใน

  ไม่มี)
    echo "ฮาร์ดแวร์ทางกายภาพ"
    ;;

  *)
    echo "เครื่องเสมือน"
    ;;
esac

สคริปต์ใช้ shopt เพื่อเลือกการจับคู่ที่ไม่คำนึงถึงขนาดตัวพิมพ์ คำสั่ง systemd-detect-virt ใช้ในคำสั่ง case เอาต์พุตจากคำสั่งนี้จะถูกเปรียบเทียบกับแต่ละ case clauses ในเนื้อหาของคำสั่ง case จนกว่าจะพบการจับคู่ สิ่งใดก็ตามที่ไม่ตรงกันจะถูกจับโดยส่วนคำสั่งเริ่มต้น “*)”

วิธีการใช้คำชี้แจงกรณีในสคริปต์ทุบตี
วิธี ใช้คำสั่งกรณีและปัญหาในสคริปต์ทุบตี

วิธีที่ง่ายที่สุดคือการทดสอบว่าการตอบสนองจาก systemd-detect-virt คือ "ไม่มี" หากใช่ แสดงว่าสคริปต์กำลังทำงานบนฮาร์ดแวร์จริง สำหรับกรณีอื่นๆ ทั้งหมด สคริปต์ต้องทำงานบนเครื่องเสมือน

ก่อนที่เราจะสามารถเรียกใช้สคริปต์ได้ เราต้องทำให้สามารถเรียกใช้งานได้โดยใช้ chmod

 chmod +x platform.sh 

ทำให้สคริปต์แพลตฟอร์มสามารถเรียกใช้งานได้ด้วย chmod

มันระบุ Ubuntu VirtualBox VM ของเราอย่างถูกต้องว่าเป็นเครื่องเสมือน

 ./platform.sh 

การใช้สคริปต์ platform.sh ใน VirtualBox VM

นอกจากนี้ยังตรวจพบ GNOME Boxes VM ที่ใช้งาน Fedora ได้อย่างถูกต้อง

 ./platform.sh 

การใช้สคริปต์ platform.sh ในกล่อง GNOME VM

สคริปต์ยังตรวจพบอย่างถูกต้องเมื่อทำงานบนเครื่องจริง

 ./platform.sh 

การใช้สคริปต์ platform.sh บนคอมพิวเตอร์จริง

ส่วนคำสั่ง case ที่แตกต่างกันสามารถตั้งค่าตัวแปรที่ได้รับการตรวจสอบที่อื่นในสคริปต์เพื่อดำเนินการประมวลผลประเภทต่างๆ หรืออาจเรียกฟังก์ชันเฉพาะภายในสคริปต์ของคุณ

หากสคริปต์ของคุณต้องการตรวจจับและรองรับสภาพแวดล้อมเสมือนประเภทต่างๆ คุณสามารถเพิ่ม case clauses ได้มากขึ้น โดยมองหาสตริงต่างๆ ที่ systemd-detect-virt สามารถส่งคืนได้ เราสามารถเห็นรายการคำตอบที่เป็นไปได้ทั้งหมดโดยใช้ --list ตัวเลือก เพื่อให้ง่ายต่อการดูทั้งหมดพร้อมกัน เราจะไพพ์ผลลัพธ์ผ่านคำสั่ง column

 systemd-detect-virt --list | คอลัมน์ 

ชุดการตอบสนองที่สมบูรณ์ที่ systemd-detect-virt สามารถส่งคืนได้

กินยาแดง

เทคนิคเหล่านี้ทำให้สคริปต์ของคุณทราบเมื่อทำงานบนฮาร์ดแวร์เปล่าและเมื่ออยู่ในเครื่องเสมือน

เช่นเดียวกับนีโอในเมทริกซ์ พวกเขาจะรู้ว่าอะไรจริงอะไรจริง