Linux使用 lsof 恢复删除已删除文件

简介

一个打开的文件被突然删除,在文件被程序关闭之前可以通过 lsof 重建文件副本

详情

从文件系统删除文件,只要使用文件的程序仍然在运行,这个文件就可以被恢复。在程序关闭文件或者退出之前 inode 仍然是打开的因此数据块仍然在磁盘上。 通过使用 lsof 和 /proc 可以重建被删除的文件。 可以通过下面的例子来解释:

  1. 新建文件:

    /> cd /tmp
    tmp> ls -lR / > /tmp/myfile
    tmp> ls -l myfile
    -rw-r--r-- 1 fred ftp 11567585 Nov 23 08:44 myfile
    tmp> stat myfile
    File: `myfile'Size: 11567585Blocks: 22640IO Block: 4096 regular fileDevice: 900h/2304dInode: 48871Links: 1Access: (0644/-rw-r--r--)Uid: ( 1900/fred)Gid: (50/ftp)Access: 2006-11-23 08:44:32.000000000 +0000Modify: 2006-11-23 08:44:26.000000000 +0000 Change: 2006-11-23 08:44:26.000000000 +0000

  2. 执行某些命令保持文件被打开:

    scum 97 tmp> less myfile &
    [1] + Suspended (tty output) less myfile

  3. "突然" 删除文件:

    tmp> rm myfile
    tmp> ls -l myfile
    ls: myfile: No such file or directory

  4. 使用 lsof 查看打开文件描述符的进程:

    tmp> lsof | grep myfile
    less11230fred4rREG9,0 1156758548871 /tmp/myfile (deleted)

第二列就是打开文件的进程PID,第四列就是进程打开文件描述符

  1. 在 /proc 下定位打开的文件描述符
    tmp> ls -l /proc/11230/fd/4
    lr-x------ 1 fred ftp 64 Nov 23 08:49 /proc/11230/fd/4 -> /tmp/myfile (deleted)

  2. 这个时候文件就可以被复制回原来的位置:

    tmp> cp /proc/11230/fd/4 myfile
    tmp> ls -l myfile
    -rw-r--r-- 1 fred ftp 11567585 Nov 23 08:54 myfile
    tmp> stat myfile
    File: `myfile'Size: 11567585Blocks: 22640IO Block: 4096 regular fileDevice: 900h/2304dInode: 48878Links: 1Access: (0644/-rw-r--r--)Uid: ( 1900/fred)Gid: (50/ftp)Access: 2006-11-23 08:54:28.000000000 +0000Modify: 2006-11-23 08:54:28.000000000 +0000 Change: 2006-11-23 08:54:28.000000000 +0000

注意:


复制回来的文件和进程打开的文件inode不一样,这个意味着复制出来之后程序对原来文件的修改不会被恢复


转载于:https://my.oschina.net/leili/blog/3085023

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值