一切悲剧来源于写的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 之后的挽救过程的更多相关文章

  1. linux下rm -r误删NTFS文件恢复方法

    一时疏忽,手一抖,把整个挂载的F盘删了一半!顿时傻眼!! 被删的F盘是Windows下NTFS分区,在Ubuntu12.04中挂载了F盘,使用rm命令时粗心大意,误删了一半的数据. 血的教训告诉我们, ...

  2. mysql误删数据快速恢复

    相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来.如 ...

  3. Linux Shell 从入门到删除根目录跑路指南

    1.变量为空导致误删文件base_path=/usr/sbintmp_file=`cmd_invalid`# rm -rf $base_path/$tmp_file这种情况下如果 cmd 执行出错或者 ...

  4. shell 如何避免误删目录

    1.变量为空导致误删文件 base_path=/usr/sbin tmp_file=`cmd_invalid` # rm -rf $base_path/$tmp_file 这种情况下如果 cmd 执行 ...

  5. 前端福利,用 JS 就能实现抖音养号等诸多功能

    我是风筝,公众号「古时的风筝」,一个不只有技术的技术公众号,一个在程序圈混迹多年,主业 Java,另外 Python.React 也玩儿的 6 的斜杠开发者. Spring Cloud 系列文章已经完 ...

  6. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  7. 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  8. Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...

  9. 如何在linux设置回收站

    修改用户的环境变量 vi ~/.bashrc 注释第5行的别名 #alias rm='rm -i' 最后一行添加如下内容 mkdir -p ~/.trash alias rm=trash alias ...

随机推荐

  1. B1071 小赌怡情 (15分)

    B1071 小赌怡情 (15分) 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计 ...

  2. java_servlet

    在servlet 解决中文乱码 response.setContentType("text/html;charset=utf-8"); //必须在getWrite()上面,不然依然 ...

  3. Postman-进阶(2)

    Postman-进阶(2) Postman-简单使用 Postman-进阶使用 Postman-CI集成Jenkins 管理请求 保存请求-添加“打开百度首页请求” 设置请求方式为Get,地址为www ...

  4. Win Server 8中的利器:微软在线备份服务

    微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑,是吧?但是微软确实这么做了.     微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑 ...

  5. 剑指Offer - 九度1515 - 打印1到最大的N位数

    剑指Offer - 九度1515 - 打印1到最大的N位数2013-11-30 01:11 题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案 ...

  6. 《Cracking the Coding Interview》——第6章:智力题——题目4

    2014-03-20 01:02 题目:无力描述的一道智力题,真是货真价实的智力题,让我充分怀疑自己智力的智力题.有兴趣的还是看书去吧. 解法:能把题目看懂,你就完成80%了,用反证法吧. 代码: / ...

  7. 关于在虚拟机上安装iOS所遇到的问题

    先配一张成功的图片: 要想实现上图所示的,就要安装 unlocker206, 安装完unlocker206 不用改里面的内容!!!看到**经验上说还要改内容,结果我试了很多次,根本不行,其实问题不在改 ...

  8. PHP遍历数组的几种方法

      这三种方法中效率最高的是使用foreach语句遍历数组.从PHP4开始就引入了foreach结构,是PHP中专门为遍历数组而设计的语句,推荐大家使用.先分别介绍这几种方法     PHP中遍历数组 ...

  9. poj2388 更水

    Who's in the Middle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34974   Accepted: 2 ...

  10. 洛谷 P2375 [NOI2014]动物园 解题报告

    P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...