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ż hostnamectl
i 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 lscpu
wyjściu.
źródło
Odpowiedzi:
W danych warunkach:
oczywistą najprostszą metodą dla niezmodyfikowanych maszyn wirtualnych, których właściciele celowo nie próbowali ukryć faktu, że system operacyjny jest maszyną wirtualną
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
źródło
cat /sys/class/dmi/id/product_name
, więc nie jestem pewien, czy jest to przydatne.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/…pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_name
zawartość tych dwóch plików powinna również dać ci dość dokładne pojęcie, czy system jest fizyczny czy wirtualny.Wymaga to również systemd (co i tak jest dziś dość wszechobecne), ale
systemd-detect-virt
jest 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
lscpu
wyniki, 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.źródło