手一抖误删了根目录 /usr 之后的挽救过程
一切悲剧来源于写的Shell没有好好检查,执行后把开发机的根目录 /usr 目录给删除了,而且是root执行,众所周知,/usr目录里有大量的应用层程序,删除之后导致大量命令无法使用,如 ssh / rz / sz / nc / wget /yum 等,不夸张地说,当时就要不行了。。好吧,首先想到的挽救方式就是到另一个虚拟机下将 /usr目录整个拷贝过来,然而发现,没有命令可以往这台机器里拷东西了,上天入地无门。。
好在,这台机器是虚拟机,一切都是虚的,虚的比实的更能应付变化(在某些情况下不对,后面说)。。
于是,用vmware的虚拟磁盘热加载特性,赶紧开了另一个虚拟centos机(后面一律用centos-rescue指明),然后添加一个全新的虚拟磁盘,挂载之后,将 /usr 目录拷贝到挂载的目录,解除挂载,卸掉虚拟磁盘。然后再加入出事的虚拟机(后面一律叫 centos-pity),同样是挂载,将 /usr 拷贝到根 / 目录下,拷贝完立马执行几个命令试试 wget / rpm / yum 发现, 有些命令能成功,有些提示依赖的 .so 缺失,明显是 yum 系统乱了。。。尼玛哪都可以乱,yum 包管理课别乱,哎!
于是,开始整理yum系统,由于 centos-pity 是主要工作用的开发机,里边安装了大量开发使用的第三方包,主要是c库和python库,整个整理过程历时2个小时左右,只要是各种 yum -y remove XXX 然后 yum -y install XXX , 即将原有的东西先删除然后再安装。。最后,终于看起来yum系统稳定了,到一个C项目里执行 configure && make 都正常了,好开心。。
打铁趁热,之前那么被动就是因为吃了没有及时快照的苦,赶紧关了centos-pity , 用vmware打了个漂亮的快照,心里的石头放下了,开启虚拟机打算进入正常工作,然后,centos-pity 启动比之前慢了好多,最后停止了(一段白条),按F5看输出,尼玛的! lv-root 没有能正常启动。。,直观感觉,往根分区硬删掉一块东西再拷入一块大小不一样的东西,会将分区搞坏,这下事情搞大了。。
这里介绍一下centos-pity的硬盘和分区情况,一开始新建虚拟机时用了一块默认的硬盘20G,叫 sda 然后安装了 centos-6.2-minimal, 这个发行版会将/sda切成两块 , /sda1 挂载到 /boot 目录并安装系统, /sda2 变成一个pv并加入一个默认叫 VolGroup 的逻辑卷组,在VolGroup卷组上再新建2个逻辑分区 lv-root ,lv-swap, 其中,lv-root作为根分区挂载的是根目录 / , 我的主要工作就是在根目录 / 下,比如开发环境安装在 /usr 下,项目代码在 /data 下, 用了一段时间后,磁盘空间不够了,我又增加了一块虚拟硬盘,叫 sdb(100G) ,然后在上面新建pv,同样加入 VolGroup , 然后为 lv-root 逻辑分区扩容,扩到100G 左右。。
所以,lv-root 一出问题,心就慌了,里面是几个月的工作。。
初始想法还是利用 centos-rescue, 赶紧将 sda sdb 从 centos-pity 卸载,然后插入centos-rescue 上, Centos-rescure 是默认安装得到的,只有一块硬盘20G,分区类似上面说的sda1 , sda2(lvm) 的情况,现在centos-pity的两块虚拟硬盘加入后,作为 centos-rescue 的 sdb ,sdc 出现, 系统启动后,又傻了。 centos 默认建立的逻辑眷族都叫 VolGroup , 这导致出现了名字冲突而无法正常使用(两个VolGroup, 两个 lv-root 等) ,之前在另外的场合试图人工修改过lvm名字冲突问题,深知水很深,这次不打算人工搞。。
于是,先将 sdb sdc 又卸载了,然后再进入 centos-rescue , 没错,我打算直接改掉 centos-rescue的默认卷组的名字
vgrename VolGroup VolGroupNew
vgchange -ay VolGroup
执行完后用 vgs, lvs 等查看都是正常的,好吧,插入 sdb sdc 再次重启,又傻了。。。kernel panic ,挖了了去。。
一番搜索,发现lvm尼玛是傻逼,vgrename改名字后,尼玛不会自己修改 /boot/grub/grub.cfg 配置里的名字,grub.cfg boot选项还是从 VolGroup-lv-root 启动,而这个分区已经没有了,好吧,人工修改为 VolGroupNew-lv-root 并将其他地方都换为 VolGroupNew ,再重启, 又傻了。。。filesystem checking 失败,挖了个去。。
一番搜索,发现lvm真是傻逼,/etc/fstab 里的挂载项目也需要人工修改,修改后再重启,这次OK了,lvs一下出现
lv_root VolGroup -wi-ao---- 96.57g
lv_swap VolGroup -wi-a----- 1.94g
lv_root VolGroupNew -wi-ao---- 17.57g
lv_swap VolGroupNew -wi-ao---- 1.94g
centos-pity 的两个盘都以 lvm 逻辑分区的形式在 centos-rescure出现了,赶紧将 /dev/VolGroup/lv_root 挂载到一个目录,然后将里边重要的目录拷贝出来,这里因为前面lvm各种折磨,不打算用 lvm 了,直接用 vmware 新增一个普通的虚拟磁盘,叫 sdd , 这块就是干净的普通磁盘,mkfs.ext4 新建一个文件系统并挂载,然后将重要的项目文件拷进去,再卸载。 然后将这个虚拟磁盘放入 360 云盘里,直接上传到云。。这叫吃一亏长一智,以后重要的项目数据都这么来,直接用普通虚拟磁盘不做任何lvm,空间不够增加磁盘就行了,磁盘文件都放入云盘及时同步,也不用惦记着去做快照了,一旦发生问题,新建一台虚拟机,挂上虚拟磁盘,屁事没有,又可以开始工作了。。
好了,数据算是挽救回来了,接下去想救救 centos-pity , 于是再将磁盘挂回去启动,出现错误
"打不开文件“E:\00-worker-centos\centos-pity.vmdk”:
该虚拟机的某个磁盘已经由虚拟机或者快照使用。"
这个错误还没解决,据说是因为虚拟机centos-pity记录了一些中间状态导致的。反正数据救回来了,开发环境有专门的脚本安装,干脆新建个虚拟机重建一个系统,再用安装脚本安装开发环境。
参考
http://www.novell.com/coolsolutions/appnote/19386.html
http://www.duo66.com/post-4095.html
手一抖误删了根目录 /usr 之后的挽救过程的更多相关文章
- linux下rm -r误删NTFS文件恢复方法
一时疏忽,手一抖,把整个挂载的F盘删了一半!顿时傻眼!! 被删的F盘是Windows下NTFS分区,在Ubuntu12.04中挂载了F盘,使用rm命令时粗心大意,误删了一半的数据. 血的教训告诉我们, ...
- mysql误删数据快速恢复
相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来.如 ...
- Linux Shell 从入门到删除根目录跑路指南
1.变量为空导致误删文件base_path=/usr/sbintmp_file=`cmd_invalid`# rm -rf $base_path/$tmp_file这种情况下如果 cmd 执行出错或者 ...
- shell 如何避免误删目录
1.变量为空导致误删文件 base_path=/usr/sbin tmp_file=`cmd_invalid` # rm -rf $base_path/$tmp_file 这种情况下如果 cmd 执行 ...
- 前端福利,用 JS 就能实现抖音养号等诸多功能
我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...
- 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)
1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理! 我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...
- Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用
概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...
- 如何在linux设置回收站
修改用户的环境变量 vi ~/.bashrc 注释第5行的别名 #alias rm='rm -i' 最后一行添加如下内容 mkdir -p ~/.trash alias rm=trash alias ...
随机推荐
- C语言进阶——循环语句07
循环语句的基本工作方式: 通过条件表达式判定是否执行循环体 条件表达式遵循if语句表达式的原则 do,while,for的区别: do语句先执行后判断,循环体至少执行一次 while语句先判断后执行, ...
- 图像的模糊-opencv
调用两个API,一个是均值模糊,一个是高斯模糊.如下所示: #include<opencv2/opencv.hpp> #include<iostream> using name ...
- HDFS HA 的 core-site.xml
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <!-- Licens ...
- saltstack执行远程命令
目录 Remote Execution salt state salt state 系统 salt state 系统流程 Runner salt runner Orchestrate Runner S ...
- springmvc上传图片并显示--支持多图片上传
实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: <dependency> <groupId>comm ...
- c语言在windows下和Mac下的不同表现!
最近给一个等级考试的C语言培训班上课,学生问起一些++的问题.让我好生为难.因为这些不同的编译器处理方式,在不同的系统下表现并不一致. 不管你洋洋洒洒论述多么一大篇,在事实面前就一下显得苍白了.虽然这 ...
- 孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase
孤荷凌寒自学python第五十天第一次接触NoSql数据库_Firebase (完整学习过程屏幕记录视频地址在文末) 之前对关系型数据库的学习告一段落,虽然能力所限没有能够完全完成理想中的所有数据库操 ...
- 剑指offer-从尾到头打印链表03
class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code ...
- ExtJS Ext.MessageBox.alert()弹出对话框详解
Ext.MessageBox是一个工具类,他继承自Obiect对象,用来生成各种风格的信息提示对话框,Ext.Msg是该类的别名,使用Ext.MessageBox和用Ext.Msg效果是一样的,而后者 ...
- php设计模式 工厂模式和单例
1.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. class cat{ public $name; privat ...