Jak pozwolić skryptom Linuksa wykryć, że działają w maszynach wirtualnych?
Opublikowany: 2022-06-27Maszyny 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.
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.
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
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
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
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ł.
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
- 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
Wypróbujmy to polecenie w naszej maszynie wirtualnej Fedory działającej w GNOME Boxes.
sudo lshw - system klasy
- 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
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
- 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
- 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
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
Nasza kopia Fedory działająca w GNOME Boxes została zgłoszona jako korzystająca z wirtualizacji KVM.
systemd-detect-virt
Uruchomienie systemd-detect-virt
na naszym sprzęcie powoduje, że terminal nie drukuje „none”.
systemd-detect-virt
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ę „*)”.
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
Prawidłowo identyfikuje naszą maszynę wirtualną Ubuntu VirtualBox jako maszynę wirtualną.
./platforma.sh
Prawidłowo wykrywa również maszynę wirtualną GNOME Boxes z Fedorą.
./platforma.sh
Skrypt również poprawnie wykrywa, kiedy jest uruchomiony na fizycznym komputerze.
./platforma.sh
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
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.