Copilot帮我救回了变砖的甲骨文实例

发布时间:2023年12月19日

? ? ? ? 最近,我的一个美国凤凰城的甲骨文永久免费的amd实例失联了,主要原因东西装多了就反应慢了,还常常断线,寻思干脆 dd个新的系统算了,但dd就后悔了,原来那些开放的端口都关闭了,仅留了一个ssh服务的22端口,于是就开始折腾,终于,在第三次dd后就失联变砖了。

图1.失联的实例在ssh终端上连接时的反应

? ? ? ? 这是个最基础的amd实例,是永久免费的,如果终止它直接放弃还是有些心不甘,再说现在申请也不一定能申请到。所以决定救砖。

? ? ? ? 甲骨文实例的救砖最有效方法的就是用另一个同区的实例挂上失联实例的引导卷,再在引导卷上安装新的系统,最后再把引导卷还原到失联的实例上,重新用新的系统引导,让失联的实例恢复联系。我就采用这个救砖方案。由于本人对linux不熟悉,准备让windows 11的人工智能机器人Copilot参与救砖,同时也看看它到底有多智能。

? ? ? ? 我的实例变砖过程让我对网上dd系统映像文件的纯净性产生了怀疑,谁都不知道选择的系统映像文件有没有后门, 也许你dd的系统除你以外还存在一个影子用户,他随时能登录你的系统。而且都说dd后系统的稳定性也较原来差多了,失联变砖的可能也变大了。因此我决定要找个真正纯净的系统重新安装。这个容易,在ubuntu的官网上有很多版本的系统映像文件供我们选择,可以用网站的finder选择合适你的系统,但甲骨文的只有4个文件,总之选个你熟悉能用的就好。 ubuntu的官方映像文件的下载网址:

https://ubuntu.com/server/docs/tutorials#download

图2、ubuntu官网上的部分(22.04版本)系统文件列表

? ? ? ??就甲骨文实例的抢救方案我咨询了一下copilot,我选择了两种样式来比较,一种是精确样式,一种是更有创造力样式,两种回答的结果见图3.和图4.紫色的是更有创造力样式,蓝绿色的是精确。

图3.更有创造力样式的回答? ?

?

?图4.精确样式的回答

? ? ? ? 我认为更有创造力样式的回答更具体,所以,后面我决定用更有创造力样式,现在开始救砖了。

?? ? ? ?一、分离和附加失联实例的引导卷

? ? ? ? 首先要做的就是分离和引导失联实例的引导卷,具体这样做:

第一步,停止失联实例,图5所示的是停止的失联实例;

?图5.失联实例停止示意

? ? ? ?第二步,打开失联实例的详细信息,所图6所示,点击左列选项的“引导卷”,在打开的页面中,点开引导卷最右边的三个点,选择分离引导卷,在弹出的对话框中,点击左下方的分离引导卷,如图7,命令执行完后可看到显示已分离,如图8、图9。

图6.选择左列引导卷?

图7.分离引导卷选项 ?

图8.点击分离引导卷?

?

图9.引导卷分离成功后的显示信息?

? ? ? ? 第三步,在正常运行的实例上附加上刚才从失联实例分离出来的引导卷,在正常实例的详细信息页面,选择附加的块存储卷,然后在新打开的页面上选择左下方的附加块存储卷,再在打开的对话中首先选择刚分离出来的引导卷的名称,再选择半虚拟化附加类型。

图10.正常实例详细信息中点击附加的块存储卷?

?

?图11.选择刚刚从失联实例分离出来的引导卷附加

?

图12.附加成功后的信息?

? ? ? ? 第四步,打开正常实例的ssh终端,扩用lsblk命令查看附加卷的连接情况,执行命令后能看到有sda和sdb两个卷,如图13所示。其中sdb是失联实例的引导卷,所以后绪操作都应与此分区相关,对sda分区的操作要极其小心,以避免损坏正常运行的实例。

图13.查看挂卷情况

? ? ? ? ?下面就要选择新的系统安装什么版本的ubuntu,官方网站上的版本很多,最新的都到ubuntu24.04,选择哪个版本还是问问Copilot吧。它的建议对我的选择还有一点参考意义的,我最后选了ubuntu22.04,也就是ubuntu cloud img里的jammy类,因为官方对它的支持时间周期较长。不过,通过它的回答也让我搞明白了LTS原来是指有更长的维护时间更稳定的性能,与copilot关于版本选择的对话看图14.

?图14.Copilot对选择ubuntu版本的建议

? ? ? ?二、处理失联实例引导卷分区

? ? ? ? ? 这段操作是在正常实例的ssh终端上进行的,登录后开始。

