Bagaimana Membiarkan Skrip Linux Mendeteksi Mereka Berjalan di Mesin Virtual
Diterbitkan: 2022-06-27Mesin 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.
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.
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
Platform diidentifikasi dengan benar sebagai VirtualBox.
Pada VM QEMU-KVM yang menjalankan Fedora 35, kami mendapatkan output ini.
sudo dmidecode -s system-product-name
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
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
.
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
- 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
Mari kita coba perintah itu di Fedora VM kami yang berjalan di Kotak GNOME.
Sudo lshw -sistem kelas
- 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
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
- 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
- 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
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
Salinan Fedora kami yang berjalan di Kotak GNOME dilaporkan menggunakan virtualisasi KVM.
systemd-deteksi-virt
Menjalankan systemd-detect-virt
pada mesin perangkat keras kami menghasilkan "tidak ada" yang dicetak ke terminal.
systemd-deteksi-virt
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 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
Ini dengan benar mengidentifikasi Ubuntu VirtualBox VM kami sebagai mesin virtual.
./platform.sh
Itu juga dengan benar mendeteksi VM Kotak GNOME yang menjalankan Fedora.
./platform.sh
Skrip juga mendeteksi dengan benar saat dijalankan di mesin fisik.
./platform.sh
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
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.