Cum să permiteți scripturilor Linux să detecteze că rulează în mașinile virtuale

Publicat: 2022-06-27
Două mâini, una ținând o pastilă roșie și cealaltă o pastilă albastră.
diy13/Shutterstock.com

Mașinile virtuale încearcă din greu să-și convingă sistemele de operare că rulează pe hardware fizic. Deci, puteți spune din linia de comandă Linux dacă computerul este fizic sau virtual?

Mașini virtuale și hipervizoare

Un computer tradițional este un obiect fizic. Este o colecție de diferite piese hardware care sunt conectate și fixate împreună, astfel încât să puteți încărca un sistem de operare, să instalați aplicații, să le lansați și să le utilizați.

Hardware-ul este scump. A fi limitat la un sistem de operare pe computer fizic înseamnă că costul rulării mai multor sisteme de operare devine în curând prohibitiv. O soluție mai bună ar fi să permiteți unui singur computer fizic să ruleze o selecție de sisteme de operare în același timp, fiecare considerând că rulează în propriul hardware unic.

Ce este un hypervisor de mașină virtuală?
LEGATE Ce este un hypervisor de mașină virtuală?

Un hypervisor face acest lucru posibil. Un hypervisor - numit și manager de mașină virtuală sau monitor de mașină virtuală - este un software care vă permite să creați mașini virtuale. Acestea se comportă ca și cum ar fi computere fizice individuale, deși rulează pe aceeași gazdă fizică, împărțind spațiul pe hard disk, memoria și nucleele CPU.

Desigur, computerul gazdă trebuie să fie suficient de puternic pentru a face față cerințelor colecției de mașini virtuale, dar, având în vedere RAM suficientă și putere de procesare în gazdă, mașinile virtuale pot rula la viteze aproape de metal.

De la lansarea nucleului 2.6.20 în 2007, Linux a avut suport pentru mașinile virtuale bazate pe Kernel. Linux are la dispoziție mai multe hipervizoare, cum ar fi VirtualBox, GNOME Boxes și QEMU -KVM. Ei folosesc capacitatea KVM nativă a Linux, bazându-se pe funcționalitatea kernelului nativ prin adăugarea de interfețe de utilizator și funcționalități, cum ar fi posibilitatea de a face un instantaneu al unei mașini virtuale.

Mașinile virtuale aduc economii de costuri, eficiență, implementări simplificate și, furnizate corect, beneficii de securitate. De asemenea, facilitează scalabilitatea. Noile servere pot fi activate automat pe măsură ce cererea pentru un serviciu crește și se pot opri când cererea scade. Acest lucru le face extrem de populare atât în ​​cloud, cât și în infrastructura locală.

Poate că administrați de la distanță un server Linux și trebuie să știți dacă este o mașină virtuală sau o cutie fizică. Sau aveți un script care trebuie să știe pe ce tip de platformă se execută. Iată câteva moduri prin care puteți detecta dacă computerul la care lucrați este fizic sau virtual.

Comanda dmidecode

Comanda dmidecode acceptă un număr mare de opțiuni și modificatori. Interogează tabelele Desktop Management Interface (DMI) și tipărește informațiile în fereastra terminalului.

Cum să enumerați dispozitivele computerului dvs. de la terminalul Linux
LEGATE Cum să enumerați dispozitivele computerului dvs. de la terminalul Linux

Îl vom folosi cu opțiunea -s (afișează un singur șir) și vom cere numele produsului de sistem. Rețineți că trebuie să folosim sudo .

Vom rula comanda pe o VM VirtualBox care rulează Ubuntu 22.04.

 sudo dmidecode -s system-product-name 

Comanda dmidecode identifică corect o VM VirtualBox

Platforma este corect identificată ca VirtualBox.

Pe o VM QEMU-KVM care rulează Fedora 35, obținem această ieșire.

 sudo dmidecode -s system-product-name 

Comanda dmidecode identifică corect o mașină virtuală GNOME Boxes

Deși acesta este raportat ca un PC standard, este un PC virtual QEMU standard, de tip Q35. Deci, platforma este recunoscută corect ca o mașină virtuală.

