一个服务器,如果无法登入,什么操作都做没法做了。就算知道相关问题的解决方案,进不去系统,白搭。直接重置丢弃?那不行,还有很多数据呢。。。
上周末,就在谷歌云服务器上遇到这样的问题。
问题表现:
用第三方SSH链接,链接不上,提示: Connection closed by foreign host.
而对应的ip,则是ping的通的。防火墙也没问题。
Google Cloud Server 虚拟机操作后台也无法在浏览器端用SSH链接,就算不使用 Cloud Identity-Aware Proxy 的情况下,也链接不上。反馈的信息是端口22不能访问。
接着在 Google Cloud Server Console里面的命令行里做一些操作,串行端口进入后明显的一个错误提示为:
google cloud ssh Permissions 0666 for '/etc/ssh/ssh_host_ed25519_key' are too open
还有一个表现为:数据/资源无法下载
问题真相:
经过一番变幻莫测的折腾,细节这里就不详描述了,问题被完全确认:
1. ssh肯定无法正常连上做相关操作。而root密码也没有。就算勉强脸上,sudi -i都被拒绝执行。
2. /etc/目录里面的文件权限被改了。究其原因,那必然是通过一些"行云流水搬的操作"导致了如此严重的问题。(如何改权限,网上方法很多)
3. 由于权限不足,也没法将数据或者资源下载下来。
解决方案:
Google cloud server确实有一些帮助文档,但是要我完全快速看懂,确实费时一些,毕竟我是搞3D引擎的南人儿(这个借口很赞啊),真是说来惭愧。这个问题的解决有个大前提:服务器的数据和资源是绝不能丢的。具体问题解决方案如下:
方案一:
建立一个系统情况相同的虚拟服务器(VM),将有问题的虚拟服务器硬盘挂在这个正常的服务器上,修复相关问题。例如这里更改相关文件访问权限。提示一下: 记得先做个磁盘映像备份,以防不测。但是,这个过程来回挂载测试,如果操作的细节太多,就会比较繁冗,耗时会不少。整个方案最终并没有解决我遇到的问题,所以我并没有真的采用这个方案。只是此方案的优势在于能最大可能保留原有系统,可能对别人是有用的。
方案二:
新建一个虚拟服务器,将有问题的虚拟服务器硬盘挂载到这个新的服务器硬盘上,然后将其中的数据和资源copy到这个新的服务器上。这个方案的麻烦点在于原来的服务功能要原样还原。这也是我最后采用的方法,拿到原系统配置信息,处理完耗时还是很小的。
回顾起来,分析了分析去,实际解决却是用了最基础的方式: 留下数据,换个全新的环境,绕开问题细节。
挂载磁盘并Copy数据:
1. 查看磁盘分区名称命令: lsblk 2. 创建挂节点Dir命令: sudo mkdir /mnt/disk02 3. 挂接点设置 sudo mount -o discard,defaults /dev/sdb1 /mnt/disk02
接着就可以copy相关的数据了,举例如下:
cp -r /mnt/disk02/home/vilyRes/parser/ /home/vilyRes/