Определите, работает ли в ВМ, и смонтируйте ли вы по-разному в зависимости от этого

229
David Heyman

Контекст: я второй человек, у которого была эта проблема - система с двойной загрузкой с общим разделом данных, плюс желание запустить одну из ОС в виртуальной машине на другой. Подумав об этом, я понял, что это может быть потенциально решено путем перемещения монтирования диска из /etc/fstabотдельного сценария запуска, который монтирует раздел данных либо непосредственно с диска, либо из папки, совместно используемой программным обеспечением виртуальной машины, в зависимости от того, система работает на ВМ или нет. В любом случае в том же месте в файловой системе.

Я бы предпочел метод, который может иметь три состояния: «Запуск в ВМ», «Запуск вне ВМ» и «не могу сказать». Таким образом, если он работал в ВМ, но программное обеспечение ВМ было неправильно настроено, поэтому общая папка не отображается в виртуализированной ОС (это случилось со мной раньше), она не пытается подключить реальный диск и все сломать., К сожалению, это исключает единственную идею, которая у меня возникла: «проверить общую папку, а если ее там нет, предположим, что нет виртуальной машины».

Итак, как это можно сделать? Желательно без необходимости монтировать его каждый раз при загрузке.

Если это уместно, одна ОС - это Windows 10, а другая - Linux Mint, и Mint будет той, которая находится в виртуальной машине (иногда).

0
А как насчет того, чтобы ваш скрипт проверял MAC-адрес текущей сетевой карты? Аппаратный MAC = работает вне виртуальной машины, виртуальный MAC = работает внутри виртуальной машины, а другой MAC = неизвестен. Если у вас нетривиальная настройка NIC, это не должно быть слишком сложно для реализации. Jens Ehrich 7 лет назад 0

1 ответ на вопрос

1
MariusMatutiae

В Linux любой Linux, работающий в среде VM, сигнализируется наличием флага гипервизора в / proc / cpuinfo . Итак, запустив гостевую версию Arch Linux на хосте Debian, я получаю (как sudo !):

# cat / proc / cpuinfo процессор: 0 vendor_id: GenuineIntel семья процессора: 6 модель: 61 Название модели: Intel (R) Core (TM) i7-5500U CPU @ 2,40 ГГц степпинг: 4 процессор, МГц: 2394,460 размер кеша: 4096 кб физический идентификатор: 0 братьев и сестер: 1 основной идентификатор: 0 процессорных ядер: 1 апицид: 0 начальная апицид: 0 fdiv_bug: нет f00f_bug: нет coma_bug: нет фпу: да fpu_exception: да Уровень процессора: 20 wp: да флаги: FPU VME - де - псевдоэфедрин TSC MSR пае MCE CX8 APIC SEP MTRR PGE MCA CMOV погладить pse36 clflush MMX fxsr сс sse2 системного вызов пх rdtscp ой constant_tsc xtopology nonstop_tsc eagerfpu ПНИ PCLMULQDQ монитор SSSE3 CX16 sse4_1 sse4_2 movbe POPCNT АЕС XSAVE AVX rdrand гипервизор lahf_lm ABM 3dnowprefetch rdseed ошибки: bogomips: 4790,45 размер clflush: 64 cache_alignment: 64 размеры адресов: физические 39 бит, виртуальные 48 бит управление энергопотреблением: 

Иногда люди используют сценарий virt-what (доступный в большинстве репозиториев) для этого, но это намного сложнее, чем стоит в вашем случае; также требуется установка дополнительного программного обеспечения ( virt-what и dmidecode, если это не поставляется по умолчанию с вашим дистрибутивом, как в случае, например, с Arch Linux).

Существуют ли вероятные ситуации, когда этот флаг не появляется, если не предпринимать интенсивных попыток замаскировать ВМ как аппаратное обеспечение? David Heyman 7 лет назад 0
@DavidHeyman Нет, если вы не думаете о контейнерах Linux, которые на самом деле не являются виртуальными машинами, поэтому нет флага * гипервизора *. MariusMatutiae 7 лет назад 0
Нет, я просто думал о неправильной конфигурации. David Heyman 7 лет назад 0

Похожие вопросы