Bagaimana Membiarkan Skrip Linux Mendeteksi Mereka Berjalan di Mesin Virtual

Diterbitkan: 2022-06-27
Dua tangan, satu memegang pil merah dan yang lainnya pil biru.
diy13/Shutterstock.com

Mesin virtual berusaha sangat keras untuk meyakinkan sistem operasi mereka bahwa mereka berjalan pada perangkat keras fisik. Jadi, dapatkah Anda mengetahui dari baris perintah Linux apakah komputer itu fisik atau virtual?

Mesin Virtual dan Hypervisor

Komputer tradisional adalah objek fisik. Ini adalah kumpulan perangkat keras berbeda yang dicolokkan dan dibaut bersama sehingga Anda dapat memuat sistem operasi, menginstal aplikasi, meluncurkannya, dan menggunakannya.

Perangkat kerasnya mahal. Dibatasi untuk satu sistem operasi per komputer fisik berarti biaya menjalankan beberapa sistem operasi segera menjadi penghalang. Solusi yang lebih baik adalah dengan mengizinkan satu komputer fisik menjalankan pilihan sistem operasi pada saat yang sama, dengan masing-masing berpikir itu berjalan di perangkat kerasnya sendiri yang unik.

Apa itu Hypervisor Mesin Virtual?
TERKAIT Apa itu Hypervisor Mesin Virtual?

Sebuah hypervisor memungkinkan hal ini. Hypervisor—juga disebut manajer mesin virtual atau monitor mesin virtual—adalah perangkat lunak yang memungkinkan Anda membuat mesin virtual. Ini berperilaku seolah-olah mereka adalah individu, komputer fisik meskipun mereka berjalan pada host fisik yang sama, berbagi ruang hard drive, memori, dan inti CPU.

Tentu saja, komputer host harus cukup kuat untuk mengatasi tuntutan kumpulan mesin virtual, tetapi, dengan RAM yang cukup dan kekuatan pemrosesan di host, mesin virtual dapat berjalan pada kecepatan mendekati logam biasa.

Sejak rilis kernel 2.6.20 pada tahun 2007, Linux telah memiliki dukungan mesin virtual berbasis K ernel. Linux memiliki beberapa hypervisor yang tersedia untuk itu, seperti VirtualBox, GNOME Boxes, dan QEMU-KVM. Mereka memanfaatkan kemampuan KVM asli Linux, membangun fungsionalitas kernel asli dengan menambahkan antarmuka pengguna dan fungsionalitas seperti mampu mengambil snapshot dari mesin virtual.

Mesin virtual memberikan penghematan biaya, efisiensi, penerapan yang disederhanakan, dan—disediakan dengan benar—manfaat keamanan. Mereka juga memfasilitasi skalabilitas. Server baru dapat secara otomatis diputar saat permintaan layanan meningkat dan dimatikan saat permintaan turun. Hal ini membuat mereka sangat populer baik di cloud maupun di infrastruktur lokal.

Mungkin Anda mengelola server Linux dari jarak jauh dan Anda perlu tahu apakah itu mesin virtual atau kotak fisik. Atau Anda memiliki skrip yang perlu mengetahui jenis platform tempat eksekusinya. Berikut adalah beberapa cara untuk mendeteksi apakah komputer yang Anda gunakan fisik atau virtual.

Perintah dmidecode

Perintah dmidecode mendukung sejumlah besar opsi dan pengubah. Ini menginterogasi tabel Desktop Management Interface (DMI), dan mencetak informasi di jendela terminal.

Cara Mendaftar Perangkat Komputer Anda Dari Terminal Linux
TERKAIT Cara Mendaftar Perangkat Komputer Anda Dari Terminal Linux

Kami akan menggunakannya dengan opsi -s (menampilkan string tunggal), dan meminta nama produk sistem. Perhatikan bahwa kita harus menggunakan sudo .

Kami akan menjalankan perintah pada VM VirtualBox yang menjalankan Ubuntu 22.04.

 sudo dmidecode -s system-product-name 

Perintah dmidecode dengan benar mengidentifikasi VM VirtualBox

Platform diidentifikasi dengan benar sebagai VirtualBox.

Pada VM QEMU-KVM yang menjalankan Fedora 35, kami mendapatkan output ini.

 sudo dmidecode -s system-product-name 

Perintah dmidecode dengan benar mengidentifikasi VM Kotak GNOME

