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
- 답변 # 2
가상 머신은 완전한 샌드 박스로 설계되었습니다. 즉, 내부의 운영 체제가 실제 시스템에서 직접 실행되는 것과 동일한 방식으로 작동하도록 설계되었습니다.
이것은 메모리 주소 변환, 하드웨어 시뮬레이션 및 기타 수단을 통해 VM 내의 운영 체제가 실제 머신에서 직접 실행되고 있다고 생각하도록 속임을 의미합니다.
or is there a better/more convenient way to check if the system is a virtual machine?
이것은 VM 관련 기능이라고 생각합니다. 해당 VM을 실행하는 모든 운영 체제에서는 일관성이 있어야하지만 모든 VM에서는 그렇지 않아야합니다.
가상 머신에 있는지 여부를 판별하기 위해이 결과에 의존 할 수 있더라도이 방법은 권장되지 않으며 VM을 처음으로 사용해야하는 큰 이유를 무시합니다. 가상화 원칙은 가상의 질문을 제기합니다.다른 하드웨어에서이 소프트웨어/OS를 실행하면 어떻게됩니까?가상 머신은 하드웨어를 시뮬레이션하여 해당 질문에 대답합니다. VM 내부와 외부에서 소프트웨어가 실행되는 방식을 변경하면 해당 질문에 대한 답이 잘못되어 프로그램을 사용하는 사람들에게 매우 실망 할 것입니다. 이것이 반드시 제공해야하는 기능인 경우 최소한 토글 가능하게하고 기본적으로 해제하십시오.
내가 아는 한 모든 아키텍처, 운영 체제 및 VM의 가상 머신에서 실행 중인지 알 수있는 확실한 방법은 없습니다. 그리고 있다면 가상화의 기본 원칙을 위반하여 사용합니다.
/proc/cpuinfo
관련 자료
- linux - 가상 머신의 호스트 게스트 파일 시스템에서 Git 작업 트리를 사용하는 방법
- Azure 가상 컴퓨터에 연결된 데이터 디스크가 갑자기 연결 해제되는 원인은 무엇입니까?
- 여러 Azure 구독 내에서 가상 컴퓨터 이름 및 IP 주소를 내보내는 방법
- Azure Virtual Machine Scale Set 확장 프로비저닝 두 인스턴스
- PHP에서 Google Cloud Virtual Machine 만들기
- azure - 기존 가상 머신 스케일 세트에 퍼블릭 IP 추가
- 익명의 Windows 가상 머신 (VirtualBox)과 함께 VPN을 사용하십니까?
- Windows 가상 머신에서 Docker 실행
- Python을 사용하여 Azure Virtual Machine이 다운되었는지 확인
- Azure Virtual Machine이 다운되었는지 확인
- linux - 가상 머신에서 CPU 시간이 많이 뛰어남
- powershell - Azure CLI를 사용하여 SQL Server Windows 가상 컴퓨터 만들기
- JVM 포팅이 필요할 때 아키텍처에서 Java를 실행하는 Java Virtual Machine의 목적은 무엇입니까?
- virtualization - VMM (Virtual Machine Manager)과 하이퍼 바이저가 동일한 것을 참조합니까?
- active directory - Azure CLI를 사용하여 Azure 가상 컴퓨터를 AD 도메인에 가입시키는 방법
- javascript - 웹 기반 체크인 시스템에서 사용자를 어떻게 추적합니까?
- VM (가상 머신)이 호스트 디스크를 덮어 쓸 수 있습니까? 아니면 호스트가 게스트 디스크를 덮어 쓰거나 게스트가 다른 게스트 디스크를 덮어 쓸 수 있습니까?
- MacOS-Big Sur VirtualBox 오류 종료 code 1 (0x1)로 시작하는 동안 가상 머신이 예기치 않게 종료되었습니다.
- hardware - 시스템이 정상적으로 종료되었는지 확인하는 방법은 무엇입니까?
- dns - Azure Virtual Machine에 대한 사용자 지정 도메인을 설정하는 방법은 무엇입니까?
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
와이즈 비즈 와이즈 비즈
아니요. 먼저 x86/x86_64 CPU에서만 작동합니다. CPUID 명령어의 하이퍼 바이저 비트에 의존하며 가상화되지 않은 경우 항상 0이지만 VM에서 실행될 때 반드시 1 일 필요는 없습니다. 예를 들어 qemu는 설정하지 않도록 구성 할 수 있습니다. 이 설정을 사용하여 VM 감지를 시도한 소프트웨어를 해결했기 때문에 알고 있습니다.
와이즈 비즈실제로. CPUID를 직접 호출 할 수 있습니다 (예). 적어도