Virtualbox, 게스트에게 특정 CPU를 강제하는 방법


14

VirtualBox, Windows 8 호스트에 XP 게스트가 있습니다. 게스트는 프로세서를 호스트와 투명하게 동일하게 표시합니다 (i5 2500k). 그러나 대부분의 설치 관리자는이 프로세서를 인식하지 못하고 지원되지 않는 프로세서를 계속 언급하지 않습니다.

이것이 오래된 프로세서라고 생각하도록 손님을 속일 수있는 방법이 있습니까? VMWare에 CPU 마스킹 기능이 있다고 올바르게 기억한다면 virtualbox에도 비슷한 것이 있습니까?


CPU 모델을 확인하는 소프트웨어는 무엇입니까?
다스 안드로이드

더블 에이전트 컨트롤, Orca 및 Wix. 이것은 우리가 부활시키려는 VB6 프로젝트를위한 것입니다.
IUnknown

답변:


19

VirtualBox 및 CPUID 기본 사항

VBoxInternal/CPUM/HostCPUID가상 머신 의 추가 데이터 를 설정해야 합니다. 이렇게하면 VirtualBox가 CPUID 명령에 대한 사용자 정의 결과를 게스트에게보고합니다. EAX 레지스터의 값에 따라이 명령어는 공급 업체, 유형, 제품군, 스테핑, 브랜드, 캐시 크기, 기능 (MMX, SSE, SSE2, PAE, HTT) 등과 같은 프로세서에 대한 정보를 반환합니다. 더 많은 결과 맹 글링, 손님을 속일 확률이 높습니다.

vboxmanage setextradata명령을 사용하여 가상 머신을 구성 할 수 있습니다 . 예를 들어

vboxmanage setextradata WinXP VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x50202952

EAX를 80000003₍₁₆₎으로 설정하여 호출하면 CPUID가 EBX 레지스터에서 50202952₍₁₆₎를 반환합니다. (이후 16 진 숫자는 0xNN 또는 NNh로 기록됩니다.)

CPU 공급 업체 문자열 설정

EAX가 0 (또는 AMD의 경우 80000000h)이면 CPUID는 공급 업체를 레지스터 EBX, EDX, ECX (순서에 따라)에 ASCII 문자열로 반환합니다. AMD CPU의 경우 다음과 같습니다.

| Register | Value      | Description                    |
|----------|------------|--------------------------------|
| EBX      | 6874_7541h | The ASCII characters "h t u A" |
| ECX      | 444D_4163h | The ASCII characters "D M A c" |
| EDX      | 6974_6E65h | The ASCII characters "i t n e" |

( AMD CPUID 사양 , "CPUID Fn0000_0000_E"하위 섹션에서 가져옴)

EBX, EDX 및 ECX를 연결하면 얻을 수 AuthenticAMD있습니다.

Bash 및 기존 Unix 유틸리티가있는 경우 다음 명령을 사용하여 공급 업체를 쉽게 설정할 수 있습니다.

