วิธีให้สคริปต์ Linux ตรวจพบว่ากำลังทำงานอยู่ในเครื่องเสมือน
เผยแพร่แล้ว: 2022-06-27เครื่องเสมือนพยายามอย่างหนักที่จะโน้มน้าวให้ระบบปฏิบัติการของตนทำงานบนฮาร์ดแวร์จริง คุณสามารถบอกได้จากบรรทัดคำสั่ง Linux ว่าคอมพิวเตอร์เป็นแบบกายภาพหรือเสมือน?
เครื่องเสมือนและไฮเปอร์ไวเซอร์
คอมพิวเตอร์แบบดั้งเดิมเป็นวัตถุทางกายภาพ เป็นคอลเล็กชันของฮาร์ดแวร์ต่างๆ ที่เสียบและยึดเข้าด้วยกัน เพื่อให้คุณสามารถโหลดระบบปฏิบัติการ ติดตั้งแอปพลิเคชัน เปิดใช้งาน และใช้งานได้
ฮาร์ดแวร์มีราคาแพง การจำกัดระบบปฏิบัติการไว้เพียงระบบปฏิบัติการเดียวต่อเครื่องคอมพิวเตอร์จริง หมายความว่าค่าใช้จ่ายในการเรียกใช้ระบบปฏิบัติการหลายระบบในเร็วๆ นี้จะกลายเป็นสิ่งต้องห้าม ทางออกที่ดีกว่าคือการอนุญาตให้คอมพิวเตอร์เครื่องเดียวสามารถเรียกใช้ระบบปฏิบัติการที่เลือกได้ในเวลาเดียวกัน โดยที่แต่ละเครื่องคิดว่ากำลังทำงานอยู่ในฮาร์ดแวร์ของตนเองและมีเอกลักษณ์เฉพาะตัว
ไฮเปอร์ไวเซอร์ทำให้สิ่งนี้เป็นไปได้ ไฮเปอร์ไวเซอร์—เรียกอีกอย่างว่าตัวจัดการเครื่องเสมือนหรือมอนิเตอร์เครื่องเสมือน—เป็นซอฟต์แวร์ที่ช่วยให้คุณสร้างเครื่องเสมือนได้ สิ่งเหล่านี้ทำงานราวกับว่าเป็นคอมพิวเตอร์ส่วนบุคคล แม้ว่าจะทำงานบนโฮสต์จริงเดียวกัน โดยใช้พื้นที่ฮาร์ดไดรฟ์ หน่วยความจำ และแกนของ 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) และพิมพ์ข้อมูลในหน้าต่างเทอร์มินัล
เราจะใช้กับตัวเลือก -s
(แสดงสตริงเดียว) และขอชื่อผลิตภัณฑ์ระบบ โปรดทราบว่าเราต้องใช้ sudo
เราจะเรียกใช้คำสั่งบน VirtualBox VM ที่ใช้ Ubuntu 22.04
sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ
แพลตฟอร์มได้รับการระบุอย่างถูกต้องว่าเป็น VirtualBox
บน QEMU-KVM VM ที่รัน Fedora 35 เราได้รับผลลัพธ์นี้
sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ
แม้ว่าสิ่งนี้จะถูกรายงานว่าเป็นพีซีมาตรฐาน แต่ก็เป็นพีซีเสมือน QEMU มาตรฐานประเภท Q35 ดังนั้นแพลตฟอร์มจึงได้รับการยอมรับว่าเป็นเครื่องเสมือนอย่างถูกต้อง
หากเราใช้คำสั่งเดียวกันบนคอมพิวเตอร์ที่มีอยู่จริง เราก็จะได้รับข้อมูลบางอย่างเกี่ยวกับผู้ผลิต
sudo dmidecode -s ระบบผลิตภัณฑ์ชื่อ
คอมพิวเตอร์เครื่องนี้เป็นเครื่องที่สร้างขึ้นเองโดยใช้มาเธอร์บอร์ดของ Micro-Star International Company Limited โดยมีรหัสผลิตภัณฑ์ของ MS-7B86
คำสั่ง lshw
คำสั่ง lshw
แสดงรายการรายละเอียดของฮาร์ดแวร์คอมพิวเตอร์ประเภทต่างๆ เราสามารถเลือกประเภทของฮาร์ดแวร์ที่เราต้องการให้ lshw
รายงาน
เราจะใช้ตัวเลือก -class
กับตัวแก้ไข system
การใช้ sudo
กับคำสั่งนี้ช่วยให้เรามองเห็นรายละเอียดทั้งหมดได้
เราจะเรียกใช้คำสั่งนี้บน Ubuntu VirtualBox VM ของเรา
sudo lshw -ระบบคลาส
- ฟิลด์ "คำอธิบาย" มีรายการทั่วไปของ "คอมพิวเตอร์"
- ฟิลด์ "ผลิตภัณฑ์" บอกเราว่านี่คือเครื่องเสมือนที่ทำงานอยู่ใน VirtualBox
- ฟิลด์ "ผู้ขาย" มีชื่อของบริษัทเยอรมันที่สร้าง VirtualBox, Innotek GmbH Oracle Corporation เข้าซื้อกิจการ Innotek ในปี 2010 โดยเป็นส่วนหนึ่งของการเข้าซื้อกิจการ Sun Microsystems, Inc.
เราต้องติดตั้ง lshw
บน Fedora
sudo dnf ติดตั้ง lshw
ลองใช้คำสั่งนั้นใน Fedora VM ของเราที่ทำงานอยู่ในกล่อง GNOME
sudo lshw -ระบบคลาส
- อีกครั้ง ฟิลด์ "คำอธิบาย" มีรายการทั่วไปของ "คอมพิวเตอร์"
- ฟิลด์ "ผลิตภัณฑ์" ให้ข้อมูล QEMU PC มาตรฐานเดียวกันกับที่เราเห็นด้วยคำสั่ง
dmidecode
- ฟิลด์ "ผู้ขาย" มี "QEMU" ซึ่งค่อนข้างชัดเจนว่านี่คือเครื่องเสมือน
นี่เป็นผลมาจากการเรียกใช้คำสั่งเดียวกันบนคอมพิวเตอร์ที่มีอยู่จริงของเรา
sudo lshw -ระบบคลาส
เราจะเห็นได้ว่านี่คือคอมพิวเตอร์ฮาร์ดแวร์ที่มีมาเธอร์บอร์ดไมโครสตาร์
- ฮาร์ดแวร์ถูกระบุว่าเป็นคอมพิวเตอร์เดสก์ท็อป
- ช่อง "ผลิตภัณฑ์" แสดงประเภทมาเธอร์บอร์ด MS-7B86
- ช่อง "ผู้ขาย" มีชื่อผู้ผลิต
คำสั่ง hostnamectl
คำสั่งนี้มีข้อได้เปรียบที่คุณไม่จำเป็นต้องมีสิทธิ์ sudo
เพื่อเรียกใช้ อย่างไรก็ตาม มีเฉพาะในการกระจายที่เปิดใช้งาน systemd
เท่านั้น การแจกแจงที่ทันสมัยส่วนใหญ่ใช้ systemd
นี่คือการตอบสนองจากการรันคำสั่งบน Ubuntu VirtualBox VM ของเรา
hostnamectl
- ฟิลด์ "ชื่อไอคอน" มี "-vm" ต่อท้าย
- ช่อง "แชสซี" มี "vm"
- ฟิลด์ "การจำลองเสมือน" มี "oracle"
- ฟิลด์ "ผู้จำหน่ายฮาร์ดแวร์" ประกอบด้วย "innotek GmbH"
- ฟิลด์ "Hardware Model" ประกอบด้วย "VirtualBox"
ผลลัพธ์บน Fedora VM ของเราภายใน GNOME Boxes นั้นคล้ายกันมาก
hostnamectl
- ฟิลด์ "ชื่อไอคอน" มี "-vm" ต่อท้าย
- ช่อง "แชสซี" มี "vm"
- ฟิลด์ "การจำลองเสมือน" มี "kvm"
- ฟิลด์ "ผู้จำหน่ายฮาร์ดแวร์" ประกอบด้วย "QEMU"
- ฟิลด์ "Hardware Model" ประกอบด้วย "Standard PC (Q35 + ICH9, 2009)"
หากเราใช้คำสั่ง hostnamectl บนเดสก์ท็อปจริง เอาต์พุตจะไม่มีบรรทัด "การจำลองเสมือน"
hostnamectl
หากไม่มีฟิลด์ "Virtualization" คุณต้องใช้งาน Bare Metal
คำสั่ง systemd-detect-virt
หากคุณต้องการคำตอบสั้น ๆ ที่สุด systemd-detect-virt
อาจเป็นสิ่งที่คุณกำลังมองหา อีกครั้งต้องมีการแจกจ่ายที่ติดตั้งระบบ systemd
แต่ไม่ต้องการสิทธิ์ sudo
สิ่งนี้—และผลลัพธ์ที่สั้น—ทำให้เหมาะสำหรับใช้ในสคริปต์
นี่คือผลลัพธ์ของการรันคำสั่งบน Ubuntu VirtualBox VM ของเรา
systemd-detect-virt
สำเนา Fedora ของเราที่ทำงานอยู่ใน GNOME Boxes ได้รับการรายงานว่าใช้การจำลองเสมือนของ KVM
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
มันระบุ Ubuntu VirtualBox VM ของเราอย่างถูกต้องว่าเป็นเครื่องเสมือน
./platform.sh
นอกจากนี้ยังตรวจพบ GNOME Boxes VM ที่ใช้งาน Fedora ได้อย่างถูกต้อง
./platform.sh
สคริปต์ยังตรวจพบอย่างถูกต้องเมื่อทำงานบนเครื่องจริง
./platform.sh
ส่วนคำสั่ง case
ที่แตกต่างกันสามารถตั้งค่าตัวแปรที่ได้รับการตรวจสอบที่อื่นในสคริปต์เพื่อดำเนินการประมวลผลประเภทต่างๆ หรืออาจเรียกฟังก์ชันเฉพาะภายในสคริปต์ของคุณ
หากสคริปต์ของคุณต้องการตรวจจับและรองรับสภาพแวดล้อมเสมือนประเภทต่างๆ คุณสามารถเพิ่ม case
clauses ได้มากขึ้น โดยมองหาสตริงต่างๆ ที่ systemd-detect-virt
สามารถส่งคืนได้ เราสามารถเห็นรายการคำตอบที่เป็นไปได้ทั้งหมดโดยใช้ --list
ตัวเลือก เพื่อให้ง่ายต่อการดูทั้งหมดพร้อมกัน เราจะไพพ์ผลลัพธ์ผ่านคำสั่ง column
systemd-detect-virt --list | คอลัมน์
กินยาแดง
เทคนิคเหล่านี้ทำให้สคริปต์ของคุณทราบเมื่อทำงานบนฮาร์ดแวร์เปล่าและเมื่ออยู่ในเครื่องเสมือน
เช่นเดียวกับนีโอในเมทริกซ์ พวกเขาจะรู้ว่าอะไรจริงอะไรจริง