不⼩⼼执⾏rm-f,该如何恢复?
每当我们在⽣产环境服务器上执⾏rm命令时,总是提⼼吊胆的,因为⼀不⼩⼼执⾏了误删,然后就要准备跑路了,毕竟⼈不是机器,更何况机器也有bug,呵呵。
那么如果真的删除了不该删除的⽂件,⽐如数据库、⽇志或执⾏⽂件,咋办呢?欲知后事如何,请仔细看完本篇⽂章。
模拟场景
1、删除误删除服务器⽬录/root/selenium/Spider下的MySql.Data.dll⽂件:
1. $ rm -f /root/selenium/Spider/MySql.Data.dll
2. $ ll /root/selenium/Spider/MySql.Data.dll
3. ls: cannot access /root/selenium/Spider/MySql.Data.dll: No such file or directory
2、恢复
2.1、使⽤lsof命令查看当前是否有进程打开/root/selenium/Spider/MySql.Data.dll⽂件:
1. > lsof | grep /root/selenium/Spider/MySql.Data.dll
从上⾯可以看出,当前⽂件状态为已删除(deleted)。
2.2、查看是否存在恢复数据:
/proc/13067/fd:进程操作的⽂件描述符⽬录。 86:⽂件描述符。
1. $ cat /proc/13067/fd/86</pre>
2.3、使⽤I/O重定向恢复⽂件
1. $ cat /proc/23778/fd/86 > /root/selenium/Spider/MySql.Data.dll
2. $ ls -l /root/selenium/Spider/MySql.Data.dll
3. -rw-r--r-- 1 root root 702464 Feb 10 12:03 /root/selenium/Spider/MySql.Data.dll
重新运⾏程序:
百度数据恢复说明恢复的⽂件没有问题。
刨根问底
通过前⾯的模拟场景演⽰了恢复⽂件的整个过程,那么原理是什么,在什么情况下,⽂件才是可恢复的。
在Linux系统中,每个运⾏中的程序都有⼀个宿主进程彼此隔离,以/proc/进程号来体现(Linux 本质上就是⼀个⽂件系统)
⽐如:ls -l /proc/13067 查看进程PID为13067的进程信息;
当程序运⾏时,操作系统会专门开辟⼀块内存区域,提供给当前进程使⽤,对于依赖的⽂件,操作系统会发放⼀个⽂件描述符,以便读写⽂件。
当我们执⾏ rm -f 删除⽂件时,其实只是删除了⽂件的⽬录索引节点,对于⽂件系统不可见,但是对于打开它的进程依然可见。
即仍然可以使⽤先前发放的⽂件描述符读写⽂件,正是利⽤这样的原理,所以我们可以使⽤I/O 重定向的⽅式来恢复⽂件。
总结
如果不⼩⼼误删了⽂件,不要着急。
⾸先使⽤ lsof 查看打开该⽂件的进程。
然后再使⽤ cat /proc/进程号/fd/⽂件描述符查看恢复数据,最后使⽤I/O重定向的⽅式来恢复⽂件。
作者:justmine

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。