>

Linux 시스템이 가상 머신 또는 물리적 머신에서 실행되고 있는지 확인하려고합니다.

현재 나의 해결책은 :

void check_vm() {
   FILE *fp;
   char hyperv[] = "hypervisor";   // /proc/cpuinfo should contain 'hypervisor' if the system is a virtual machine 
   char buffer[255];
   fp = popen("cat /proc/cpuinfo | grep -o 'hypervisor'","r");
   fgets(buffer,255,fp);
   if (strstr(buffer,hyperv) != NULL) {
      printf("Virtual Machine = True\n");
   } else {
      printf("Virtual Machine = False\n");
   }
   pclose(fp); }

질문은 : 실제로
의 출력에 의존 할 수 있습니까 cat /proc/cpuinfo | grep -o 'hypervisor' 또는 시스템이 가상 머신인지 확인하는 더 좋고 편리한 방법이 있습니까?

감사합니다!

  • 답변 # 1

    와이즈 비즈 와이즈 비즈

    아니요. 먼저 x86/x86_64 CPU에서만 작동합니다. CPUID 명령어의 하이퍼 바이저 비트에 의존하며 가상화되지 않은 경우 항상 0이지만 VM에서 실행될 때 반드시 1 일 필요는 없습니다. 예를 들어 qemu는 설정하지 않도록 구성 할 수 있습니다. 이 설정을 사용하여 VM 감지를 시도한 소프트웨어를 해결했기 때문에 알고 있습니다.

    와이즈 비즈

    실제로. CPUID를 직접 호출 할 수 있습니다 (예). 적어도

    The question is: Can I actually rely on output of 가없는 컴퓨터에서 작동합니다.  (runnig Windows와 같은), 여전히 x86 전용이며 신뢰할 수 없습니다.

    빨간색 알약을 사용할 수 있습니다. 또한 x86 전용이지만 여전히 작동한다고 가정하면 CPUID에 의존하는 것보다 더 안정적 일 수 있습니다.

    파란 알약을 읽고 싶을 수도 있습니다.

    타이밍 공격으로 감지 할 수없는 완벽한 하이퍼 바이저를 만드는 것은 아마도 불가능하지만 시간이 지남에 따라 (푸른 알약과 같은) 은밀한 하이퍼 바이저를 감지하는 것이 점점 어려워 질 것입니다. 마법의 cat /proc/cpuinfo | grep -o 'hypervisor' 가 없습니다  완전히 신뢰할 수있는 기능은 아니지만 절대 많은 시간을 할애한다면 여러 익스플로잇을 결합하고 시간이 지남에 따라 새로운 익스플로잇을 계속 추가 할 수 있습니다. 미래.

  • 답변 # 2

    가상 머신은 완전한 샌드 박스로 설계되었습니다. 즉, 내부의 운영 체제가 실제 시스템에서 직접 실행되는 것과 동일한 방식으로 작동하도록 설계되었습니다.

    이것은 메모리 주소 변환, 하드웨어 시뮬레이션 및 기타 수단을 통해 VM 내의 운영 체제가 실제 머신에서 직접 실행되고 있다고 생각하도록 속임을 의미합니다.

    or is there a better/more convenient way to check if the system is a virtual machine?

    인 경우  OS가 VM 내부에서 실행 중인지 여부를 알 수있는 정보를 제공합니다. 확실히 흥미롭지 만, 내가 아는 한, 규범은아닙니다. 일반적으로 CPU도 에뮬레이트됩니다.

    이것은 VM 관련 기능이라고 생각합니다. 해당 VM을 실행하는 모든 운영 체제에서는 일관성이 있어야하지만 모든 VM에서는 그렇지 않아야합니다.

    가상 머신에 있는지 여부를 판별하기 위해이 결과에 의존 할 수 있더라도이 방법은 권장되지 않으며 VM을 처음으로 사용해야하는 큰 이유를 무시합니다. 가상화 원칙은 가상의 질문을 제기합니다.다른 하드웨어에서이 소프트웨어/OS를 실행하면 어떻게됩니까?가상 머신은 하드웨어를 시뮬레이션하여 해당 질문에 대답합니다. VM 내부와 외부에서 소프트웨어가 실행되는 방식을 변경하면 해당 질문에 대한 답이 잘못되어 프로그램을 사용하는 사람들에게 매우 실망 할 것입니다. 이것이 반드시 제공해야하는 기능인 경우 최소한 토글 가능하게하고 기본적으로 해제하십시오.

    내가 아는 한 모든 아키텍처, 운영 체제 및 VM의 가상 머신에서 실행 중인지 알 수있는 확실한 방법은 없습니다. 그리고 있다면 가상화의 기본 원칙을 위반하여 사용합니다.

    /proc/cpuinfo

관련 자료

  • 이전 c++ - centos 7에서 Qt 5111의 컴파일 오류
  • 다음 중첩 된 REGEX 캡처