在linux系统中如果误删除了某个文件,但是文件句柄还被某些进程占用着,这种情况下该怎么恢复被删除的文件呢?

在linux系统中如果误删除了某个文件,但是文件句柄还被某些进程占用着,这种情况下文件还能恢复吗?如果可以,那该怎么恢复被删除的文件呢?

首先我们先来理解下,【文件被删除了,但是文件句柄还被某些进程占用着】是什么意思?
先上个图


文件名与inode的关系

当我们创建一个文件后,linux文件系统会将文件的数据存储到磁盘的数据区(data area),文件根据其大小可能会占用多个磁盘扇区;
每个文件都会对应一个inode,inode存在于磁盘的索引表部分(inode table),inode中存储着文件的元数据信息,文件系统通过inode里存储的元数据读写磁盘;
每个inode都会分配一个唯一的inode编号,即索引节点编号;
文件系统会将文件名与inode编号建立映射关系,存储在内存中,便于快速访问。

上面说了这么一些,那实际上文件系统访问文件的流程是怎样的呢?
1)我们平常查看或修改文件都是通过文件名来操作的,上边说到了文件名与inode之间存在映射关系,而这个映射关系存储在内存中,通过文件名可以找到与之关联的inode编号;
2)拿到了inode编号后,就可以查找到该编号对应的inode,进而从磁盘里读取到inode中存储的文件元数据;
3)通过文件元数据,再访问。
大概流程就是这样。

那这个与我们所要理解的【文件被删除了,但是文件句柄还被某些进程占用着】有什么关系呢?其实是有关系的。
我们常说文件名、文件名,都知道它是一个文件的名称,但实际上文件名只是一个指向文件inode的硬链接(可以理解为文件的一个别名),可以真正恒久不变地标识一个文件的是inode编号;
从一个文件被创建后,它就会对应着一个inode,在它的生命周期内(即一个文件被删除之前),文件的inode都是不会发生改变的;而文件名是可以随意改变的,文件名发生了改变,文件内容是不会受影响的;
就像一个人的微信,它的微信号是唯一的,但是微信昵称却是可以变来变去的。

当一个文件正被某个进程读写时,我们执行rm操作将其删除,此时我们执行cat filename,查看文件文件内容的话,肯定会报【No such file or directory】的错误。
衔接上面说到的文件名只是一个指向文件inode的硬链接(它与inode之间建立的联系),文件系统访问文件是先通过文件名在内存中存储的映射关系中找到inode编号,然后再找到inode,接着读取出inode中文件的元数据,然后文件系统再通过元数据访问磁盘进行IO操作。

我们把文件名删除后,相当于在内存中删除了文件名与inode之间建立的映射关系,这样文件系统就找不到inode了;
但是如果此时还有进程在占用着文件,那么文件不会彻底删除,因为此时该文件的句柄还没释放,文件属于标记删除状态;
而如果文件没有被进程占用且文件也没有其他的硬链接指向它的inode了(即文件只有一个别名),那么此时该文件会被彻底删除(包括文件名、inode以及磁盘中存储的文件数据);
如果此时还有其他的硬链接指向文件的inode(文件有多个别名,类似于一个人可以拥有多个花名),那么仅是删除这个这个硬链接(即此次rm操作只是删除这个文件名,对文件数据没影响)。

所以,【文件被删除了,但是文件句柄还被某些进程占用着】的意思是:虽然你在linux系统上访问文件时报【No such file or directory】错误,但是别慌,文件还没真正删除的,还可以找回来。那怎么找回来呢?这就需要从进程以及其占用的文件句柄(文件句柄其实是一个文件描述符,即符号链接)入手了。

linux系统上跑着的每个进程都在/proc目录下存在着一个记录,记录格式为:/proc/pid,即每个进程在/proc目录下都会对应一个目录,目录名为进程的id号。
例如,进程tail -f ldapbak.ldif的进程id为15603


查看进程的进程id

我们到/proc目录下查看下是否真的有这样的一个目录,切换到/proc,执行ls 15603


进程id为15603的进程在/proc对应的目录为15603

可以看到这个目录下还是有挺多文件的,其中有一个目录为fd。
fd这个目录的作用是存储着该进程占用着的文件句柄,例如:
查看进程15603占用着的文件句柄

其中,0、1、2、3、4这些就是文件描述符,它们其实本质就是符号链接(即软链接),指向被该进程打开的文件。
所以进程打开的文件描述符的存储路径是:/proc/pid/fd/文件描述符
如果一个进程占用的文件描述符没有被释放,那么执行rm操作删除文件时,文件尚未真正被删除。

那么当我们执行rm操作误删了文件,我们怎么判断这个文件是否正被某些进程占用着以判断文件能否恢复呢?
如果你知道文件名,那么可以直接执行lsof | grep filename,如果能够查到记录,那么说明还有进程在占用着这个文件;
否则没有进程占用了,文件可能很难恢复了。
如果不知道确切的文件名,那么可以执行lsof | grep deleted,来查找记录。

此时ldapbak.ldif文件正被tail进程占用着,我们对其执行rm -f操作,然后再通过lsof | grep filename或者lsof | grep deleted来查找,由于这里我明确知道文件名,所以我就直接使用lsof | grep ldapbak.ldif来查找了,如下图:


lsof查看进程打开的文件

可以看到,如果一个被进程占用着,这种情况下对其执行rm操作,lsof得到的记录中会有(deleted)标签,所以我们才可以通过lsof | grep deleted来查找。

要想恢复文件,首先得知道占用着这个文件的进程id以及其创建的文件描述符,为什么?因为我们需要根据/proc/pid/fd/文件描述符,找到被进程占用的文件句柄;
如上图所示,第二列是tail进程的pid:34095(这里因为我kill了进程,重新打开了一个,所以pid不是之前的15603了),第四列是文件句柄(文件描述符)3。

好了,现在找到了pid,也找到了文件描述符,我们可以切换到/proc/34095/fd目录,找到文件描述符3,然后通过cp命令即可恢复被删除的文件;

例如我删除的文件是ldapbak.ldif,那么就可以执行cp 3 /home/test/ldapbak.ldif就可以恢复文件ldapbak.ldif到指定目录了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343