Meskipun ini dilaporkan sebagai PC standar, ini adalah PC virtual QEMU standar, dengan tipe Q35. Jadi platform dikenali dengan benar sebagai mesin virtual.

Jika kita menjalankan perintah yang sama pada komputer fisik, kita mendapatkan beberapa informasi tentang pabrikan.

 sudo dmidecode -s system-product-name 

Perintah dmidecode mengembalikan informasi tentang komputer fisik

Komputer ini dibuat khusus berdasarkan motherboard Micro-Star International Company Limited, dengan kode produk MS-7B86.

Perintah lshw

Perintah lshw mencantumkan rincian untuk berbagai perangkat keras komputer. Kita dapat memilih kelas perangkat keras mana yang ingin kita lshw .

Cara Menggunakan lshw di Linux (Dengan Contoh Praktis)
TERKAIT Cara Menggunakan lshw di Linux (Dengan Contoh Praktis)

Kita akan menggunakan opsi -class dengan pengubah system . Menggunakan sudo dengan perintah ini memastikan kita melihat semua detailnya.

Kami akan menjalankan perintah ini di Ubuntu VirtualBox VM kami.

 Sudo lshw -sistem kelas 

Perintah lshw melaporkan pada VirtualBox VM

  • Bidang "deskripsi" memiliki entri umum "komputer."
  • Bidang "produk" memberi tahu kita bahwa ini adalah mesin virtual yang berjalan di VirtualBox.
  • Bidang "vendor" berisi nama perusahaan Jerman yang membuat VirtualBox, Innotek GmbH. Innotek diakuisisi oleh Oracle Corporation pada tahun 2010 sebagai bagian dari akuisisi Sun Microsystems, Inc.

Kami harus menginstal lshw di Fedora.

 sudo dnf install lshw 

Menginstal lshw di Fedora dengan perintah dnf

Mari kita coba perintah itu di Fedora VM kami yang berjalan di Kotak GNOME.

 Sudo lshw -sistem kelas 

Perintah lshw melaporkan pada VM Kotak GNOME

  • Sekali lagi, bidang "deskripsi" memiliki entri umum "komputer."
  • Bidang "produk" memberi kami informasi PC QEMU standar yang sama dengan yang kami lihat dengan perintah dmidecode .
  • Bidang "vendor" berisi "QEMU" yang cukup jelas menunjukkan ini adalah mesin virtual.

Ini adalah hasil dari menjalankan perintah yang sama di komputer fisik kita.

 Sudo lshw -sistem kelas 

Perintah lshw melaporkan pada komputer fisik

Kita dapat melihat bahwa ini adalah komputer perangkat keras, dengan motherboard Micro-Star.

  • Perangkat keras diidentifikasi sebagai komputer desktop.
  • Bidang "produk" memberi kita jenis motherboard, MS-7B86.
  • Bidang "vendor" berisi nama pabrikan.

Perintah hostnamectl

Perintah ini memiliki keuntungan bahwa Anda tidak perlu memiliki hak sudo untuk menjalankannya. Namun, ini hanya tersedia di distribusi yang mendukung systemd . Mayoritas distribusi modern menggunakan systemd .

Ini adalah respons dari menjalankan perintah di Ubuntu VirtualBox VM kami.

 nama host ectl 

Output dari perintah hostnamectl di VirtualBox VM dengan baris virtualisasi disorot

  • Bidang "icon-name" memiliki "-vm" yang ditambahkan padanya.
  • Bidang "Chassis" berisi "vm."
  • Bidang "Virtualisasi" berisi "oracle."
  • Bidang "Vendor Perangkat Keras" berisi "innotek GmbH."
  • Bidang "Model Perangkat Keras" berisi "VirtualBox."

Output pada VM Fedora kami di dalam Kotak GNOME sangat mirip.

 nama host ectl 

Output dari perintah hostnamectl di VM Kotak GNOME dengan baris virtualisasi disorot

  • Bidang "icon-name" memiliki "-vm" yang ditambahkan padanya.
  • Bidang "Chassis" berisi "vm."
  • Bidang "Virtualisasi" berisi "kvm."
  • Bidang "Vendor Perangkat Keras" berisi "QEMU"
  • Bidang "Model Perangkat Keras" berisi "PC Standar (Q35 + ICH9, 2009).

Jika kita menggunakan perintah hostnamectl pada desktop fisik kita, output tidak berisi baris "Virtualisasi".

 nama host ectl 

Output dari perintah hostnamectl pada komputer fisik, tanpa informasi "Virtualisasi"