? ? ? ? ?处理过程有三个步骤,一是建立引导卷的分区并进行格式化操作,二是预设用户ssh终端登录密钥,三是把新的操作系统安装到引导卷分区里。看原来其他人的救砖过程好像没有重新分区这一步,我觉得失联变砖的实例哪里损坏是未知的,不排除分区损坏的可能,所以重新分区再安装系统应该是更彻底的措施了。新的分区有三个,它们是sdb1,4M大小,文件类型是BISO boot;sdb2,106M大小,文件类型是EFI system;sdb3,46.5G大小,文件类型是Linux filesystem。

? ? ? ? 图15显示了在sdb中设置sdb1分区过程与系统的全部交互,其余两个分区跟此过程类似,需要注意的是一次应该把三个分区全部做完,如果没做完三个分区就退出对话后就要重新做。图16是三个分区全部做完后的分区信息。

?图15.sdb1分区过程

?

图16.三个分区完成后的信息?

? ? ? ? 重新分区完成后,需要对新的分区进行格式化操作,EFI system区格式化成f32类型,Linux filesystem区格式化成ext4类型,用mkfs命令进行格式操作。图17显示了这两个分区的格式化过程。

图17.格式化sdb2和sdb3的过程?

? ? ? ? ? 然后建立文件夹,存放安装新系统所需的文件,取名为my-img,放到home文件夹下:

mkdir /home/my-img

? ? ? ? 在新建的文件夹的空白区点右键,选上传,把保存在本地的失联实例的公钥传到这里,就是扩展名为key.pub的那个文件放进来, 下步就要选择安装的映像文件下载到本地,我在众多版本和文件格式中选择了看起熟悉些的jammy-server-cloudimg-amd64.img映像,用这个命令下载:

cd /home/my-img

&& wget https://cloud-images.ubuntu.com/jammy/20231201/jammy-server-cloudimg-amd64.img

下载完成后my-img文件夹里就有两个文件了,如图18所示。

图18.下载完成后my-img文件夹的内容?

? ? ? ? 接着我让Copilot帮我写码,具体要求是:系统的运行环境为ubuntu 20.04,系统安装文件名为jammy-server-cloudimg-amd64.img,放在/home/my-img/文件夹里,用linux shell代码写一段脚本,把这个系统映像文件安装到/dev/sdb分区,预设系统的用户名为ubuntu,此用户ssh登录时用名为ssh-key-2023-09-07.key.pub的密钥文件,这个文件也放在/home/my-img文件夹里。

Copilot的回答如图19-21所示。

图19.copilot写的代码之一

图20.copilot写的代码之二

?图21.copilot写的代码之三

? ? ? ? Copilot的回复是一个完整的可直接运行的bash文件,因为我对linux的命令系统并不熟悉,看不出这个sh文件是否能管用,我决定还是逐条运行看看效果吧。

? ? ? ? 在执行第三命令时出错了,我问copilot怎么处理,它的回应如图22:

图22.copilot修改代码建议

? ? ? ? 于是,我修改了mount命令格式:

mount -t ext4 /dev/sdb;

但错误依旧,我再试试重新分区,仍然不行,最后用另一个挂载命令解决了问题:

guestmount -a /dev/sdb1 -i /mnt

执行如图23所示。

图23.挂载成功示意图

? ? ? ? 但是往下的操作就行不通了,我无法进入挂载映像的根目录,因此无法在映像系统中执行创造用户名和ssh登录密钥设置的操作。那么,我试了把这个img映橡文件直接dd到sdb分区,再到甲骨文控制台从正常实例分离它,失联实例附加这个卷,然后再启动。

? ? ? ? 失联实例附加回这个引导卷后,从控制台连接显示启动实例后进入UEFI shell提示符界面,没有fs0:的正常启动加载,看来这样dd到sdb分区的img映像系统没有运行哦。在甲骨文控制台连接窗口看到的信息如图24所示。

图24.未救援成功的控制台信息

? ? ? ? 粗略地看了下ubuntu官网的安装指南文本,感觉它的系统映像文件是以本地虚拟机安装思路为主的,比如用户和登录密码的设置是在虚拟机里的安装过程有设置对话,系统安装也是在本地虚拟机上使用安装向导进行的。因此,甲骨文实例救砖成功必须解决两个问题,一是登录问题,二是安装问题。用ssh终端安装时没有用户设置的交互对话,解决方案只能是预设用户名和密钥。安装则是找到linux的工具,它能创建ssh连接时能自动启动的分区结构,实现系统映像文件的自动安装。显然刚才那样直接把img映像dd到sdbX分区重新启动,如果分区的文件类型和位置出错,则安装程序不会自动装载。

