记一次服务器无法启动后,从服务器取出数据

事件起因

第一天

周三收到同学消息,说网站后台登录不上去了,打开网页一看,是mysql连接报错,远程连接进入服务器,提示 Read-only file System ,如下图所示:

后来尝试运行各种命令都没有效果,网上一搜,说是硬盘变成只读,不可写入,我随便打开文件修改一下,果然报错:无法写入。尝试用网上的教程:用fsck修复一下:

f**k! 怎么回事?怎么跟网上的结果不一样啊?怎么感觉问题越来越严重了呢?之后我再输几个命令,全是input/output error。继续网上查资料,说是硬盘的故障,内核无法从磁盘上读取二进制程序 ,下次启动时系统自动 fsck 可能会更正磁盘错误,但首先需要使系统重启 。reboot不管用,让我直接用内核重启,于是,我又作死地输入了以下命令:

two thousand years later… 卧槽? 连不上服务器了,心里有一千个草泥马在奔腾。行了,今天先这样吧,明天去机房重启一下。。。

没事不要瞎搞,更不要随便相信网上的东西!!!

第二天

周四来到信息楼,跟老师说明情况后,老师示意我去机房找找去,找了一圈没找到;两圈,没找到。我说老师您知不知道我们的服务器在哪?答曰:我只管开关机房的门,别的管不了。。。无奈又回去找了两圈,还是没找到,去问上一届的学长,学长也不太清楚,又去问了上上届的学长,才了解到服务器是虚拟机。。。What?怎么没人跟我说过啊?然后直接找网络信息中心老师,让他帮忙操作。

网站的信息,一定要传承下去。不仅仅是资料、信息,还有思想、情怀,不然,以后想找也找不到了。就比如最近的一次,更换备案信息需要域名注册者信息,现在一个多月了,还不知道域名是用谁的信息注册的,到现在域名也还没更换备案,用了12年的域名到现在没法用了。

第五天

周天早上,网络信息中心的张老师打电话说没弄好,因为下周不在学校,所以把文件发给我先让我自己弄(到这里我的心已经凉了半截了,你都弄不好,靠我只会几个linux命令怎么修?)。借了移动硬盘去了信息楼。从他那里得知,是因为主服务器的两个控制器中的一个控制器A出问题了,两控制器之间的通信在12秒钟的时间内发生了中断,正好有部分服务器在这期间进行了读写操作,然后系统都变成只读文件系统了。不过windows系统适应性较好,没出问题,出问题的是部分linux(这里也能看出,linux操作系统不一定就比windows好)。他在那里一番操作,大致明白了意思是磁盘文件都没问题,是管理某个分区的superblock损坏。给了我两个参考文章,因为开不开机,一直不知道命令在哪里运行。

经过

回去之后联系指导老师,指导老师联系了网安实验室的赵老师,赵老师给了很多指导性的意见,首先是想通过加载内核文件来启动系统,不过尝试了几次都失败了,给了一个建设性建议,用linux的救援模式启动,然后通过硬盘挂载先把数据弄出来。 期间尝试了几个办法:下载Ext2 Volume Manager软件,虚拟磁盘映射到物理磁盘;新建一个虚拟磁盘,然后用另一个系统加载它。然而都读不出来磁盘的数据部分。

正文

虚拟机用救援模式启动,这里我不再赘述,网上一找就能找到一大堆。

给虚拟机增加一个虚拟磁盘。

激活虚拟分区

首先查看一下逻辑分区的状态:lvscan

发现磁盘是inactive状态,那就先把他们转换为Active状态:vgchange -ay /dev/VolGroup

此时虚拟分区已经变成Active状态了。

查看磁盘分区信息

parted -l > parted

查看所有磁盘状态和文件系统类型 > parted 是因为一个屏幕显示不完,输出到文件parted。如果卡在某个地方直接Ctrl+C退出就可以。

vi parted

这里看到我们有两个磁盘,一个sda,一个sdb,通过对增加虚拟磁盘之前的状态可以知道,sda是原有磁盘,sdb是新加的磁盘,unrecognized disk label说明磁盘还没分区。下面三个是逻辑分区 root、home、swap。我们待恢复的数据在 root和home里面。它们的文件系统类型为ext4。

挂载root分区到磁盘

首先,新建一个文件夹用于挂载分区。

mkdir /myhome

然后挂载home分区到/myhome

mount -t ext4 /dev/mapper/VolGroup-lv_home /myhome

-t是指定文件系统类型,如果parted没有显示出来可以ext2、ext3、ext4分别试一下。后面第一个路径是虚拟分区的路径,parted -l可以看到,第二个是要挂载的目录。

没有报错,证明挂载成功了,看一下。

看到我home里面的文件都取出来了

新磁盘分区并格式化

fdisk /dev/sdb

这里sdb是我新加的磁盘,一定要确定不是你原来的磁盘,不然格式化之后什么东西都没了

到这里不要慌,按m查看帮助

我们选择n,添加一个新分区

然后选择分区个数1,索引位置默认就好,这里一路回车下去

按p查看分区表,按w进行分区并退出。

通过 parted -l 这里看到分区已经完成,但是文件系统那还是空。还需要格式化一下磁盘。分了一个区新分的区应该是sdb1,如果不放心可以fdisk -l查看一下

看到这里就是sdb1,然后以ext4格式格式化磁盘

mkfs.ext4 /dev/sdb1

好了,分区完成,接下来还是要挂载到这个设备上。

mkdir /home_back
mount -t ext4 /dev/sdb1 /home_back/

这里看到挂载成功了,接下来就可以cp复制了

取消挂载

复制完之后,用umount命令取消挂载就行了

umount /myhome
umount /home_back

映射新分配的磁盘到物理机

用VMware把这块新加的磁盘映射到物理机即可读出文件,若是读不出来,可以下载Ext2 Volume Manager这个软件试一下,另外一种方式是新建一个虚拟机,把这块磁盘给加进去,然后就可以读出来了。

参考文章:

1.Linux 磁盘分区、格式化、目录挂载

2.linux的mount(挂载)命令详解

3.CentOS虚拟机如何进入救援模式?

4.玩转vmware虚拟机:如何挂载虚拟机磁盘到物理机

评论