Jika tidak ada bidang "Virtualisasi", Anda harus menjalankan bare metal.

Perintah systemd-detect-virt

Jika Anda ingin mendapatkan jawaban sesingkat mungkin, systemd-detect-virt mungkin yang Anda cari. Sekali lagi ini membutuhkan distribusi yang dilengkapi systemd , tetapi tidak memerlukan hak sudo . Ini—dan output singkatnya—membuatnya cocok untuk digunakan dalam skrip.

Ini adalah hasil dari menjalankan perintah pada VM VirtualBox Ubuntu kami.

 systemd-deteksi-virt 

Mengidentifikasi VM VirtualBox dengan systemd-detect-virt

Salinan Fedora kami yang berjalan di Kotak GNOME dilaporkan menggunakan virtualisasi KVM.

 systemd-deteksi-virt 

Mengidentifikasi VM Kotak GNOME dengan systemd-detect-virt

Menjalankan systemd-detect-virt pada mesin perangkat keras kami menghasilkan "tidak ada" yang dicetak ke terminal.

 systemd-deteksi-virt 

Komputer fisik yang diidentifikasi dengan benar tidak memiliki virtualisasi

Skrip Platform-Sensitif

Untuk memberikan skrip kemampuan untuk mendeteksi apakah itu berjalan di lingkungan virtual atau pada perangkat keras fisik, kita dapat menggunakan perintah systemd-detect-virt dan menggunakan pernyataan case Bash untuk menangani opsi.

Ini adalah skrip yang akan kita gunakan. Salin teks ini dan simpan ke dalam file bernama “platform.sh.”

 #!/bin/bash

shopt -s nocasematch

kasus $(systemd-detect-virt) di

  tidak ada)
    echo "Perangkat Keras Fisik"
    ;;

  *)
    gema "Mesin Virtual"
    ;;
esac

Script menggunakan shopt untuk memilih pencocokan case-insensitive. Perintah systemd-detect-virt digunakan dalam pernyataan case . Keluaran dari perintah ini dibandingkan dengan masing-masing klausa case di badan pernyataan case sampai ditemukan kecocokan. Apa pun yang tidak cocok ditangkap oleh klausa default “*)”.

Cara Menggunakan Pernyataan Kasus dalam Skrip Bash
TERKAIT Cara Menggunakan Pernyataan Kasus di Skrip Bash

Cara paling sederhana adalah menguji apakah respons dari systemd-detect-virt adalah “tidak ada.” Jika ya, skrip berjalan pada perangkat keras fisik. Untuk semua kasus lainnya, skrip harus dijalankan pada mesin virtual.

Sebelum kita dapat menjalankan skrip, kita harus membuatnya dapat dieksekusi, menggunakan chmod .

 chmod +x platform.sh 

Membuat skrip platform dapat dieksekusi dengan chmod

Ini dengan benar mengidentifikasi Ubuntu VirtualBox VM kami sebagai mesin virtual.

 ./platform.sh 

Menggunakan skrip platform.sh di VirtualBox VM

Itu juga dengan benar mendeteksi VM Kotak GNOME yang menjalankan Fedora.

 ./platform.sh 

Menggunakan skrip platform.sh dalam VM Kotak GNOME

Skrip juga mendeteksi dengan benar saat dijalankan di mesin fisik.

 ./platform.sh 

Menggunakan skrip platform.sh di komputer fisik

Klausa case yang berbeda dapat mengatur variabel yang diperiksa di tempat lain dalam skrip untuk melakukan berbagai jenis pemrosesan, atau mereka dapat memanggil fungsi tertentu dalam skrip Anda.

Jika skrip Anda perlu mendeteksi dan mengakomodasi berbagai jenis lingkungan virtual, Anda dapat menambahkan lebih banyak klausa case , mencari string berbeda yang dapat dikembalikan oleh systemd-detect-virt . Kita dapat melihat daftar lengkap kemungkinan tanggapan dengan menggunakan opsi --list . Untuk membuatnya lebih mudah untuk melihat semuanya sekaligus, kita akan menyalurkan output melalui perintah column .

 systemd-detect-virt --list | kolom 

Kumpulan tanggapan lengkap yang dapat dikembalikan oleh systemd-detect-virt

Ambil Pil Merah

Teknik-teknik ini memberi tahu skrip Anda saat dijalankan pada perangkat keras telanjang dan saat berada di dalam mesin virtual.

Seperti Neo di Matrix, mereka akan tahu apa yang nyata dan apa yang tidak.