ใน Hyper-V คุณสามารถกำหนดค่าตัวเลือกการเริ่มต้นและปิดการทำงานอัตโนมัติสำหรับเครื่องเสมือนของคุณเมื่อบูทหรือรีสตาร์ทโฮสต์ OS ในบทความนี้ เราจะแสดงวิธีกำหนดค่าการดำเนินการที่ Hyper-V Host ควรทำกับ Virtual Machines เมื่อเปิดเครื่องหรือปิดเครื่องอย่างถูกต้อง และวิธีตั้งค่า Boot Order ของ Virtual Machines
กำหนดค่า Automatic Startup และ Shutdown Action สำหรับ Hyper-V Virtual Machines
โดยค่าเริ่มต้น Hyper-V Host จะบันทึกสถานะของ Virtual Machines ที่ลงทะเบียนเมื่อรีสตาร์ท หมายความว่าหาก VM กำลังทำงานก่อนรีสตาร์ท Hyper-V จะเริ่มมันอัตโนมัติ การตั้งค่า Automatic Startup ถูกกำหนดค่าสำหรับแต่ละ VM แยกกัน
รันคอนโซล Hyper-V เปิดคุณสมบัติของ VM ใดๆ และไปที่ Settings -> Automatic Start Action มี 3 ตัวเลือกในการจัดการ Automatic Startup ของ Virtual Machine:
- Nothing – เมื่อโฮสต์เริ่มต้น Virtual Machine จะไม่เริ่มต้นอัตโนมัติ (ไม่ว่าสถานะก่อนหน้าจะเป็นอย่างไร)
- Automatically start if it was running when the service stopped – VM จะเริ่มต้นอัตโนมัติเฉพาะถ้ามันกำลังทำงานก่อนการปิด/รีสตาร์ทโฮสต์
- Always start this virtual machine automatically – เริ่ม Virtual Machine นี้ทุกครั้งเมื่อ Hyper-V Host บูท
มีพารามิเตอร์เพิ่มเติม 1 ตัวสำหรับตัวเลือกสุดท้าย – Startup Delay ที่นี่คุณสามารถระบุเวลาล่าช้าการเริ่มต้นของ Virtual Machine (เป็นวินาที) โดยใช้ Delay คุณสามารถจัดการ Boot Order ของ Virtual Machines ของคุณ (เช่น บูท Domain Controller ก่อนเริ่ม VM ที่มี SQL Server) และลดโหลดบน Storage เนื่องจากเริ่ม VM หลายตัวทีละตัว

น่าสนใจที่ใน Windows Admin Center (WAC) ยังไม่มีตัวเลือกในการจัดการ Automatic Startup ของ Hyper-V Virtual Machines
นอกจากนี้ ในส่วน Automatic Stop Action คุณสามารถตั้งค่าได้ว่าจะทำอะไรกับ Virtual Machines ของคุณหากโฮสต์ถูกปิดหรือรีสตาร์ท
การตั้งค่านี้หมายถึงการรีสตาร์ท Hyper-V Host อย่างถูกต้องเมื่อ Virtual Machines มีเวลาปิดเครื่องอย่างถูกต้อง (Graceful Shutdown) ไม่เหมือนสถานการณ์ฉุกเฉิน (Power Outage ไม่คาดคิด, BSOD)
- Save the virtual machine state – บันทึกสถานะเต็มของ Virtual Machine (รวมถึงหน่วยความจำ) ที่การเริ่มต้นครั้งต่อไป VM จะ Resume จากจุดนี้ โปรดทราบว่าคุณต้องมีพื้นที่ว่างเพิ่มเติมบนดิสก์เพื่อเก็บหน่วยความจำ VM (*.BIN files) Guest OS ไม่ได้รีสตาร์ท;
- Turn off the virtual machine – เมื่อ Hyper-V Host ถูกปิด Virtual Machine จะถูกหยุดเช่นกัน (ในลักษณะเดียวกับคอมพิวเตอร์ทางกายภาพถูกปิด) สถานะ VM ไม่ได้ถูกบันทึก Guest OS จะเริ่มต้นด้วยรอบบูทเต็ม ในโหมดนี้ มีความเสี่ยงบางส่วนในการได้ข้อมูลที่ไม่สอดคล้องในแอปที่รันใน VM
- Shutdown the guest operating system – Guest OS ถูกปิดโดยใช้ Hyper-V Integration Service (Graceful Shutdown) แอปทั้งหมดที่รันใน VM ถูกหยุด และความเสี่ยงของข้อมูลที่ไม่สอดคล้องต่ำมาก

คุณสามารถดูและเปลี่ยนการตั้งค่า Automatic Startup และ Shutdown ของ Hyper-V VMs ของคุณโดยใช้ PowerShell
แสดงการตั้งค่า Startup และ Shutdown ปัจจุบันของ VMs ทั้งหมด:
Get-VM –VMname * | Select-Object VMname,AutomaticStartAction,AutomaticStartDelay,AutomaticStopAction

