Jak pozwolić skryptom Linuksa wykryć, że działają w maszynach wirtualnych?

Opublikowany: 2022-06-27
Dwie ręce, jedna trzyma czerwoną pigułkę, a druga niebieską.
diy13/Shutterstock.com

Maszyny wirtualne naprawdę starają się przekonać swoje systemy operacyjne, że działają na fizycznym sprzęcie. Czy możesz powiedzieć z wiersza poleceń Linuksa, czy komputer jest fizyczny czy wirtualny?

Maszyny wirtualne i hipernadzorcy

Tradycyjny komputer to obiekt fizyczny. Jest to zbiór różnych elementów sprzętu, które są ze sobą połączone i skręcane, dzięki czemu można załadować system operacyjny, instalować aplikacje, uruchamiać je i korzystać z nich.

Sprzęt jest drogi. Ograniczenie do jednego systemu operacyjnego na fizyczny komputer oznacza, że ​​koszt uruchamiania kilku systemów operacyjnych wkrótce stanie się zaporowy. Lepszym rozwiązaniem byłoby umożliwienie jednemu fizycznemu komputerowi jednoczesnego uruchamiania wybranych systemów operacyjnych, przy czym każdy myślałby, że działa na swoim własnym, unikalnym sprzęcie.

Co to jest hiperwizor maszyny wirtualnej?
Co to jest hipernadzorca maszyny wirtualnej?

Umożliwia to hiperwizor. Hiperwizor — zwany także menedżerem maszyny wirtualnej lub monitorem maszyny wirtualnej — to oprogramowanie umożliwiające tworzenie maszyn wirtualnych. Zachowują się one tak, jakby były indywidualnymi, fizycznymi komputerami, chociaż działają na tym samym fizycznym hoście, dzieląc miejsce na dysku twardym, pamięć i rdzenie procesora.

Oczywiście komputer hosta musi być wystarczająco wydajny, aby sprostać wymaganiom związanym z gromadzeniem maszyn wirtualnych, ale przy wystarczającej ilości pamięci RAM i mocy obliczeniowej hosta maszyny wirtualne mogą działać z prędkością bliską bare metal.

Od czasu wydania jądra 2.6.20 w 2007 r. Linux ma wbudowaną obsługę maszyn wirtualnych opartych na jądrze. Linux ma kilka dostępnych hipernadzorców, takich jak VirtualBox, GNOME Boxes i QEMU-KVM. Wykorzystują natywną funkcję KVM systemu Linux, opierając się na natywnej funkcjonalności jądra, dodając interfejsy użytkownika i funkcje, takie jak możliwość wykonania migawki maszyny wirtualnej.

Maszyny wirtualne zapewniają oszczędności, większą wydajność, uproszczone wdrożenia i — prawidłowo przygotowane — korzyści w zakresie bezpieczeństwa. Ułatwiają również skalowalność. Nowe serwery mogą być automatycznie uruchamiane wraz ze wzrostem zapotrzebowania na usługę i wyłączane, gdy popyt spada. To sprawia, że ​​są niezwykle popularne zarówno w chmurze, jak i w infrastrukturze lokalnej.

Być może zdalnie administrujesz serwerem Linux i musisz wiedzieć, czy jest to maszyna wirtualna, czy fizyczne pudełko. Lub masz skrypt, który musi wiedzieć, na jakiej platformie jest wykonywany. Oto kilka sposobów na wykrycie, czy komputer, na którym pracujesz, jest fizyczny czy wirtualny.

Polecenie dmidecode

Polecenie dmidecode obsługuje dużą liczbę opcji i modyfikatorów. Przeszukuje tabele interfejsu zarządzania pulpitem (DMI) i drukuje informacje w oknie terminala.

Jak wyświetlić listę urządzeń komputera z terminala Linux?
POWIĄZANE Jak wyświetlić listę urządzeń komputera z terminala Linux

Użyjemy go z opcją -s (wyświetla pojedynczy ciąg) i poprosimy o nazwę produktu systemowego. Zauważ, że musimy użyć sudo .

Uruchomimy polecenie na maszynie wirtualnej VirtualBox z systemem Ubuntu 22.04.

 sudo dmidecode -s nazwa-systemu-produktu 

Polecenie dmidecode poprawnie identyfikuje maszynę wirtualną VirtualBox

Platforma jest poprawnie zidentyfikowana jako VirtualBox.

Na maszynie wirtualnej QEMU-KVM z Fedorą 35 otrzymujemy te dane wyjściowe.

 sudo dmidecode -s nazwa-systemu-produktu 

Polecenie dmidecode poprawnie identyfikuje maszynę wirtualną GNOME Boxes

