2021年6月24日 星期四

Vultr上的虛擬電腦VPS(二), 自安裝windows用snapshot不能開機解決法

因為我是在雲端虛擬電腦上自己安裝windows系統,

並且用API控制其伺服器在特定時間建立、移除以節省每月的使用金額,

這時候就需要搭配快照(Snapshot)來做到快速保存移除前的狀態

vultr平台還有一點很棒的地方就是它的Snapshot免費!!

本篇文基於主要處理用Snapshot不能開機自安裝windows解決方式,

所以關於API的python範例碼與相應的網站解說我會放在最後


這流程我卡關了兩個禮拜多.......

某天忽然跑得很順的模式就忽然開不了機!

遍尋不著解法的我就每天像鬼打牆一般的一直try&error

打算在免費測試到期前還是不行就不使用了!

沒想到在到期的前一天讓我熬夜搞定!!!(奇蹟!)

廢話不多說下面是正文~~~


總結不能開機的原因是驅動遺失.....

處理步驟上是:

1.搜尋並上傳virtio-win 的stable ISO檔連結到vultr平台(如下圖)

 virtio-win下載點:https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md

選Stable版的ISO檔, 右鍵點選複製連結

到自己的vultr平台帳號中的ISO區點擊下方圖示的添加ISO部分貼上網址即可

(注意vultr只提供兩個ISO檔案的存放, 超過請自行斟酌移除)



2.用不能開機的Snapshot創建一台虛擬電腦Instance

創建完後在該Instance選單中的settings => custom ISO點擊剛剛上傳的ISO檔

然後點擊附加並重啟裝置(Attach ISO and Reboot)


3.用View Console觀測Instance畫面, 此時應該卡在藍色的疑難排解的安全系統畫面

點擊進入執行命令提示字元的選項

在命令提示字元中先鍵入"notepad"按Enter, 再一次鍵入"notepad" 輸入

確定可以在開啟的notepad的【開啟舊檔】功能裡看到剛剛附加的光碟檔路徑(應該在D槽)

然後依次在命令提示字元中輸入下面這指令:

PNPUTIL /add-driver  D:\viostor\w10\amd64\viostor.inf /install

按Enter, 等待跑完後再輸入下面的指令

DISM /Image:E:\ /Add-Driver /Driver:D:\viostor\w10\amd64\viostor.inf

按Enter

(上述動作再完成前沒擷取畫面.....請盡量自行領會!)


4.就可以離開疑難排解的安全系統重開機了

重開機後應該就可以順利登入, 

登入後開啟裝置管理員

把沒有抓到的裝置重新蒐尋驅動到剛剛的光碟檔案即可!


用上述方式可以登入的主機, 

之後再使用快照功能後, 為確保每次都能開機成功, 

請每次創建完系統後都用要附加剛剛的驅動ISO, 就可直接登入了!


最後的API使用範例, 我以Snapshot Create Instance功能為範例

前置動作是要去帳號中開通API功能並得到API Key

下面貼上python的程式碼給大家參考, 還有網站的範例截圖

(請將有中文的部分置換成各自的參數)

相信有點底子的人能夠自行摸索與融會貫通.....

祝大家都能平順使用~


程式碼: 

# -*- coding: utf-8 -*-

"""

Created on Wed Jun  2 10:18:11 2021

@author: Saxon

"""

import requests

api_key = "輸入你的API Key"

name = "輸入你想要給裝置的名稱"

SnapshotID = "輸入你快照的ID"

url = "https://api.vultr.com/v2/instances"

headers = {"Authorization": "Bearer {}".format(api_key),

           "Content-Type": "application/json"}

data = {

    "region" : "nrt", 

    "plan" : "vhf-2c-2gb", 

    "label" : name,

    "enable_ipv6" : "true",

    "enable_private_network" : "true",

    "snapshot_id" : SnapshotID

}

response = requests.post(url, json=data, headers=headers)