今天成功申请到了甲骨文云的免费帐号,结果体验一番发现槽点实在是太多了,整个甲骨文云的设计简直是反人类思维。这篇文章记录一下使用netboot.xyz救援或重装系统的过程,不需要额外的实例挂载修改引导卷。
槽点
用户体验太差
整个甲骨文云的架构设计,从用户使用体验角度感受,体验实在太差。整个云系统明显可以看出Oracle是完全偏向于技术型的公司,网页管理界面充斥了域、组、策略、权限等技术性字眼,但我找了半天,连修改密码的地方都没找到……
引导卷备份后无法用来恢复
引导卷(也就是通俗理解的系统硬盘)有一个备份功能,类似于硬盘镜像吧。备份以后的镜像,只能用来创建新的实例(VPS),不能用来恢复数据。也就是说,从实例A备份出来的引导卷备份,只能用来创建新实例B,不能用来恢复实例A。
Oracle真TM的是逻辑鬼才!不服不行!
没有Debian系统
为什么预选系统里没有Debian却有Ubuntu?难道Ubuntu比Debian还适合作为服务器系统吗?
免费帐户却显示收费
只要新建第二台以上的实例,虽然是免费帐户,但却还是显示要收费的BUG。这个引导卷每个实例默认给47G容量,免费容量总共200G,按说不超过是应该显示免费的,但甲骨文却要吓一吓你,实际上是不会扣钱的。
操作系统防火墙默认阻挡一切
改了22端口发现再也连不上了,子网安全列表也都允许了,却还是连不上。然后我选择netboot.xyz重装系统。后来我在这篇文章《Oracle 云主机默认镜像ubuntu 18.04的坑》看到:
Oracle给他的默认的linux 的OS 都写入了默认的规则,路径在/etc/iptables/rules.v4 和rules.v6。把rules.v4的规则里的两条reject 规则给他comment out,就可以了.
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
写这篇文章(折腾)的起点就是我改了SSH默认22端口,然后灾难就来了。再来连不上服务器了。
默认不允许ICMP
默认不允许ping,连服务器什么状态都不知道。
实例防火墙设置选项
看见上图,你以为防火墙是在网络安全组里设置吗?我也是这么想的。但进去找了半天,发现并不是在这里,而是在子网里设置?!
子网的安全列表功能,实际就是防火墙。我自己添加了一个空防火墙允许所有规则。
新建实例时只允许RSA算法作为用户密钥
Oracle不允许帐号使用密码,只能使用密钥。新建实例时有一步是要求生成或添加SSH密钥,但也没明确提示用什么算法,我就贴了我之前的ed25519算法的密钥,也没提示我不正确,结果实例生成以后就直接无法登录了?!查他的文档才说必须只能是RSA算法,简直卧槽!看起来安全要求这么严格的Oracle,竟然就要求不安全的RSA算法吗?
拯救操作系统
下面章节记录如何通过Oracle串行控制台重置密码、进入EFI boot、使用netboot.xyz重装系统。
连接Oracle Serial Console串行控制台
官方文档:https://docs.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm
有两种连接方法,Cloud Shell网页连接,或本机连接。Cloud Shell网页连接操作简单无需配置,推荐这种方法。
其他还有VNC方法,试了,没成功,操作步骤有点复杂,不如这两种方法简单。
Cloud Shell 连接
在实例详细信息页面 - 控制台连接 - 启动Cloud Shell 连接。网页会弹出来一个类似命令行界面的窗口,显示的就是串行控制台。
本机连接
本节以下内容需要linux可联网环境,并且最好网络稳定不然连一下就断了。
先要生成SSH密钥,然后执行ssh命令连接实例终端。
(为我生成密钥对那个选项,我试了,连不上,提示服务器拒绝没权限。)
生成SSH密钥
如果已经有RSA算法的SSH密钥可以跳过此步骤。但要知道公私钥的路径。
使用ssh-keygen程序生成密钥:
ssh-keygen -t rsa -N "" -b 2048 -C "oracle_rsa" -f ~/.ssh/oracle_rsa
这条命令生成2048位RSA算法的密钥,密钥密码是空,保存在~/.ssh目录,公钥是oracle_rsa.pub,私钥是oracle_rsa。
上传公钥
在实例详细信息页面 - 控制台连接 - 创建本地连接,上传或者粘贴上一步创建的公钥,然后点“创建控制台连接”。
连接串行控制台
点“创建控制台连接”后,Oracle会出来一个连接信息行,等待状态为绿色“活动”后,点该行最右边的...,选择“复制linux/MAC的串行控制台连接”。
需要先编辑一下连接才能使用,所以打开本机文本软件比如记事本,把复制的信息粘贴进去。
复制出来的信息如下(为了隐私,部分字符做了修改):
1 | ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.us-sanjose-9.anzwulj1234567896fjye2xjca@instance-console.us-sanjose-9.oci.oraclecloud.com' ocid1.instance.oc1.us-sanjose-9.anzwulj1234567896fjye2xjca |
在两个ssh字符后面,加入-i ~/.ssh/oracle_rsa
,也就是上一步生成的密钥路径,其他部分不用修改。修改后的信息如下:
1 | ssh -i ~/.ssh/oracle_rsa -o ProxyCommand='ssh -i ~/.ssh/oracle_rsa -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.us-sanjose-9.anzwulj1234567896fjye2xjca@instance-console.us-sanjose-9.oci.oraclecloud.com' ocid1.instance.oc1.us-sanjose-9.anzwulj1234567896fjye2xjca |
然后复制修改后的信息,执行,就连上Oracle串行控制台了。
进入Oracle Serial Console串行控制台
在实例详细信息页面,点重新引导 - 打钩立即关闭 - 强制重新引导实例。实例就会直接重启。
然后要立刻切换到上一步连上的串行控制台窗口,不停按ESC键,直到出现EFI BOOT界面。如果错过了时机,系统正常启动了,那么重复强制重启按ESC过程。
使用Oracle Serial Console串行控制台
进入Oracle Serial Console串行控制台后,离成功已经不远了。接下来就是处理解决具体的问题,比如密码忘了、SSH密钥改坏了、被防火墙挡住了、要重装系统等。
如果是密码忘了、SSH密钥改坏了、被防火墙挡住了等只需要执行对应命令就可以解决的问题,不需要重装系统,那么看单用户模式章节。
单用户模式
进入启动菜单
在EFI BOOT界面,选择Boot Manager,高亮行放到UEFI Oracle BlockVolume上,这时候左手放到ESC键上,右手按回车后,左手要立刻狂拍ESC键,直至出现启动菜单。如果错过了系统正常启动了,那么要重复整个过程。
编辑启动菜单
高亮光标移动到第一行上,按e键进入编辑模式。
然后用上下左右键控制光标,把光标移动到linux行末端,但和前面的字符要间隔有空格,注意截图中linux行被\符号分割为好几行,实际上linux只有一行。然后添加内容 init=/bin/bash
确认添加的字符没错后,按键盘快捷键CTRL+X,实例会重新启动。这次让其正常启动。
启动完成后,串行控制台会跳过输入账号密码提示,直接出现命令输入提示窗口。这就是root权限的单用户模式,在这里就可以输入想要恢复系统的命令。
首先为了之后输入的命令可以保存生效,需要输入以下命令:
1 2 3 4 5 | # 加载 SElinux 策略,以保留您正在修改的文件的上下文 /usr/sbin/load_policy -i # 重新挂载根分区并赋予读写权限 /bin/mount -o remount, rw / |
然后就可以输入解决问题的命令(opc是Oracle系统的默认用户名,用户名在网页实例详细信息页面有),比如
1 2 3 4 5 6 7 8 | # 编辑系统配置文件 exec /usr/lib/systemd/systemd # 重置密码 opc是用户名,用户名在网页实例详细信息页面有 sudo passwd opc # 添加opc用户的SSH公钥 >是覆盖源文件,>>是追加源文件 echo '<contents of public key file>' > ~opc/.ssh/authorized_keys |
最后,输入命令/usr/sbin/reboot -f
重启实例。
重装系统
下载netboot.xyz
网上教程说在EFI BOOT - boot manager - EFI Internal Shell 里,可以配置网卡、DHCP后用tftp下载netboot.xyz,我试了,不成功,自己搭建tftp服务器也不行。并且EFI Internal Shell有个http下载命令,我也试了,还是不行。
所以,只能通过先进入单用户模式,然后执行wget命令下载了。netboot.xyz.efi是AMD机型的UEFI启动程序,ARM的下载地址是https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi
1 2 | cd /boot/efi/EFI/ wget https://boot.netboot.xyz/ipxe/netboot.xyz.efi |
使用netboot.xyz启动
下载完成后,通过上文《进入Oracle Serial Console串行控制台》章节,进入EFI BOOT,选择Boot Maintenance Manager - Boot From File - 选择硬盘 - 选择netboot.xyz.efi,就可以进入netboot了。
进入netboot后,就可以选择安装各种linux系统了。但还没完,还有最后一个BUG。
解决卡在EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path
不论选择Network install还是Live CD哪种安装方式,都会卡在EFI stub: Loaded initrd from LINUX_EFI_INITRD_MEDIA_GUID device path显示这里。
搜索后,解决办法是:
Once you have booted into netboot.xyz on
x86_64
, if you plan on using Linux images, you must still set up customKernel cmdline params
underUtilities (UEFI)
.Set
Kernel cmdline params: []
toconsole=ttyS0,9600
.If you make a mistake, move with arrow keys, and use the Delete key.
Once you have typed it in, you might have to press the Escape key twice.
https://netboot.xyz/docs/kb/providers/oci/#x86_64---console-quirks-linux
文字描述有点麻烦,不如看图操作:
接下来,终于可以进入到linux系统的安装界面了,再没遇到什么问题,系统安装成功完成,Oracle实例终于救活了!
文章评论
好用
恢复密码操作确实好用,直接用windows vnc 修改ro 引导直接黑屏。还得是在控制台vnc操作
用了是,好用,装完debian 重启进不去系统了,改了grub后能进系统,但grub-install /dev/sda/
Installing for x86_64-efi platform.
grub-install: error: unknown filesystem.
@太丰富 可以在netboot下先格式化硬盘?
博主好!能否有偿请您帮忙重装甲骨文系统?
博主你的博客文章页面在非魔法环境下,丢失css样式。