vm='WinXP'  # UUID works as well
# The vendor string needs to have 12 characters!
vendor='AuthenticAMD'
if [ ${#vendor} -ne 12 ]; then
    exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }

registers=(ebx edx ecx)
for (( i=0; i<${#vendor}; i+=4 )); do
    register=${registers[$(($i/4))]}
    value=`echo -n "${vendor:$i:4}" | ascii2hex`
    # set value to an empty string to reset the CPUID, i.e.
    # value=""
    for eax in 00000000 80000000; do
        key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
        vboxmanage setextradata "$vm" $key $value
    done
done

CPU 브랜드 문자열 설정

EAX가 80000002h, 80000003h, 80000004h 인 경우 CPUID는 브랜드 문자열의 ASCII 문자 16 개를 레지스터 EAX, EBX, ECX, EDX (총 3 * 16 = 48 자)로 반환합니다. 문자열은 널 문자로 종료됩니다 . 이 기능은 Pentium 4 프로세서와 함께 도입되었습니다. Pentium 4 프로세서에서 브랜드 문자열을 볼 수있는 방법은 다음과 같습니다.

| EAX Input Value | Return Values   | ASCII Equivalent |
|-----------------|-----------------|------------------|
| 80000002h       | EAX = 20202020h | "    "           |
|                 | EBX = 20202020h | "    "           |
|                 | ECX = 20202020h | "    "           |
|                 | EDX = 6E492020h | "nI  "           |
|-----------------|-----------------|------------------|
| 80000003h       | EAX = 286C6574h | "(let"           |
|                 | EBX = 50202952h | "P )R"           |
|                 | ECX = 69746E65h | "itne"           |
|                 | EDX = 52286D75h | "R(mu"           |
|-----------------|-----------------|------------------|
| 80000004h       | EAX = 20342029h | " 4 )"           |
|                 | EBX = 20555043h | " UPC"           |
|                 | ECX = 30303531h | "0051"           |
|                 | EDX = 007A484Dh | "☠zHM"           |
|-----------------|-----------------|------------------|

( Intel Architecture Instruction Set Extensions Programming Reference , 2.9, "CPUID Instruction", 표 2-30 참조) ☠은 널 문자 (숫자 값 0)입니다.

결과를 종합하면을 얻을 수 Intel(R) Pentium(R) 4 CPU 1500MHz☠있습니다.

Bash 및 기존 Unix 유틸리티가있는 경우 다음 명령을 사용하여 브랜드를 쉽게 설정할 수 있습니다.

vm='WinXP'  # UUID works as well
# The brand string needs to have 47 characters!
# The null terminator is added automatically
brand='              Intel(R) Pentium(R) 4 CPU 1500MHz'
if [ ${#brand} -ne 47 ]; then
    exit 1
fi
ascii2hex() { echo -n 0x; od -A n --endian little -t x4 | sed 's/ //g'; }

eax_values=(80000002 80000003 80000004)
registers=(edx ecx ebx eax)
for (( i=0; i<${#brand}; i+=4 )); do
    eax=${eax_values[$((${i} / 4 / 4))]}
    register=${registers[$((${i} / 4 % 4 ))]}
    key=VBoxInternal/CPUM/HostCPUID/${eax}/${register}
    value=`echo -n "${brand:$i:4}" | ascii2hex`
    # set value to an empty string to reset the CPUID, i.e.
    # value=""
    vboxmanage setextradata "$vm" $key $value
done

Windows 명령 프롬프트가있는 경우 다음 을 실행 하여 브랜드를 Intel(R) Core(TM)2 CPU 6600 @ 2.40 GHz1 로 설정할 수 있습니다 .

set vm=your-vm-name-or-uuid
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/eax 0x65746e49
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ebx 0x2952286c
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/ecx 0x726f4320
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000002/edx 0x4d542865
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/eax 0x43203229
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ebx 0x20205550
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/ecx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000003/edx 0x20202020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/eax 0x30303636
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ebx 0x20402020
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/ecx 0x30342e32
vboxmanage setextradata %vm% VBoxInternal/CPUM/HostCPUID/80000004/edx 0x007a4847

컴퓨터 : Intel (R) Core (TM) 2 CPU 6600 @ 2.40 GHz

1 개HostCPUID 값은 버추얼 버그 리포트에서 찍은 # 7865 .


감사. VERR_CFGM_INVALID_CHILD_PATH로 VM이 고장났습니다.
Ben Sinclair

1
sed는 G 플래그와 함께 사용해야합니다.'s/ //g'
Ben Sinclair

1
정말 좋은 답변입니다! Kaby Lake CPU가 등장하면서 Redmond의 특정 정책으로 인해 Windows 7을 지원하지 않기 때문에 갑자기 이것이 가장 흥미로워졌습니다 ... 누락 된 것은 "EAX = 1을 설정하는 방법에 대한 지침입니다. 프로세서 정보 및 기능 비트 "는 단순한 문자열이 아니기 때문에 (CPU 브랜드 만 있으면 CPU-Z는 여전히 CPU를 KL로 인식합니다); 누구 알아?
sxc731

1
forums.virtualbox.org/viewtopic.php?f=2&t=77211#p359428 ,이 값을 설정하는 더 나은 (더 간결하고, 더 지원) 방법이있을 수 있습니다.
마크 애 머리

@MarkAmery, 링크 주셔서 감사합니다. 벤더가 EAX 레지스터에 설정되어 있지 않고 --cpuid부속 명령에 EAX 레지스터 값이 필요 하기 때문에 브랜드에는 잘 작동하지만 벤더에게는 잘 작동하지 않습니다 .
Cristian Ciupitu

5

다음은 필요한 설정을 추측하지 않고 호스트 CPU를 특정 CPU로 정확하게 가장 할 수있는 방법입니다. 해당 호스트 CPU에서 VirtualBox를 실행하는 컴퓨터에 액세스해야 cpuid레지스터를 덤프 할 수 있습니다 (실제 CPU의 모델과 유사한 아키텍처를 선택하는 것이 가장 좋습니다). 당신이 한 사람이 없다면, 주위에 물어볼 수 있습니다 (예를 들어 Reddit에서 성공했습니다).

  1. 에뮬레이션하려는 CPU에서 "모델"파일을 만듭니다.

    vboxmanage list hostcpuids > i7_6600U
    
  2. 대상 호스트에서 수정하려는 VM이 ​​실행되고 있지 않은지 확인하십시오. 만일을 대비하여 백업을 원할 수도 있습니다.
  3. 다음 스크립트를 실행하여 모델 파일 ( i7_6600U여기)을 VBox VM 정의 ( 여기)에 로드 my_vm_name하십시오.

    #!/bin/bash
    vm=my_vm_name
    model_file=i7_6600U
    
    egrep -e '^[[:digit:]abcdef]{8} ' $model_file |
    while read -r line; do
        leaf="0x`echo $line | cut -f1 -d' '`"
        # VBox doesn't like applying leaves between the below boundaries so skip those:
        if [[ $leaf -lt 0x0b || $leaf -gt 0x17 ]]; then
            echo "Applying: $line"
            vboxmanage modifyvm $vm --cpuidset $line
        fi
    done
  4. 이제 VM을 실행하고 가장 된 CPU를 즐길 수 있습니다 (참고 : 위 스크립트를 한 번만 실행하면 됨).

CPU 가장 무도회를 롤백해야하는 경우 vboxmanage modifyvm $vm --cpuidremove $leaf위 루프의 각 리프에 사용할 수 있습니다 ( man vboxmanage친구입니다).

이것은 VBox 5.1.22를 실행하는 Ubuntu 17.04 호스트에서 Skylake one (i7_6600U)로 Kaby Lake CPU (i7_7500U)를 가장하여 몇 달 동안 완벽하게 작동했습니다. 해당 OS에 대해 위의 작은 bash 스크립트와 동등한 것을 만들 수 있다면 모든 호스트 OS에서 접근 방식이 작동해야합니다.


"CPU 공급 업체 문자열 설정"부분에 대해서는 의견이 있습니다. AMD CPU에서 공급 업체 이름을 "AuthenticAMD"로, Intel CPU에서 "GenuineIntel"로 변경해야합니다. AMD CPU에서 "GenuineIntel"을 사용하면 가상 머신이 손상 될 수 있습니다.
abulhol

정말 감사합니다! Ryzen 7700K의 매력처럼 작동했습니다. Ubuntu LiveCD를 실행하고 라이브 환경에 VirtualBox를 설치하고 vboxmanage 명령을 실행하여 이전 AMD Socket SF2 마더 보드를 사용하여 CPUID를 얻었습니다. 호스트 측에서는 Windows 10에서 Bash 프롬프트를 실행하고 공유 한 스크립트를 실행할 수 있도록 Linux 용 Windows 하위 시스템을 설치했습니다. 이제 Windows 7 VM을 속여 A8-5600K를 실행하고 있다고 생각할 수 있습니다.
njbair

이것도 당신을 위해 일하게되어 기쁩니다! 나는 이것 중 어느 것도 리눅스 호스트를 필요로하지 않는다는 것을 분명히했다. "모델"파일을 수집하지 않아도 해당 컴퓨터에서 실행되는 VirtualBox 만 있으면됩니다. bash 스크립트는 복잡해 보일 수 있지만 모델 파일에서 줄을 읽고 0000000band 00000017(포함) 사이의 나뭇잎을 건너 뛰고 하나씩 실행하기 만하면 vboxmanage modifyvm my_vm_name --cpuidset <line>됩니다. 일회성이므로 손으로 쉽게 수행 할 수 있습니다.
sxc731

어쨌든 호스트 컴퓨터에 WSL을 설치했으며 Ubuntu LiveCD는 이전 AMD 마더 보드를 가장 빠르게 회전시키는 방법이기 때문입니다.
njbair
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.