Chociaż jest to zgłaszane jako standardowy komputer PC, jest to standardowy komputer wirtualny QEMU typu Q35. Dzięki temu platforma jest poprawnie rozpoznawana jako maszyna wirtualna.

Jeśli uruchomimy to samo polecenie na fizycznym komputerze, otrzymamy informacje o producencie.

 sudo dmidecode -s nazwa-systemu-produktu 

Polecenie dmidecode zwracające informacje o fizycznym komputerze

Ten komputer jest zbudowany na zamówienie w oparciu o płytę główną Micro-Star International Company Limited o kodzie produktu MS-7B86.

Dowództwo lshw

Polecenie lshw wyświetla szczegółowe informacje o szerokiej gamie sprzętu komputerowego. Możemy wybrać klasę sprzętu, o której chcemy, aby lshw raportował.

Jak korzystać z lshw w systemie Linux (z praktycznym przykładem)
POWIĄZANE Jak korzystać z lshw w systemie Linux (z praktycznym przykładem)

Użyjemy opcji -class z modyfikatorem system . Użycie sudo z tym poleceniem zapewnia, że ​​widzimy wszystkie szczegóły.

Uruchomimy to polecenie na naszej maszynie wirtualnej Ubuntu VirtualBox.

 sudo lshw - system klasy 

Raportowanie polecenia lshw na maszynie wirtualnej VirtualBox

  • Pole „opis” zawiera ogólny wpis „komputer”.
  • Pole „produkt” mówi nam, że jest to maszyna wirtualna działająca w VirtualBox.
  • Pole „dostawca” zawiera nazwę niemieckiej firmy, która stworzyła VirtualBox, Innotek GmbH. Innotek został przejęty przez Oracle Corporation w 2010 roku w ramach przejęcia Sun Microsystems, Inc.

Musieliśmy zainstalować lshw na Fedorze.

 sudo dnf zainstaluj lshw 

Instalowanie lshw w Fedorze za pomocą polecenia dnf

Wypróbujmy to polecenie w naszej maszynie wirtualnej Fedory działającej w GNOME Boxes.

 sudo lshw - system klasy 

Polecenie lshw raportuje na maszynie wirtualnej GNOME Boxes

  • Ponownie, pole „opis” zawiera ogólny wpis „komputer”.
  • Pole „produkt” daje nam te same standardowe informacje o komputerze QEMU, które widzieliśmy za pomocą polecenia dmidecode .
  • Pole „dostawca” zawiera „QEMU”, co dość wyraźnie wskazuje, że jest to maszyna wirtualna.

Jest to wynik uruchomienia tego samego polecenia na naszym fizycznym komputerze.

 sudo lshw - system klasy 

Raportowanie polecenia lshw na fizycznym komputerze

Widzimy, że jest to komputer sprzętowy, z płytą główną Micro-Star.

  • Sprzęt jest identyfikowany jako komputer stacjonarny.
  • Pole „produkt” podaje typ płyty głównej, MS-7B86.
  • Pole „vendor” zawiera nazwę producenta.

Komenda hostnamectl

To polecenie ma tę zaletę, że nie musisz mieć uprawnień sudo , aby je uruchomić. Jednak jest dostępny tylko w dystrybucjach z systemd . Większość nowoczesnych dystrybucji korzysta z systemd .

To jest odpowiedź z uruchomienia polecenia na naszej maszynie wirtualnej Ubuntu VirtualBox.

 nazwa hosta 

Dane wyjściowe polecenia hostnamectl w maszynie wirtualnej VirtualBox z podświetloną linią wirtualizacji

  • Do pola „icon-name” dołączono „-vm”.
  • Pole „Podwozie” zawiera „vm”.
  • Pole „Wirtualizacja” zawiera słowo „wyrocznia”.
  • Pole „Hardware Vendor” zawiera „innotek GmbH”.
  • Pole „Model sprzętu” zawiera „VirtualBox”.

Dane wyjściowe naszej maszyny wirtualnej Fedory wewnątrz GNOME Boxes są bardzo podobne.

 nazwa hosta 

Dane wyjściowe polecenia hostnamectl w maszynie wirtualnej GNOME Boxes z podświetloną linią wirtualizacji

  • Do pola „icon-name” dołączono „-vm”.
  • Pole „Podwozie” zawiera „vm”.
  • Pole „Wirtualizacja” zawiera „kvm”.
  • Pole „Hardware Vendor” zawiera „QEMU”
  • Pole „Model sprzętu” zawiera „Standardowy komputer (Q35 + ICH9, 2009).”

Jeśli użyjemy polecenia hostnamectl na naszym fizycznym pulpicie, dane wyjściowe nie zawierają wiersza „Wirtualizacja”.

 nazwa hosta 