Dacă rulăm aceeași comandă pe un computer fizic obținem câteva informații despre producător.

 sudo dmidecode -s system-product-name 

Comanda dmidecode care returnează informații despre un computer fizic

Acest computer este o construcție personalizată bazată pe o placă de bază Micro-Star International Company Limited, cu codul de produs MS-7B86.

Comanda lshw

Comanda lshw listează detaliile pentru o gamă largă de hardware de computer. Putem alege pe ce clasă de hardware vrem să raportăm lshw .

Cum se utilizează lshw în Linux (cu un exemplu practic)
LEGATE Cum să utilizați lshw în Linux (cu un exemplu practic)

Vom folosi opțiunea -class cu modificatorul de system . Utilizarea sudo cu această comandă ne asigură că vedem toate detaliile.

Vom rula această comandă pe VM Ubuntu VirtualBox.

 sudo lshw -sistem de clasă 

Comanda lshw raportează pe o VM VirtualBox

  • Câmpul „descriere” are o intrare generică „computer”.
  • Câmpul „produs” ne spune că aceasta este o mașină virtuală care rulează în VirtualBox.
  • Câmpul „furnizor” conține numele companiei germane care a creat VirtualBox, Innotek GmbH. Innotek a fost achiziționată de Oracle Corporation în 2010, ca parte a achiziției Sun Microsystems, Inc.

A trebuit să instalăm lshw pe Fedora.

 sudo dnf install lshw 

Instalarea lshw pe Fedora cu comanda dnf

Să încercăm acea comandă în VM Fedora care rulează în casetele GNOME.

 sudo lshw -sistem de clasă 

Comanda lshw raportează pe o mașină virtuală GNOME Boxes

  • Din nou, câmpul „descriere” are o intrare generică „computer”.
  • Câmpul „produs” ne oferă aceleași informații standard QEMU PC pe care le-am văzut cu comanda dmidecode .
  • Câmpul „furnizor” conține „QEMU”, ceea ce indică destul de clar că este o mașină virtuală.

Acesta este rezultatul rulării aceleiași comenzi pe computerul nostru fizic.

 sudo lshw -sistem de clasă 

Comanda lshw raportează pe un computer fizic

Putem vedea că acesta este un computer hardware, cu o placă de bază Micro-Star.

  • Hardware-ul este identificat ca un computer desktop.
  • Câmpul „produs” ne oferă tipul plăcii de bază, MS-7B86.
  • Câmpul „furnizor” conține numele producătorului.

Comanda hostnamectl

Această comandă are avantajul că nu trebuie să ai privilegii sudo pentru a o rula. Cu toate acestea, este disponibil numai pe distribuțiile activate pentru systemd . Majoritatea distribuțiilor moderne folosesc systemd .

Acesta este răspunsul de la rularea comenzii pe VM-ul nostru Ubuntu VirtualBox.

 hostnamectl 

Ieșirea de la comanda hostnamectl într-o VM VirtualBox cu linia de virtualizare evidențiată

  • Câmpul „pictogramă-nume” are „-vm” atașat.
  • Câmpul „Șasiu” conține „vm”.
  • Câmpul „Virtualizare” conține „oracol”.
  • Câmpul „Hardware Vendor” conține „innotek GmbH”.
  • Câmpul „Model hardware” conține „VirtualBox”.

Ieșirea pe VM Fedora din interiorul cutiilor GNOME este foarte similară.

 hostnamectl 

Ieșirea de la comanda hostnamectl într-o mașină virtuală GNOME Boxes cu linia de virtualizare evidențiată

  • Câmpul „pictogramă-nume” are „-vm” atașat.
  • Câmpul „Șasiu” conține „vm”.
  • Câmpul „Virtualizare” conține „kvm”.
  • Câmpul „Hardware Vendor” conține „QEMU”
  • Câmpul „Model hardware” conține „PC standard (Q35 + ICH9, 2009).”

Dacă folosim comanda hostnamectl pe desktop-ul nostru fizic, rezultatul nu conține o linie de „Virtualizare”.

 hostnamectl 

Ieșirea de la comanda hostnamectl pe un computer fizic, fără informații de „Virtualizare”.

