0

我試圖從當前持有磁盤的已停止實例中分離磁盤。這是我目前正在做的事情。從停止的實例中分離磁盤

def detach_disk_from_instance(disk_name, zone=GCLOUD_ZONE): 
    disk_info = get_disk_info(disk_name=disk_name, zone=zone) 
    if disk_info.get('users'): 
     instance_name = disk_info['users'][0].rsplit('/').pop() 
     logger.info("detatching disk : {} from instance : {}".format(disk_name, instance_name)) 
     request = compute.instances().detachDisk(
      project=GCLOUD_PROJECT_NAME, zone=zone, instance=instance_name, deviceName=disk_name) 
     return make_http_request(request, {}) 

def wait_for_operation(operation, zone=GCLOUD_ZONE, worker=1): 
    logger.info('Waiting for operation {} to finish...'.format(operation)) 
    with ThreadPoolExecutor(worker) as executor: 
     future = executor.submit(_check_operation_status, operation=operation, zone=zone) 
     wait([future]) 
     return future.result() 

req = detach_disk_from_instance(disk_name='test-disk') 
wait_for_operation(operation=req['name']) 

上面的代碼工作,如果持有磁盤的實例當前正在運行。 ,但如果實例停止,它不起作用。當我嘗試從停止的實例中分離磁盤時,出現以下錯誤。

{ '錯誤':[{ '信息': '代碼' 「與設備名稱 '測試盤' 沒有發現連接的磁盤」: 'INVALID_USAGE'}]}

和我向你保證,磁盤仍然附着在實例上,gcp儀表板也顯示了這一點。

回答

0

TL; DR - 傳遞磁盤資源的name而不是device name,通過該磁盤將磁盤連接到實例。

在將磁盤附加到VM實例的instances.attachDisk請求中,可以在請求的deviceName字段中指定設備名稱。

DEVICENAME

指定 被反射到在/ dev /磁盤/副ID/google- *樹一個Linux 工作的您選擇的唯一的設備名系統在實例中運行。此名稱可用於 引用該設備的安裝,調整大小等,從 以內的實例。

如果沒有指定,服務器選擇一個默認的設備名稱適用於 該磁盤,形式持久磁盤-x,其中x是由谷歌Compute Engine的分配一個編號 。該字段僅適用於持久性磁盤 。

您將需要使用此名稱作爲instances.detachDisk請求的deviceName查詢參數。

必要查詢參數

DEVICENAME

磁盤設備名稱分離。

如文檔中提到,如果您同時連接磁盤GCE形式persistent-disks-x生成一個設備名稱,你必須指定這個名字沒有指定設備名稱。