वर्चुअलबॉक्स, विशिष्ट CPU को अतिथि के लिए कैसे बाध्य किया जाए


14

मेरे पास VirtualBox में एक XP अतिथि है, विंडोज़ 8 होस्ट। अतिथि प्रोसेसर को पारदर्शी रूप से होस्ट (i5 2500k) के समान दिखाता है। हालाँकि अधिकांश इंस्टॉलर इस प्रोसेसर को नहीं पहचानते हैं और गैर-समर्थित प्रोसेसर को जारी रखने में विफल रहते हैं।

क्या यह पुराना प्रोसेसर है, यह सोचकर अतिथि को मूर्ख बनाने का कोई तरीका है? अगर मुझे सही से याद है कि VMWare में CPU मास्किंग फीचर था, तो क्या वर्चुअलबॉक्स में भी कुछ ऐसा ही है?


CPU मॉडल की जाँच करने वाला आप कौन सा सॉफ़्टवेयर स्थापित कर रहे हैं?
डार्थ Android

डबल एजेंट नियंत्रण, ओर्का और विक्स। यह एक VB6 परियोजना के लिए है जिसे हम पुनर्जीवित करने की कोशिश कर रहे हैं।
:४

जवाबों:


19

VirtualBox और CPUID मूल बातें

आपको VBoxInternal/CPUM/HostCPUIDवर्चुअल मशीन का एक्स्ट्राडेटा सेट करना होगा। यह अतिथि को CPUID निर्देश के लिए VirtualBox रिपोर्ट कस्टम परिणाम देगा । EAX रजिस्टर के मूल्य के आधार पर, यह निर्देश प्रोसेसर के बारे में जानकारी देता है - विक्रेता, प्रकार, परिवार, कदम, ब्रांड, कैश आकार, सुविधाएँ (MMX, SSE, SSE2, PAE, HTT), आदि जैसी चीज़ें। आप मेहमान को बेवकूफ बनाने की संभावना अधिक है।

आप vboxmanage setextradataवर्चुअल मशीन को कॉन्फ़िगर करने के लिए कमांड का उपयोग कर सकते हैं । उदाहरण के लिए,

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

ईबीएक्स रजिस्टर में सीपीयूआईडी 50202952₍₁₆₎ लौटाएगा, जब ईएएक्सएक्स को 80000003₍₁₆₎ पर सेट किया जाएगा। (अब से हेक्साडेसिमल नंबर 0xNN या NNh के रूप में लिखे जाएंगे।)

CPU विक्रेता स्ट्रिंग सेट करना

यदि EAX 0 (या AMD पर 80000000h) है, तो CPUID विक्रेता को EBC, 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

यदि आपके पास बैश और पारंपरिक यूनिक्स उपयोगिताओं हैं, तो आप निम्न आदेशों के साथ आसानी से विक्रेता को सेट कर सकते हैं:

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

सीपीयू ब्रांड स्ट्रिंग सेट करना

यदि EAX 80000002h, 80000003h, 80000004h है, तो CPUID रजिस्टर में ब्रांड स्ट्रिंग के 16 ASCII वर्ण EAX, EBX, ECX, EDX, कुल 3 * 16 = 48 वर्ण लौटाता है; स्ट्रिंग को एक अशक्त चरित्र के साथ समाप्त किया जाता है । ध्यान दें कि यह फीचर पेंटियम 4 प्रोसेसर के साथ पेश किया गया था। यह कैसे पेंटियम 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"           |
|-----------------|-----------------|------------------|

( इंटेल आर्किटेक्चर इंस्ट्रक्शन सेट एक्सटेंशन प्रोग्रामिंग संदर्भ से लिया गया , उपधारा 2.9, "सीपीयूआईडी इंस्ट्रक्शन", तालिका 2-30। character शून्य वर्ण है (संख्यात्मक मान 0)।)

यदि आप परिणाम एक साथ रखते हैं, तो आपको मिलेगा Intel(R) Pentium(R) 4 CPU 1500MHz☠

यदि आपके पास बैश और पारंपरिक यूनिक्स उपयोगिताओं हैं, तो आप आसानी से निम्नलिखित कमांड के साथ ब्रांड सेट कर सकते हैं:

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

कंप्यूटर: इंटेल (आर) कोर (टीएम) 2 सीपीयू 6600 @ 2.40 गीगाहर्ट्ज़

1HostCPUID मूल्यों से VirtualBox बग रिपोर्ट ले जाया गया # 7865


धन्यवाद। VERR_CFGM_INVALID_CHILD_PATH से मेरा VM टूट गया।
बेन सिनक्लेयर

1
जी फ्लैग के साथ सीड का इस्तेमाल करना पड़ता है:'s/ //g'
बेन सिंक्लेयर

1
क्या शानदार जवाब है! और केबी लेक सीपीयू के आगमन के साथ, यह रेडमंड की एक निश्चित नीति के कारण अचानक सबसे दिलचस्प हो गया है, उन पर विंडोज 7 का समर्थन नहीं करने के लिए ... ऐसा लगता है कि यह सब याद आ रहा है कि "EAX = 1: कैसे सेट करें प्रोसेसर की जानकारी और फीचर बिट्स "क्योंकि वे सरल तार नहीं हैं (केवल सीपीयू ब्रांड के साथ, सीपीयू-जेड अभी भी सीपीयू को केएल के रूप में पहचानता है); कोई जानता है?
sxc731

1
प्रति मंचों.virtualbox.org/viewtopic.php?f=2&t=77211#p359428 , इन मूल्यों को स्थापित करने का एक बेहतर (अधिक रसीला , अधिक समर्थित) तरीका हो सकता है।
मार्क एमी

