gcp:磁盘*完成*安装后我无法通过 ssh 连接到我的实例
gcp: after disk is *finished* mounting I cannot ssh to my instance
在 Google 磁盘 完成 安装后的云平台 (GCP) 中,我无法通过 ssh 连接到我的实例。
详情:
通过 google cloud sdk shell cmd windows 在 windows 7 PC I 运行 C:\>
上的以下内容:
python "C:\Users\user's name\path\to\py\create_instance_working.py" --name inst-test2 --zone us-central1-a direct-to
pic-1234 cc-test1
其中 运行s create_instance_working.py
,看起来像这样:
import argparse
import os
import time
import googleapiclient.discovery
from six.moves import input
# [START list_instances]
def list_instances(compute, project, zone):
result = compute.instances().list(project=project, zone=zone).execute()
return result['items']
# [END list_instances]
# [START create_instance]
def create_instance(compute, project, zone, name, bucket):
image_response = compute.images().getFromFamily(
project='direct-topic-1234', family='theFam').execute()
source_disk_image = image_response['selfLink']
machine_type = "projects/direct-topic-1234/zones/us-central1-a/machineTypes/n1-standard-4"
startup_script = open(
os.path.join(
os.path.dirname(__file__), 'startup-script_working.sh'), 'r').read()
print(machine_type)
config = {
'name': name,
'machineType': machine_type,
'disks': [
{
'boot': True,
'autoDelete': True,
'initializeParams': {
'sourceImage': source_disk_image,
'diskSizeGb': '15',
}
}, {
"deviceName": "disk-2",
"index": 1,
"interface": "SCSI",
"kind": "compute#attachedDisk",
"mode": "READ_WRITE",
"source": "projects/direct-topic-1234/zones/us-central1-a/disks/disk-2",
"type": "PERSISTENT"
}
],
'networkInterfaces': [{
'network': 'global/networks/default',
'accessConfigs': [
{'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
]
}],
"serviceAccounts": [
{
"email": "123456789-compute@developer.gserviceaccount.com",
"scopes": [
"https://www.googleapis.com/auth/devstorage.read_only",
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring.write",
"https://www.googleapis.com/auth/servicecontrol",
"https://www.googleapis.com/auth/service.management.readonly",
"https://www.googleapis.com/auth/trace.append"
]
}
],
'metadata': {
'items': [{
'key': 'startup-script',
'value': startup_script
}, {
'key': 'bucket',
'value': bucket
}]
}
}
return compute.instances().insert(
project=project,
zone=zone,
body=config).execute()
# [END create_instance]
# [START delete_instance]
def delete_instance(compute, project, zone, name):
return compute.instances().delete(
project=project,
zone=zone,
instance=name).execute()
# [END delete_instance]
# [START wait_for_operation]
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
if 'error' in result:
raise Exception(result['error'])
return result
time.sleep(1)
# [END wait_for_operation]
# [START run]
def main(project, bucket, zone, instance_name, wait=True):
compute = googleapiclient.discovery.build('compute', 'v1')
print('Creating instance.')
operation = create_instance(compute, project, zone, instance_name, bucket)
wait_for_operation(compute, project, zone, operation['name'])
instances = list_instances(compute, project, zone)
print('Instances in project %s and zone %s:' % (project, zone))
for instance in instances:
print(' - ' + instance['name'])
print("""
Instance created.
It will take a minute or two for the instance to complete work.
Check this URL: http://storage.googleapis.com/{}/output.png
Once the image is uploaded press enter to delete the instance.
""".format(bucket))
# if wait:
# input()
#
# print('Deleting instance.')
#
# operation = delete_instance(compute, project, zone, instance_name)
# wait_for_operation(compute, project, zone, operation['name'])
print('all done with instance.')
if __name__ == '__main__':
print('in here 3')
main('direct-topic-1234', 'cc-test1', 'us-central1-a', 'inst-test1')
print('in here 4')
# [END run]
它调用如下所示的启动脚本 (startup-script_working.sh
):
sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
sudo mount -o discard,defaults /dev/sdb /var
sudo chmod a+w /var
sudo cp /etc/fstab /etc/fstab.backup
echo UUID=`sudo blkid -s UUID -o value /dev/sdb` /var ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
两者均改编自:
在 GCP 控制台中,当我看到实例绿灯时,我立即单击实例 ssh
按钮并成功连接到实例。但是,如果我继续打开与实例的新 ssh 连接,它们都会工作,直到我在 /var
上的挂载完成。通过在有效的 ssh 连接(通常是第一个连接)中查找它,我看到挂载已完成,方法是:df -h
。我可以看到 /dev/sdb 197G 60M 197G 1% /var
。在 mount 没有出现的失败尝试之前。但是在它出现之后,没有任何东西会连接到它。尝试在控制台中执行 >_
按钮 (shell) gcloud compute ssh [instance name]
。尝试使用 [user name]@[external IP]
.
的腻子
我试过只等 5 分钟通过 ssh 连接到实例(届时挂载将完成),这也不起作用。
重要提示:
如果我注释掉所有启动脚本行,我可以无限期地连接,没有 SSH
问题。我试过创建一个新磁盘并附加它。
看来是磁盘挂载导致了 ssh 问题。
早期的 ssh 连接继续正常运行,即使我无法创建新连接。
当 ssh 连接失败时,我在 ssh window 中得到这个:
“连接失败
与 SSH 服务器通信时发生错误。检查服务器和网络配置。"
知道是什么原因造成的吗?
实例是 linux 发行版 SUSE 12
我的安装说明来自这里:
https://cloud.google.com/compute/docs/disks/add-persistent-disk
如果有什么好的方法可以避免这种情况(请提供),但我真的很想知道我做错了什么。
我是 GCP、云、python、ssh 和 Linux 的新手。 (这个问题的一切都是新的!)
如果我注释掉启动脚本行,运行一切如描述,ssh到保险,运行手动启动脚本命令,我没有错误,up o仍然需要测试之后我是否创建另一个 ssh 连接。我们这样做并报告。
在 /var
上挂载,其中包含与 ssh
相关的数据(除其他外)使得到达 /var
的系统看到一个空白磁盘。数据必须保存在别处(cp -ar
),挂载到var,然后再把数据移回去。
我之前的回答是错误的。
在 Google 磁盘 完成 安装后的云平台 (GCP) 中,我无法通过 ssh 连接到我的实例。
详情:
通过 google cloud sdk shell cmd windows 在 windows 7 PC I 运行 C:\>
上的以下内容:
python "C:\Users\user's name\path\to\py\create_instance_working.py" --name inst-test2 --zone us-central1-a direct-to
pic-1234 cc-test1
其中 运行s create_instance_working.py
,看起来像这样:
import argparse
import os
import time
import googleapiclient.discovery
from six.moves import input
# [START list_instances]
def list_instances(compute, project, zone):
result = compute.instances().list(project=project, zone=zone).execute()
return result['items']
# [END list_instances]
# [START create_instance]
def create_instance(compute, project, zone, name, bucket):
image_response = compute.images().getFromFamily(
project='direct-topic-1234', family='theFam').execute()
source_disk_image = image_response['selfLink']
machine_type = "projects/direct-topic-1234/zones/us-central1-a/machineTypes/n1-standard-4"
startup_script = open(
os.path.join(
os.path.dirname(__file__), 'startup-script_working.sh'), 'r').read()
print(machine_type)
config = {
'name': name,
'machineType': machine_type,
'disks': [
{
'boot': True,
'autoDelete': True,
'initializeParams': {
'sourceImage': source_disk_image,
'diskSizeGb': '15',
}
}, {
"deviceName": "disk-2",
"index": 1,
"interface": "SCSI",
"kind": "compute#attachedDisk",
"mode": "READ_WRITE",
"source": "projects/direct-topic-1234/zones/us-central1-a/disks/disk-2",
"type": "PERSISTENT"
}
],
'networkInterfaces': [{
'network': 'global/networks/default',
'accessConfigs': [
{'type': 'ONE_TO_ONE_NAT', 'name': 'External NAT'}
]
}],
"serviceAccounts": [
{
"email": "123456789-compute@developer.gserviceaccount.com",
"scopes": [
"https://www.googleapis.com/auth/devstorage.read_only",
"https://www.googleapis.com/auth/logging.write",
"https://www.googleapis.com/auth/monitoring.write",
"https://www.googleapis.com/auth/servicecontrol",
"https://www.googleapis.com/auth/service.management.readonly",
"https://www.googleapis.com/auth/trace.append"
]
}
],
'metadata': {
'items': [{
'key': 'startup-script',
'value': startup_script
}, {
'key': 'bucket',
'value': bucket
}]
}
}
return compute.instances().insert(
project=project,
zone=zone,
body=config).execute()
# [END create_instance]
# [START delete_instance]
def delete_instance(compute, project, zone, name):
return compute.instances().delete(
project=project,
zone=zone,
instance=name).execute()
# [END delete_instance]
# [START wait_for_operation]
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
if 'error' in result:
raise Exception(result['error'])
return result
time.sleep(1)
# [END wait_for_operation]
# [START run]
def main(project, bucket, zone, instance_name, wait=True):
compute = googleapiclient.discovery.build('compute', 'v1')
print('Creating instance.')
operation = create_instance(compute, project, zone, instance_name, bucket)
wait_for_operation(compute, project, zone, operation['name'])
instances = list_instances(compute, project, zone)
print('Instances in project %s and zone %s:' % (project, zone))
for instance in instances:
print(' - ' + instance['name'])
print("""
Instance created.
It will take a minute or two for the instance to complete work.
Check this URL: http://storage.googleapis.com/{}/output.png
Once the image is uploaded press enter to delete the instance.
""".format(bucket))
# if wait:
# input()
#
# print('Deleting instance.')
#
# operation = delete_instance(compute, project, zone, instance_name)
# wait_for_operation(compute, project, zone, operation['name'])
print('all done with instance.')
if __name__ == '__main__':
print('in here 3')
main('direct-topic-1234', 'cc-test1', 'us-central1-a', 'inst-test1')
print('in here 4')
# [END run]
它调用如下所示的启动脚本 (startup-script_working.sh
):
sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb
sudo mount -o discard,defaults /dev/sdb /var
sudo chmod a+w /var
sudo cp /etc/fstab /etc/fstab.backup
echo UUID=`sudo blkid -s UUID -o value /dev/sdb` /var ext4 discard,defaults,nofail 0 2 | sudo tee -a /etc/fstab
两者均改编自:
在 GCP 控制台中,当我看到实例绿灯时,我立即单击实例 ssh
按钮并成功连接到实例。但是,如果我继续打开与实例的新 ssh 连接,它们都会工作,直到我在 /var
上的挂载完成。通过在有效的 ssh 连接(通常是第一个连接)中查找它,我看到挂载已完成,方法是:df -h
。我可以看到 /dev/sdb 197G 60M 197G 1% /var
。在 mount 没有出现的失败尝试之前。但是在它出现之后,没有任何东西会连接到它。尝试在控制台中执行 >_
按钮 (shell) gcloud compute ssh [instance name]
。尝试使用 [user name]@[external IP]
.
我试过只等 5 分钟通过 ssh 连接到实例(届时挂载将完成),这也不起作用。
重要提示: 如果我注释掉所有启动脚本行,我可以无限期地连接,没有 SSH 问题。我试过创建一个新磁盘并附加它。
看来是磁盘挂载导致了 ssh 问题。
早期的 ssh 连接继续正常运行,即使我无法创建新连接。
当 ssh 连接失败时,我在 ssh window 中得到这个: “连接失败
与 SSH 服务器通信时发生错误。检查服务器和网络配置。"
知道是什么原因造成的吗?
实例是 linux 发行版 SUSE 12
我的安装说明来自这里:
https://cloud.google.com/compute/docs/disks/add-persistent-disk
如果有什么好的方法可以避免这种情况(请提供),但我真的很想知道我做错了什么。
我是 GCP、云、python、ssh 和 Linux 的新手。 (这个问题的一切都是新的!)
如果我注释掉启动脚本行,运行一切如描述,ssh到保险,运行手动启动脚本命令,我没有错误,up o仍然需要测试之后我是否创建另一个 ssh 连接。我们这样做并报告。
在 /var
上挂载,其中包含与 ssh
相关的数据(除其他外)使得到达 /var
的系统看到一个空白磁盘。数据必须保存在别处(cp -ar
),挂载到var,然后再把数据移回去。
我之前的回答是错误的。