有一些镜像制作的时候,只允许使用ssh登陆。所以一般创建虚拟机时,我们会将自己的公钥通过ec2的meta服务写入虚拟机,而后在本地通过和公钥一起生成的私钥登陆。
但是,既然是钥匙,就具备了“丢“
的属性,如果我们丢失了本地的私钥,那不就不能登陆虚拟机了?其实倒也不至于不能登陆,只是费事一点罢了。
原理是这样:你需要将本虚拟机的云硬盘(volume)断开,将云硬盘作为数据卷挂载到另一台虚拟机上,然后修改 authorized_keys 文件,将云硬盘挂载回原虚拟机,重启虚拟机即可。
Note:本教程适用的虚拟机必须是从云硬盘创建的,从镜像或者快照创建的请参考丢失私有密钥时连接到虚拟机(2)
###具体步骤
- 暂停虚拟机,点击左侧导航栏的云硬盘,选择本机A的云硬盘,将其从本机断开
- 还是在云硬盘的目录,将此云硬盘挂载到另一台虚拟机B
登陆到虚拟机B,执行
lsblk
,命令确定volume是否已分区ubuntu@key-test1:~$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 10G 0 disk └─vda1 253:1 0 10G 0 part / vdb 253:16 0 10G 0 disk └─vdb1 253:17 0 10G 0 part
截图中已经说明,
在设备/dev/vdb上连接到key_test1
,所以最后一行的vdb1
就是我们挂载过来的云硬盘。创建临时目录以安装volume
ubuntu@key-test1:~$ sudo mkdir /mnt/tempvol
使用之前确定的volume名称或设备名称在临时安装点安装volume(或分区)
ubuntu@key-test1:~$ sudo mount /dev/vdb1 /mnt/tempvol
这样你进入
/mnt/tempvol
目录就是进入了挂载的云硬盘,修改authorized_keys
文件,删除失效的public_key
,添加新的public_key
ubuntu@key-test1:~$ vim /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
修改完成后,卸载已连接的volume,以将其重新连接至原始实例
ubuntu@key-test1:~$ sudo umount /mnt/tempvol
Note:卸载时可能会出现设备忙的告警,多试几次即可
回到openstack
的控制面,将云硬盘重新挂载到机器A,启动机器A即可从拥有私钥的那台机器上登陆