Polecenie terminalu, aby dowiedzieć się, czy serwer jest wirtualny czy fizyczny

13

Szukam polecenia terminalu, które nie wymaga, aby wykonujący użytkownik był w grupie sudoers, a także był uniwersalny i nie wymagał instalowania dodatkowych pakietów. Do tej pory odkryłem, że jeśli system ma zainstalowany system, mogę użyć:

$ hostnamectl status
   Static hostname: mint
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
           Boot ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  Operating System: Linux Mint LMDE
            Kernel: Linux 3.16.0-6-amd64

i pod nazwą ikony i podwozia widzę, czy jest to maszyna wirtualna czy fizyczna. Zastanawiałem się jednak, czy mogę użyć lscpu, zwłaszcza, że ​​jest to metoda bardziej uniwersalna niż hostnamectli nie wymaga systemd. Moja teoria jest taka, że ​​jeśli procesor ma tylko jeden wątek na rdzeń, a także nie ma na nim minimalnej i maksymalnej częstotliwości procesora, powinno to oznaczać, że serwer jest rzeczywiście zwirtualizowany.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
Stepping:              3
CPU MHz:               2500.488
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              4988.18
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7

Wiem, że jeśli procesor ma tylko jeden wątek na rdzeń, niekoniecznie oznacza, że ​​jest to VM, ale wszystkie współczesne procesory powinny mieć 2 wątki na rdzeń, a ponadto mogę wziąć pod uwagę brak / obecność minimalna i maksymalna częstotliwość procesora na lscpuwyjściu.

George Stoyanov
źródło
4
„wszystkie nowoczesne procesory powinny mieć 2 wątki na rdzeń” - Skąd pomysł? Intel wydał w tym roku 20 procesorów, które tego nie mają. A to tylko Intel.
marcelm
@marcelm, nie wiedziałem o tym.
George Stoyanov
2
Istnieją również przypadki użycia, w których najlepsza wydajność wymaga wyłączenia funkcji hyperthreading w systemie BIOS.
doneal24

Odpowiedzi:

17

W danych warunkach:

polecenie terminala, które nie wymaga, aby wykonujący użytkownik znalazł się w grupie sudoers, a także by było uniwersalne i nie wymagało instalowania dodatkowych pakietów.

oczywistą najprostszą metodą dla niezmodyfikowanych maszyn wirtualnych, których właściciele celowo nie próbowali ukryć faktu, że system operacyjny jest maszyną wirtualną

cat /sys/class/dmi/id/product_name

Więcej możliwości:

Poza warunkami podanymi przez autora OP istnieją bardziej skomplikowane podejścia, takie jak ten: Gdzie jestem? Identyfikacja systemu operacyjnego i wirtualizacji bez wywołań systemowych

Kok
źródło
1
@ GeorgеStoyanov Nie ma za co!
Bob
Bez dodatkowej konfiguracji libvirt-kvm-VM wyświetla się podczas pracy jako „Standardowy komputer PC (i440FX + PIIX, 1996)” cat /sys/class/dmi/id/product_name, więc nie jestem pewien, czy jest to przydatne.
Jonas Schäfer
2
@JonasWielicki Jest to dobrze zdefiniowany opis systemu używany domyślnie dla każdej maszyny wirtualnej opartej na QEMU i nigdy nie jest widoczny na normalnym sprzęcie.
Austin Hemmelgarn
1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)jest dobrze znanym odciskiem palca maszyn wirtualnych QEMU / KVM. Nawiasem mówiąc, ten odcisk palca można łatwo zignorować: askubuntu.com/questions/564643/…
Bob
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_namezawartość tych dwóch plików powinna również dać ci dość dokładne pojęcie, czy system jest fizyczny czy wirtualny.
George Stoyanov,
12

Wymaga to również systemd (co i tak jest dziś dość wszechobecne), ale systemd-detect-virtjest lepszym narzędziem do stwierdzenia, czy działa na sprzęcie fizycznym czy wirtualnym.

Możesz rzucić okiem na stosowaną przez siebie logikęsystemd-detect-virt , zauważysz, że w rzeczywistości szuka ona wielu miejsc w celu wykrycia kilku różnych technologii wirtualizacji ...

Myślę, że coś naiwnego, na przykład patrząc na lscpuwyniki, może czasami działać, ale wydaje mi się, że prawie nie działałoby przez cały czas. Należy również pamiętać, że wiele technologii umożliwia (a nawet prawdopodobne), że maszyny wirtualne mają więcej niż jeden wątek na rdzeń, więc nawet nie sądzę, że ta konkretna funkcja jest wystarczająca do wykonania pewnego rodzaju niezawodnego wykrywania.

filbranden
źródło
Myślę, że jeśli w lscpu brakuje minimalnej i maksymalnej częstotliwości, może to również oznaczać, że maszyna jest rzeczywiście maszyną wirtualną. Ale twoja metoda wydaje się bardziej niezawodna.
George Stoyanov,
1
@ GeorgеStoyanov Może to również oznaczać, że skalowanie częstotliwości jest całkowicie wyłączone z jakiegoś innego powodu, więc nie jest wiarygodne.
Austin Hemmelgarn