Perintah terminal untuk mencari tahu apakah server virtual atau fisik

13

Saya mencari perintah terminal yang tidak mengharuskan pengguna yang mengeksekusi berada di grup sudoers dan juga bersifat universal dan tidak perlu menginstal paket tambahan. Sejauh ini saya telah menemukan bahwa jika sistem telah menginstal systemd maka saya dapat menggunakan:

$ 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

dan di bawah Icon name dan Chassis saya dapat melihat apakah itu VM atau mesin fisik. Tetapi saya bertanya-tanya apakah saya dapat menggunakan lscpu, terutama karena ini adalah metode yang lebih universal daripada hostnamectldan tidak memerlukan systemd. Teori saya adalah bahwa jika CPU hanya memiliki satu utas per inti dan juga tidak terdaftar frekuensi CPU minimum dan maksimum ini harus menjadi indikasi bahwa server memang tervirtualisasi.

$ 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

Saya tahu bahwa jika sebuah CPU hanya memiliki satu utas per inti tidak selalu berarti bahwa itu adalah VM pasti, tetapi kemudian semua CPU modern harus memiliki 2 utas per inti dan selain itu saya juga dapat memperhitungkan kekurangan / keberadaan frekuensi CPU minimum dan maksimum dalam lscpuoutput.

Georgе Stoyanov
sumber
4
"semua CPU modern harus memiliki 2 utas per inti" - Di mana Anda mendapatkan ide itu? Intel telah merilis 20 prosesor tahun ini yang tidak memilikinya. Dan itu hanya Intel.
marcelm
@marcelm, saya tidak tahu itu.
Georgе Stoyanov
2
Ada juga kasus-kasus penggunaan di mana kinerja terbaik mensyaratkan bahwa HyperThreading dimatikan di BIOS.
selesai24

Jawaban:

17

Dalam kondisi tertentu:

perintah terminal yang tidak mengharuskan pengguna yang mengeksekusi berada dalam kelompok sudoers dan juga bersifat universal dan tidak perlu menginstal paket tambahan.

metode paling sederhana yang jelas untuk VM yang tidak dimodifikasi, yang pemiliknya tidak mencoba menyembunyikan fakta bahwa OS adalah VM, adalah

cat /sys/class/dmi/id/product_name

Lebih banyak kemungkinan:

Di luar yang diberikan oleh kondisi penulis OP ada pendekatan yang lebih rumit seperti ini: Di mana saya? Sistem Operasi dan Identifikasi Virtualisasi Tanpa Panggilan Sistem

Bob
sumber
1
@ GeorgеStoyanov Sama-sama!
Bob
Tanpa konfigurasi tambahan, libvirt-kvm-VM ditampilkan sebagai "PC Standar (i440FX + PIIX, 1996)" saat berjalan cat /sys/class/dmi/id/product_name, jadi saya tidak yakin seberapa berguna itu.
Jonas Schäfer
2
@JonasWielicki Itu adalah deskripsi sistem yang didefinisikan dengan baik yang digunakan secara default untuk VM berbasis QEMU, dan tidak pernah terlihat pada perangkat keras normal.
Austin Hemmelgarn
1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)adalah sidik jari terkenal dari mesin virtual QEMU / KVM. Omong-omong, sidik jari ini dapat dengan mudah diganti
Bob
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_namekonten dari kedua file ini juga harus memberi Anda ide yang cukup akurat apakah sistem tersebut fisik atau virtual.
Georgе Stoyanov
12

Ini juga memerlukan systemd (yang mana-mana hari ini), tetapi systemd-detect-virtmerupakan alat yang lebih baik untuk mengetahui apakah ini berjalan pada perangkat keras fisik atau virtual.

Anda dapat melihat pada logika yang digunakan oleh systemd-detect-virt, Anda akan melihat bahwa itu benar-benar terlihat di banyak tempat untuk mendeteksi beberapa teknologi virtualisasi yang berbeda ...

Saya pikir sesuatu yang naif seperti melihat lscpuoutput mungkin bekerja dalam beberapa kasus beberapa waktu, tetapi saya pikir itu tidak akan berhasil sepanjang waktu. Perlu diketahui juga bahwa banyak teknologi memungkinkan (dan bahkan mungkin) bagi VM untuk memiliki lebih dari satu utas per inti, jadi saya bahkan tidak berpikir bahwa fitur tertentu cukup untuk melakukan deteksi apa pun yang dapat diandalkan di sini.

filbranden
sumber
Saya berpikir bahwa jika frekuensi minimum dan maksimum hilang dari lscpu maka ini juga bisa menjadi indikasi bahwa mesin tersebut memang VM. Tetapi metode Anda tampaknya lebih dapat diandalkan.
Georgе Stoyanov
1
@ GeorgеStoyanov Itu juga bisa berarti bahwa penskalaan frekuensi sepenuhnya dinonaktifkan karena beberapa alasan lain, jadi itu tidak dapat diandalkan.
Austin Hemmelgarn