Linux 误删除文件一般场景如下:
场景一:删除文件时,文件正在被其他进程调用
场景二:删除文件时,文件没有被其他进程调用
对于进程正在使用文件的场景,数据可以恢复是由于Linux系统下文件包含两个部分:inode 和 block ,其中 inode 中每个文件都有 2 个计数器:i_count 和 i_nlink 。只有当 i_count 和 i_nlink 均为 0 时,文件才算被删除,但被其他进程调用的文件,i_count 将不为 0。
i_count :当一个文件被一个进程引用时,其数值会增加 1,主要是用来记录文件被进程引用的次数
i_nlink :记录硬链接个数
1.创建测试文件 Delete.txt ,并使用 tail -f 程序持续调用此文件;
2.在新终端中,使用 rm -rf 命令删除该文件;
3.lsof 查看被删除文件 Delete.txt 的被调用情况;
4.在 /proc/21205/fd 目录下查找 Delete.txt 文件(fd 目录下可查看当前进程持有的文件句柄);
5.使用 cp 命令直接恢复到对应目录,核实文件完整性;
没有被进程调用且无其他硬链接的文件在被删除后,i_count 和 i_nlink 将为 0。但文件本身依赖于两部分【inode & block】,rm 操作本身删除的仅是 inode 连接信息,不会删除 block ,而真正的数据恰恰是存在于 block 中的,故可当前场景下可通过 block 找回数据【需要借助 extundelete】。
inode :用于存放文件的元数据,并通过索引信息关联到磁盘中具体 block 单元
block :数据块,用来实际存放数据的单元
如果有进程在不断往磁盘写入数据,此时如果将对应的数据分配到之前被误删除的 block 上时,block 上原始的数据将被覆盖,这个时候数据将无法再次找回,故当前场景下找回时,请务必在发生数据误删除时,停止一切写入操作【①umount磁盘;②readonly挂载磁盘】
1.先 yum 安装 extundelete;
2.数据盘 vdb 初始化后挂载到 mnt ,在 mnt 下创建文件 Delete.txt 和 目录 Delete.dir;
3.rm -rf * 删除 mnt 目录下所有文件和目录;
4.卸载数据盘 vdb ,防止数据后续的数据写入覆盖 block 中误删除的数据;
5. extundelete 命令核实此磁盘 block 中被删除的文件信息【extundelete /dev/vdb --inode 2】;
6.extundelete 命令恢复文件和目录;
extundelete /dev/vdb --restore-all 尝试恢复所有,执行完成后发现产生新目录(RECOVERED_FILES):
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。