คุณสามารถเปลี่ยนการตั้งค่า Automatic Startup ของ VM โดยใช้ตัวเลือก AutomaticStartAction ค่าที่เป็นไปได้คือ Nothing, StartIfRunning, Start
Get-VM –VMname lon-win10| Set-VM –AutomaticStartAction Start
คุณสามารถใช้ PowerShell เพื่อกำหนดค่าการตั้งค่า Virtual Machine บนโฮสต์ Windows Hyper-V Server ฟรีที่ไม่มี GUI
เพื่อตั้งค่า Startup Delay สำหรับ VMs ทั้งหมดยกเว้น VM หนึ่ง (เช่น Domain Controller ที่มีบทบาท FSMO):
Get-VM –VMname * | Where-object –FilterScript {$_.vmname –notlike "lon-dc*"} | Set-VM –AutomaticStartDelay 90
โดยใช้ตัวเลือก –AutomaticStopAction คุณสามารถตั้งค่าการปิด VM (Save, TurnOff, ShutDown)
Boot (Startup) Order ของ Hyper-V Virtual Machines
เมื่อเริ่มต้น Standalone Hyper-V Host ผู้ดูแลระบบต้องจัดการ Startup Order ของ Virtual Machines บนมัน ตัวอย่างเช่น คุณต้องการให้ Exchange VM บูทหลังจาก Domain Controller พร้อมใช้งาน และ App Server เริ่มหลัง Database Server Hyper-V ไม่มีเครื่องมือในตัวสำหรับจัดการ Startup Order ของ Virtual Machines ยกเว้นตัวเลือก Start Delay (AutomaticStartDelay)
ในกรณีที่เรียบง่ายที่สุด คุณสามารถกำหนดค่า Order ของ VM Startup โดยการตั้งค่า Startup Delays ที่ต่างกันสำหรับพวกเขา:
Get-VM –VMname lon-dc01| Set-VM –AutomaticStartDelay 0
Get-VM –VMname lon-exch1,lon-db01 | Set-VM –AutomaticStartDelay 90
Get-VM –VMname lon-rds01,lon-app01 | Set-VM –AutomaticStartDelay 180
อีกวิธีหนึ่งคือเริ่ม VMs ทีละตัวโดยใช้ PowerShell Startup Script ในสคริปต์ คุณสามารถตั้งค่า Delay ก่อนเริ่ม VM ถัดไป และทำการตรวจสอบเพิ่มเติมสำหรับความพร้อมใช้งานของแอปพลิเคชันหรือบริการใน VM (เพื่อให้แน่ใจว่าแอปหรือบริการได้เริ่มต้นแล้ว) เพื่อความสะดวก คุณสามารถรวม VMs หลายตัวเป็นกลุ่มโดยใช้ Tags ตัวอย่างเช่น ผมตั้ง Tags ต่อไปนี้สำหรับ VMs:
set-vm lon-dc01,lon-dc02 -Notes "Boot order 1"
set-vm lon-exch1, lon-db01 -Notes "Boot order 2"
set-vm lon-rds01,lon-app01 -Notes "Boot order 3"

สคริปต์ PowerShell ต่อไปนี้เริ่ม Virtual Machines ในลำดับเฉพาะ และรันการตรวจสอบความพร้อมใช้งานเพิ่มเติมสำหรับบริการบางอย่าง (TCP Ports) ใน VM โดยใช้ PowerShell cmdlet Test-NetConnection:
$VMtoStart = Get-VM | where notes -contains 'Boot order 1'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}
While (!(Test-NetConnection lon-dc01 -Port 445 -WarningAction SilentlyContinue).tcpTestSucceeded ){
Start-Sleep 30
}
$VMtoStart = Get-VM | where notes -contains 'Boot order 2'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}
While ((Test-NetConnection lon-exch1 -Port 25 -WarningAction SilentlyContinue).tcpTestSucceeded ){
Start-Sleep 30
}
$VMtoStart = Get-VM | where notes -contains 'Boot order 3'
foreach ($cn in $VMtoStart)
{Start-VM $cn.name -asjob}
จากนั้นเพิ่มสคริปต์ PowerShell เข้า Autostart หรือรันมันโดยใช้ Task Scheduler (อย่าลืมปิด Automatic Startup สำหรับ VMs ทั้งหมดที่เริ่มต้นโดยสคริปต์นี้) จำไว้ว่าการรันสคริปต์ PowerShell ถูกจำกัดใน Windows โดยค่าเริ่มต้น หากจำเป็น ให้ลงนามสคริปต์ PS1 หรือเปลี่ยน PowerShell Script Execution Policy