? ? ? ? 关于预设用户问题,查询了一下,Ubuntu系统预设用户名和密钥问题有人讨论过,比如图25,这个方法跟copilot给出的方法类似,但是要在系统安装启动时按功能组合键进入sudo bash的shell,再用超级用户权限执行设置相关的命令,设置新的用户名和密码。不过,我找到了更便捷的方法。

图25.系统安装启动时设置用户名和密码

? ? ? ?这个更便捷预设用户名和密钥的方法是修改cloud映像的配置文件cloud.cfg,把失联实例的ssh登录密钥加进这个文件,于是顺序执行下述命令:

IMG_FILE=/home/my-img/jammy-server-cloudimg-amd64.img

MOUNT_POINT=/mnt/img

mkdir -p $MOUNT_POINT

guestmount -a $IMG_FILE -i $MOUNT_POINT

? ? ? ? 上面4条命令执行完后终端如图26所示。

?图26.挂载操作图示

然后执行编辑文件命令,并在打开的cloud.cfg文件中,找到system_info段,添加一个ssh_authorized_keys:语句,再选中放置在/home/my-img/文件夹下的密钥文件,如图27:

图27.选中密钥文件点右键用文件编辑器打开

点右键在打开方式中选文本编辑器,在打开的密钥文件中选全部内容,点右键复制,如图28:

图28.选中密钥全部内容复制

再将复制的内容粘贴到刚才加的ssh_authorized_keys:语句下,如图29所示,因用户名为原实例默认用户名ubuntu,所以没有修改,然后保存退出编辑。这里要注意的是添加内容的格式绝对不能错,如果格式不正确在安装后会出现ssh错误导致无法登录。

图29.cloud.cfg文件编辑后内容

接下来卸下挂载并删除挂载点,执行以下命令:

guestunmount $MOUNT_POINT

rmdir $MOUNT_POINT

致此,在系统img映像文件中预设用户名和密钥工作已经完成了。 接下来就是把系统正确地安装到/dev/sdb分区。

? ? ? ?关于ubuntu官方系统映像img格式的文件在ssh终端的安装方法我没有找到,但在某次安装实验中,所选的映像文件是vhd.tar.gz格式的,copilot提出的安装脚本是把tar.gz文件解压成raw文件,然后再用qemu命令把解压的文件传进引导卷分区,这次安装操作成功了,经过实验,这个命令也能对img格式的安装文件起到效果,无需再费尽心机地寻找类UltraISO的linux工具了。直接执行命令qemu并根据你的具体映像文件选择合适的参数就能把img文件正确的安装到sdb分区了:

?在系统传递完成后,剩下的操作要在甲骨文的平台上进行了。

? ? ? ?三、失联实例挂回重装系统的引导卷并重启

? ? ? ?首先进入正常实例的详细信息,点击附加的块存储卷,再点卷右边三点选分离,成功后显示如图30。

图30.正在分离的重装系统后的引导卷

然后切换到失联实例的详细信息,选左列的引导卷,再点卷右边的三个点打开后选附加引导卷,如图31。

图31.引导卷附加回原失联实例

再重启失联实例,重启成功后在finalshell上用与预设公钥配对的私钥(即扩展名为key的密钥文件)和ubuntu用户名设置新建连接,完成后登录成功,如图32所示。

? ? ? ? 这个系统与dd安装系统及非官方网站下载安装系统的最大差别就是安全性和稳定性得到保障,纯净性比甲骨文云的原生系统要高,又可以愉快地玩耍了!

图32.救砖成功后失联实例登录成功

? ? ? ? 回顾这次救砖的过程,copilot起到的作用不可忽视,每当我遇到问题时,copilot都会给我回答,尽管有的回答不是那么准确,有的回答对我问题的理解有偏差,但至少给了我一个方向、思路和参考建议,尤其是它用qemu命令的方法把映像文件格式转换后传到附加卷很少见,也是ssh端能安装成功的基础。在对话时,如果你觉得copilot的回答不满意,可以断开-连接后再提同样的问题,也许会有不同的答案。

? ? ? ? 总体来说,我觉得copilot的智能水平超出了我的想像,它对我提供的帮助是其他搜索引擎无法相比的。它写的代码基本上不会出现语法和逻辑上的错误,它缺少是环境和条件对代码执行的支持程度和效果评估的了解,这个也是人工干预主要内容。相信它会越来越聪明,人工干预也会越来越少。

? ? ? ? 就这些了,希望上面的内容对你有帮助。

最后让copilot帮我画了张标题图:

文章来源:https://blog.csdn.net/hhyyqq/article/details/135086444
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。