Dacă nu există un câmp „Virtualizare”, trebuie să rulați pe bare metal.

Comanda systemd-detect-virt

Dacă doriți să obțineți un răspuns cât mai scurt posibil, systemd-detect-virt este probabil ceea ce căutați. Din nou, aceasta necesită o distribuție echipată cu systemd , dar nu necesită privilegii sudo . Acest lucru – și rezultatul său concis – îl fac bine potrivit pentru utilizare în scripturi.

Acesta este rezultatul rulării comenzii pe VM Ubuntu VirtualBox.

 systemd-detect-virt 

Identificarea unei VM VirtualBox cu systemd-detect-virt

Copia noastră a Fedora care rulează în casetele GNOME este raportată ca utilizând virtualizarea KVM.

 systemd-detect-virt 

Identificarea unei VM GNOME Boxes cu systemd-detect-virt

Rularea systemd-detect-virt pe mașina noastră hardware are ca rezultat tipărirea „niciun” pe terminal.

 systemd-detect-virt 

Un computer fizic fiind identificat corect ca neavând virtualizare

Un Script sensibil la platformă

Pentru a oferi unui script capacitatea de a detecta dacă rulează într-un mediu virtualizat sau pe hardware fizic, putem folosi comanda systemd-detect-virt și putem folosi instrucțiunile Bash case pentru a gestiona opțiunile.

Acesta este scriptul pe care îl vom folosi. Copiați acest text și salvați-l într-un fișier numit „platform.sh”.

 #!/bin/bash

shopt -s nocasematch

caz $(systemd-detect-virt) în

  nici unul)
    ecou „Hardware fizic”
    ;;

  *)
    ecou „Mașină virtuală”
    ;;
esac

Scriptul folosește shopt pentru a alege potrivirea fără majuscule. Comanda systemd-detect-virt este utilizată în instrucțiunea case . Ieșirea de la această comandă este comparată cu fiecare dintre clauzele case din corpul instrucțiunii case până când este găsită o potrivire. Orice lucru care nu este potrivit este capturat de clauza implicită „*)”.

Cum să utilizați instrucțiunile Case în scripturile Bash
LEGATE Cum să utilizați instrucțiunile de caz în scripturile Bash

Cea mai simplă modalitate este de a testa dacă răspunsul de la systemd-detect-virt este „niciun”. Dacă este, scriptul rulează pe hardware fizic. Pentru toate celelalte cazuri, scriptul trebuie să ruleze pe o mașină virtuală.

Înainte de a putea rula scriptul, trebuie să îl facem executabil, folosind chmod .

 chmod +x platforma.sh 

Realizarea scriptului platformei executabil cu chmod

Identifică corect VM-ul nostru Ubuntu VirtualBox ca mașină virtuală.

 ./platform.sh 

Folosind scriptul platform.sh într-o VM VirtualBox

De asemenea, detectează corect VM-ul GNOME Boxes care rulează Fedora.

 ./platform.sh 

Folosind scriptul platform.sh într-o mașină virtuală GNOME Boxes

De asemenea, scriptul detectează corect când rulează pe o mașină fizică.

 ./platform.sh 

Utilizarea scriptului platform.sh pe un computer fizic

Diferitele clauze de case ar putea seta variabile care au fost verificate în altă parte în script pentru a efectua diferite tipuri de procesare sau ar putea apela funcții specifice în scriptul dumneavoastră.

Dacă scriptul dumneavoastră trebuia să detecteze și să găzduiască diferite tipuri de medii virtuale, ați putea adăuga mai multe clauze de case , căutând diferitele șiruri pe care systemd-detect-virt le poate returna. Putem vedea lista completă a răspunsurilor posibile utilizând opțiunea --list . Pentru a le face mai ușor să le vedeți pe toate simultan, vom canaliza rezultatul prin comanda column .

 systemd-detect-virt --list | coloană 

Setul complet de răspunsuri pe care systemd-detect-virt le poate returna

Luați pastila roșie

Aceste tehnici informează scripturile dvs. când rulează pe hardware liber și când se află într-o mașină virtuală.

La fel ca Neo în Matrix, ei vor ști ce este real și ce nu.