Dane wyjściowe polecenia hostnamectl na fizycznym komputerze, bez informacji o „wirtualizacji”

Jeśli nie ma pola „Wirtualizacja”, musisz działać na gołym metalu.

Polecenie systemd-detect-virt

Jeśli chcesz uzyskać jak najkrótszą odpowiedź, prawdopodobnie systemd-detect-virt . Ponownie wymaga to dystrybucji wyposażonej w systemd , ale nie wymaga uprawnień sudo . To — i jego zwięzłe dane wyjściowe — sprawiają, że dobrze nadaje się do użycia w skryptach.

Jest to wynik uruchomienia polecenia na naszej maszynie wirtualnej Ubuntu VirtualBox.

 systemd-detect-virt 

Identyfikacja maszyny wirtualnej VirtualBox za pomocą systemd-detect-virt

Nasza kopia Fedory działająca w GNOME Boxes została zgłoszona jako korzystająca z wirtualizacji KVM.

 systemd-detect-virt 

Identyfikowanie maszyny wirtualnej GNOME Boxes za pomocą systemd-detect-virt

Uruchomienie systemd-detect-virt na naszym sprzęcie powoduje, że terminal nie drukuje „none”.

 systemd-detect-virt 

Fizyczny komputer prawidłowo zidentyfikowany jako nie posiadający wirtualizacji

Skrypt wrażliwy na platformę

Aby dać skryptowi możliwość wykrywania, czy działa w środowisku zwirtualizowanym, czy na fizycznym sprzęcie, możemy użyć polecenia systemd-detect-virt i użyć instrukcji Bash case do obsługi opcji.

To jest skrypt, którego będziemy używać. Skopiuj ten tekst i zapisz go w pliku o nazwie „platform.sh”.

 #!/kosz/bash

shopt -s nocasematch

case $(systemd-detect-virt) in

  Żaden)
    echo "Sprzęt fizyczny"
    ;;

  *)
    echo "Maszyna wirtualna"
    ;;
esac

Skrypt używa shopt do wyboru dopasowania bez rozróżniania wielkości liter. W instrukcji case używana jest komenda systemd-detect-virt . Dane wyjściowe tego polecenia są porównywane z każdą klauzulą case w treści instrukcji case , dopóki nie zostanie znalezione dopasowanie. Wszystko, co nie jest dopasowane, jest przechwytywane przez domyślną klauzulę „*)”.

Jak używać instrukcji przypadku w skryptach Bash
POWIĄZANE Jak używać instrukcji przypadku w skryptach Bash

Najprostszym sposobem jest sprawdzenie, czy odpowiedź z systemd-detect-virt to „brak”. Jeśli tak, skrypt działa na fizycznym sprzęcie. We wszystkich innych przypadkach skrypt musi być uruchomiony na maszynie wirtualnej.

Zanim będziemy mogli uruchomić skrypt, musimy uczynić go wykonywalnym, używając chmod .

 chmod +x platforma.sh 

Uczynienie skryptu platformy wykonywalnym za pomocą chmod

Prawidłowo identyfikuje naszą maszynę wirtualną Ubuntu VirtualBox jako maszynę wirtualną.

 ./platforma.sh 

Korzystanie ze skryptu platform.sh w maszynie wirtualnej VirtualBox

Prawidłowo wykrywa również maszynę wirtualną GNOME Boxes z Fedorą.

 ./platforma.sh 

Korzystanie ze skryptu platform.sh w maszynie wirtualnej GNOME Boxes

Skrypt również poprawnie wykrywa, kiedy jest uruchomiony na fizycznym komputerze.

 ./platforma.sh 

Korzystanie ze skryptu platform.sh na fizycznym komputerze

Różne klauzule case mogą ustawiać zmienne, które zostały sprawdzone w innym miejscu w skrypcie, aby wykonywać różne typy przetwarzania lub mogą wywoływać określone funkcje w skrypcie.

Jeśli Twój skrypt musiał wykrywać i uwzględniać różne typy środowisk wirtualnych, możesz dodać więcej klauzul case , szukając różnych ciągów, które może zwrócić systemd-detect-virt . Możemy zobaczyć pełną listę możliwych odpowiedzi, używając opcji --list . Aby łatwiej było zobaczyć je wszystkie naraz, prześlemy dane wyjściowe przez polecenie column .

 systemd-detect-virt --list | kolumna 

Pełny zestaw odpowiedzi, które systemd-detect-virt może zwrócić

Weź czerwoną pigułkę

Te techniki informują skrypty, kiedy działają na czystym sprzęcie i kiedy znajdują się wewnątrz maszyny wirtualnej.

Jak Neo w Matrixie, będą wiedzieć, co jest prawdziwe, a co nie.