Cum să permiteți scripturilor Linux să detecteze că rulează în mașinile virtuale
Publicat: 2022-06-27Maș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.
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.
Î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
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
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
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
.
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ă
- 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
Să încercăm acea comandă în VM Fedora care rulează în casetele GNOME.
sudo lshw -sistem de clasă
- 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ă
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
- 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
- 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
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
Copia noastră a Fedora care rulează în casetele GNOME este raportată ca utilizând virtualizarea KVM.
systemd-detect-virt
Rularea systemd-detect-virt
pe mașina noastră hardware are ca rezultat tipărirea „niciun” pe terminal.
systemd-detect-virt
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ă „*)”.
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
Identifică corect VM-ul nostru Ubuntu VirtualBox ca mașină virtuală.
./platform.sh
De asemenea, detectează corect VM-ul GNOME Boxes care rulează Fedora.
./platform.sh
De asemenea, scriptul detectează corect când rulează pe o mașină fizică.
./platform.sh
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ă
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.