• Linux 利用 /proc 目录恢复误删除的文件


    Linux 利用 /proc 目录恢复误删除的文件

    在 Linux 系统中删除文件时,无论文件是否在使用中,甚至是还在写入,都可以被 rm 删除。不过,rm 删除文件时并非是被真正地擦除,特别是当文件在被进程打开时,是可以恢复的。

    Linux 的每个文件对应一个 inode 号,它有两个计数 i_count(内存引用计数,当前使用这个文件的进程数量)和 i_nlink (磁盘引用计数,硬链接数量)。rm 操作时,把 i_nlink 数量减 1,但只要 i_nlink 和 i_count 任意一个不为 0 ,该文件并没有被系统删除,所占用的空间不会被回收。

    在 Linux 系统中,如果删除了一个较大的文件。虽然在文件系统中找不到该文件,但是用 df 命令查看时,发现磁盘空间并没有因为文件的删除而增大。很有可能是因为某个进程正在使用该文件,执行删除命令不会马上删除该文件,占用的磁盘空间也不会被立即释放。

    注意:利用 /proc 目录并不能恢复所有被删除的文件。只有删除某个进程正在使用的文件才能够恢复。

    下面模拟删除文件的恢复过程。删除 /home 目录下的文件。

    [root@localhost home]# pwd
    /home
    [root@localhost home]# echo 'abcdefg' > a.txt
    [root@localhost home]# ll
    总用量 4
    -rw-r--r--. 1 root root 8 1112 12:41 a.txt
    
    # 在另一个窗口使用 vi 编辑该文件,然后在当前窗口删除 a.txt 文件
    [root@localhost home]# rm -rf a.txt
    [root@localhost home]# ll
    总用量 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    恢复被删除的文件步骤如下:

    步骤一:使用 lsof 命令查看被删除的文件被哪个进程使用

    [root@localhost home]# lsof |grep 'a.txt'
    vi        27680          root    4u      REG              253,0     12288   50741027 /home/.a.txt.swp
    
    • 1
    • 2

    步骤二:进入【/proc/27680/fd】目录,找到该文件的文件句柄

    /proc/N/fd:包含进程相关的所有的文件描述符。

    [root@localhost home]# cd /proc/27680/fd
    [root@localhost fd]# pwd
    /proc/27680/fd
    
    [root@localhost fd]# ll
    总用量 0
    lrwx------. 1 root root 64 1112 12:43 0 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 1 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 2 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 4 -> /home/.a.txt.swp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    步骤三:直接复制文件句柄,并修改文件权限即可。

    [root@localhost fd]# ll
    总用量 0
    lrwx------. 1 root root 64 1112 12:43 0 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 1 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 2 -> /dev/pts/0
    lrwx------. 1 root root 64 1112 12:43 4 -> /home/.a.txt.swp
    
    [root@localhost fd]# cp /home/.a.txt.swp /home/a.txt
    [root@localhost fd]# ll /home/
    总用量 12
    -rw-r--r--. 1 root root 12288 1112 12:48 a.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    为了验证某些事,我实现了一个toy微前端框架【万字长文,请君一览】
    如何处理GPU训练显存不足[memory isn't enough][alloc failed][out of memory]
    一、vue介绍
    文件夹操作日志搜集器
    【图像分类】2017-MobileNetV1 CVPR
    自己动手从零写桌面操作系统GrapeOS系列教程——22.文件系统与FAT16
    拖放表格行
    我的创作二周年纪念日
    vue3-setup中如何通过ref调用子组件的函数
    LM1875L-TB5-T 音频功率放大器 PDF中文资料_参数_引脚图
  • 原文地址:https://blog.csdn.net/weixin_44377973/article/details/127818933