@ मार्की, लिंक के लिए धन्यवाद। यह ब्रांड के लिए ठीक काम करता है, लेकिन विक्रेता के लिए इतना ठीक नहीं है क्योंकि विक्रेता ईएएक्स रजिस्टर में सेट नहीं होता है और --cpuidउपकमांड को ईएएक्स रजिस्टर के लिए एक मूल्य की आवश्यकता होती है।
क्रिस्टियन सियुपिटु

5

यहां एक दृष्टिकोण है जो मेजबान सीपीयू को एक विशिष्ट सीपीयू के रूप में सटीक रूप से बदलने की अनुमति देता है, बजाय आवश्यक सेटिंग्स का अनुमान लगाने के लिए। आपको उस होस्ट CPU पर वर्चुअलबॉक्स चलाने वाली मशीन तक पहुंच की आवश्यकता होगी ताकि आप उसके cpuidरजिस्टरों को डंप कर सकें (यह संभवतः एक आर्किटेक्चर चुनना सबसे अच्छा है जो मॉडल के रूप में आपके वास्तविक सीपीयू के समान है)। यदि आपके पास एक हाथ नहीं है, तो आप आसपास पूछ सकते हैं (मैंने उदाहरण के लिए रेडिट पर सफलता प्राप्त की है)।

  1. सीपीयू से एक "मॉडल" फ़ाइल बनाएं जिसका आप अनुकरण करना चाहते हैं:

    vboxmanage list hostcpuids > i7_6600U
    
  2. लक्ष्य होस्ट पर, सुनिश्चित करें कि आप जिस वीएम को संशोधित करना चाहते हैं वह चालू नहीं है; आप केवल मामले में बैकअप लेना चाह सकते हैं।
  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. यही है, अब आप अपना वीएम चला सकते हैं और सीपीयू का आनंद ले सकते हैं (ध्यान दें: आपको केवल एक बार उपरोक्त स्क्रिप्ट चलाने की आवश्यकता है)।

यदि आपको कभी सीपीयू मस्कारा को रोलबैक करने की आवश्यकता होती है, तो आप vboxmanage modifyvm $vm --cpuidremove $leafउपरोक्त लूप में पत्तियों में से प्रत्येक के लिए उपयोग कर सकते हैं ( man vboxmanageजो आपका मित्र है)।

यह मेरे लिए कुछ महीनों से त्रुटिपूर्ण रूप से काम कर रहा है, एक काबे लेक सीपीयू (i7_7500U) को स्काइलेक वन (i7_6600U) के रूप में उबंटू 17.04 होस्ट पर VBox 5.1.22 चला रहा है। दृष्टिकोण किसी भी होस्ट ओएस पर काम करना चाहिए, बशर्ते आप उस ओएस के लिए थोड़ी बैश स्क्रिप्ट के बराबर बना सकते हैं।


"सीपीयू विक्रेता स्ट्रिंग सेट करना" भाग के बारे में, मेरी एक टिप्पणी है: आपको AMD CPU पर "AuthenticAMD" और Intel CPU पर "निचले स्तर" के लिए विक्रेता का नाम बदलना सुनिश्चित करना चाहिए। यदि आप एक एएमडी सीपीयू पर "जेन्युइनइंटेल" का उपयोग करते हैं, तो वर्चुअल मशीन बहुत संभवतः टूट जाएगी।
abulhol

इस लिए आपका बहुत - बहुत धन्यवाद! इसने मेरे राइजेन 7700K पर एक आकर्षण की तरह काम किया। मैंने एक पुराने AMD सॉकेट SF2 मदरबोर्ड का उपयोग करके UbuntuID चलाकर, CPU को लाइव वातावरण में वर्चुअलबॉक्स स्थापित करके और vboxmanage कमांड चलाकर CPUID प्राप्त किया। होस्ट की तरफ, मैंने लिनक्स के लिए विंडोज सबसिस्टम स्थापित किया ताकि मैं विंडोज 10 में बैश प्रॉम्प्ट चला सकूं और आपके द्वारा साझा की गई स्क्रिप्ट चला सकूं। अब मैं अपने विंडोज 7 वीएम को यह सोचने में सक्षम कर रहा हूं कि मैं A8-5600K चला रहा हूं।
njbair

खुशी है कि यह आपके लिए भी काम करता है! मुझे स्पष्ट करना चाहिए था कि इसमें से किसी को लिनक्स होस्ट की आवश्यकता नहीं है; यहां तक ​​कि "मॉडल" फ़ाइल को इकट्ठा करना भी नहीं चाहिए, इसके लिए सभी आवश्यक वर्चुअलबॉक्स उस मशीन पर चल रहा है। बैश स्क्रिप्ट जटिल लग सकता है लेकिन सभी यह करता है बंद मॉडल फ़ाइल लाइनों को पढ़ रहा है, के बीच पत्तियों लंघन 0000000bऔर 00000017(सम्मिलित) और उन्हें एक के बाद एक के माध्यम से चल vboxmanage modifyvm my_vm_name --cpuidset <line>तो यह आसानी से हाथ से किया जा सकता है के रूप में यह एक बंद है।
sxc731

कोई बड़ी बात नहीं है, मैंने वैसे भी होस्ट कंप्यूटर पर WSL स्थापित किया था, और उबंटू LiveCD सिर्फ इसलिए था क्योंकि यह पुराने AMD मदरबोर्ड को स्पिन करने का सबसे तेज तरीका था।
njbair
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.