UNIX 系统被删文件的恢复策略

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
作者: 李贵林 陈朝晖

与DOS/Windows不同,UNIX文件被删除后很难恢复,这是由UNIX独特的文件系统结构决定的。UNIX文件目录不像DOS/Windows那样,文件即使被删除之后仍保存有完整的文件名、文件长度、始簇号(即文件占有的第一个磁盘块号)等重要信息;相反,它的文件信息全部依靠一种被称为i节点的数据结构来描述,而i节点在相应文件被删除之后即被清空,因此,要想直接恢复被删除的文件内容几乎是不可能的,必须另辟蹊径。本文结合实际,讨论几种文件恢复策略及其关键步骤的具体实现。

  一、UNIX文件系统结构

  我们知道,UNIX是以文件卷作为其文件系统存储格式的,而不同的UNIX系统,文件卷格式是有差异的,甚至即使是同一UNIX操作系统的不同版本,其文件系统未必完全相同,例如:SCO UNIX 4.1版与5.0版文件系统结构就有明显差异,但只要是UNIX系统,其文件卷的基本结构是一致的。分析如下:

  不管是什么UNIX系统,不管什么版本,其文件卷至少包括引导块、超级块、i节点表、数据区等几个部分。除此之外,不同UNIX版本可能还有不同的差异。例如:SCO UNIX系统的位图索引块和位图块AIX的逻辑卷表等。这些系统的特殊性不影响下文的恢复策略,故这里不作讨论,仅介绍标准UNIX文件卷结构。

  1. 引导块

  位于文件卷最开始的第一扇区,这512字节是文件系统的引导代码,为根文件系统所特有,其他文件系统这512字节为空。

  2. 超级块

  位于文件系统第二扇区,紧跟引导块之后,用于描述本文件系统的结构。如i节点长度、文件系统大小等,其结构存放于/usr/include/sys/filsys.h中,其结构如下:

  struct filsys

  {

  ushort s_isize; /*磁盘索引节点区所占用的数据块数*/

  daddr_t s_fsize; /*整个文件系统的数据块数*/

  short s_nfree; /*在空闲块登录表中当前登记的空闲块数目*/

  daddr_t s_free[NICFREE]; /*空闲块登记表*/

  short s_ninode; /*空闲索引节点数*/

  ino_t s_inode[NICINOD]; /*空闲节点登记表*/

  char s_flock; /*加锁标志位*/

  char s_ilock; /*节点加锁标志位*/

  char s_fmod; /*超级块修改标志*/

  char s_ronly; /*文件系统只读标志*/

  time_t s_time; /*超级块上次修改的时间*/

  short s_dinfo[4]; /*设备信息*/

  daddr_t s_tfree; /*空闲块总数*/

  ino_t s_tinode; /*空闲节点总数*/

  char s_fname[6]; /*文件系统名称*/

  char s_fpack[6];

  long s_fill[13]; /*填空位*/

  long s_magic; /*指示文件系统的幻数*/

  long s_type; /*新文件系统类型*/

  };

  3. i节点表

  i节点表存放在超级块之后,其长度是由超级块中的s_isize字段决定的,其作用是用来描述文件的属性、长度、属主、属组、数据块表等,其数据结构在/usr/include/sys/ino.h中,如下:

  struct dinode

  {

  ushort di_mode;

  short di_nlink;

  ushort di_uid;

  ushort di_gid;

  off_t di_size;

  char di_addr[40];

  time_t di_atime;

  time_t di_mtime;

  time_t di_ctime;

  };

  4. 目录结构

  UNIX所有文件均存放于目录中,目录本身也是一个文件。目录存放文件的机制如下:首先,目录文件本身也象普通文件一样,占用一个索引节点,其次,由这个索引节点得到目录内容的存放位置,再次,从其内容中取出一个个的文件名和它对应的节点号,从而访问一个文件。目录结构如下:

  索引节点号(2字节) .(本目录)(14字节)

  索引节点号(2字节) ..(父目录)(14字节)

  索引节点号(2字节) 文件名(14字节)

  索引节点号(2字节) 文件名(14字节)

  索引节点号(2字节) 文件名(14字节)

  由上可知文件名是依靠目录来描述的,文件的内容和其他信息则由索引节点来描述。

  二、文件的删除过程

  UNIX下删除一个文件的过程很简单,那就是释放索引节点表和文件占用的数据块,清空文件占用的索引节点,但不清除文件内容。但删除文件与删除目录的处理不尽相同,不同命令删除文件的过程也不相同。

  1. 删除一个文件

  UNIX 删除一个文件的具体步骤是:根据文件i节点的地址表逐一释放文件占用的磁盘数据块,然后清空相应的节点,最后释放i节点。

  2. 删除一个目录

  删除一个目录的过程:首先逐一删除目录里的所有文件,然后删除目录。目录本身也是一个文件,故删除方法与删除文件一致。

  3. 几种不同的删除命令

  .rm 命令

  一般删除命令,删除过程上述已说明。

  .mv命令

  格式:mv 文件1 文件2

  处理过程是将文件2的数据块释放,然后将文件1的名称改为文件2,再释放文件2所占的i节点。

  . > 命令

  格式:>文件名

  若产生一个新文件,>命令仅仅申请一个i节点,而不写入任何文件内容;若清空一个已经存在的文件,则释放文件所占的数据块,并将文件长度清零。

  三、被删文件的恢复策略

  要恢复被删除的文件,只能根据删除后留下的东西去做文章。文件被删除后留下了什么呢?由上述分析可知:其一、留下了文件的内容;其二、留下了“现场”。文件的恢复策略只能从这两个方面来分析。以下谈几种恢复策略。

  1.根据磁盘现场进行恢复

  如果文件被删除,现场未被破坏(即文件被删除后硬盘未发生过写操作),而且假定只删除了一个文件,那么可根据系统的分配算法进行恢复。因为系统建立一个文件时,必定根据某一特定的分配算法决定文件占用的数据块位置。而当该文件被删除后,它所占用的数据块被释放,又回到系统的分配表中,这时如果重新建立一个文件,系统根据原来的分配算法分配出的数据块必定跟该文件原来占用的数据块一致,而且我们知道,UNIX文件最后一数据块尾部多出的字节是全部置0的,据此只要调用系统的数据分配算法,在系统中一块块的申请数据块,因为UNIX文件最后一个数据块尾部多出的字节全部为0,所以,只要发现一个分配出的数据块中尾部全为0,即可认为文件结束,由此可确定文件长度和内容,进而实现恢复。方法如下:

  ⑴申请一个索引节点,即向系统申请创建一个新文件名而不写入任何内容。如:#>/tmp/xx

  ⑵调用系统分配数据块算法getnextfreeblock()得到一个数据块号,记入某一地址表变量中。

  ⑶读出这个数据块,判断其尾部是否全部连续为0,若不是,则回到(2),若是,则进行(4)。

  ⑷首先用系统函数fstat得到/tmp/xx的i节点号,然后将(2)步所得的地址表写入索引节点的地址表中(注意间址问题),并根据数据块个数和最后一块中有效数据长度计算出文件大小,写入i节点的di_size字段。

  ⑸回写系统的索引节点表即可。

  需要说明的是,第一,系统分配数据块的算法因不同的UNIX版本而不同;第二,有的UNIX如SCO UNIX 5.0版,其空闲数据块的分配和回收是使用一种动态链表的数据结构来实现的,它们的文件恢复更加容易,只要在空闲链表中的表尾去寻找即可,笔者另行描述。

  2. 根据内容恢复。

  若现场已被破坏,即硬盘发生过写操作,那么只好根据内容来恢复。而且,由于UNIX是一个多进程、多用户系统,它每一次开关机或硬件、通讯故障等都会记录系统日志、.sh_history等,硬盘现场被破坏可能性极大。因此讨论按内容恢复的方法具有更大的实用价值。笔者经过实际探索得出下列四种恢复策略供参考。

  ⑴关键字搜索法

  如果知道被删除的文件内容中若干字节的内容,而且该文件长度又不超过一个磁盘块,那么可以在整个文件系统中搜索这一字节串,得出一个文件所在的数据块,将它们的块号填入一个i节点,即可恢复一个文件,搜索文件系统的算法很简单,说明如下:

  a. #df -k 确定文件系统的设备文件名(如/dev/root)

  b.用下述函数搜索,若成功,返回数据块号,反之返回-1。其中fsname是文件系统的设备名,如/dev/root,comp()参数是实现搜索条件的函数。

  long searchfs(char *fsname , int comp())

  {

  FILE *fp;

  char buf[1024];

  long i=0;

  fp=fopen(fsname,"r");

  while (!feof(fp))

  {

  fread(buf,1024,1,fp);

  if (comp()) /* 检查是否符合搜索条件 */

  return i; /* 若成功返回块号 */

  i++;

  }

  fclose(fp);

  return -1; /* 未找到符合条件的块,返回-1*/

  }

  ⑵精确长度搜索法

  如果知道被删除文件的精确长度(字节数),那么可根据一个数据块的大小,计算出文件的最后一个数据块中数据的精确长度,该数据块中其他字节必然是全0。根据这一条件,通过搜索整个文件系统,找出其中符合条件的数据块,若出现多个块符合要求,则还需要根据其他条件区分。但不管怎样,根据精确长度分析也是恢复数据的一个策略。

  ⑶内容关联法

  如果知道文件内容中存在某种可实现的关联,例如文件的校验和,或者文件内容的某种上下文关系,那么也可通过搜索整个文件系统,通过反复尝试寻找符合关联条件的磁盘数据块,进而恢复一个文件。

  ⑷环境比较法

  如果知道删除文件所在的文件系统的安装过程,那么,另行找一台完全相的机器,按原来完全相同的步骤安装相同版本的UNIX和相应的其他软件,可以想象,新的机器环境会与原来的环境基本相同,比较两个机器上相同文件系统的内容,可以推断出被删除文件的大致位置,至少可以大大减少查找的范围,一旦查找的范围足够小时,可以用逐个观察和尝试的方法结合其他条件恢复数据,降低恢复的难度,增加恢复的可靠性。

  UNIX系统下文件系统恢复的具体实现依赖于不同操作系统和不同版本的具体文件系统结构和磁盘块分配算法。本文试图总结出一种一般性的思路和策略,限于篇幅,不能详细讨论它们的具体实现过程。

摘自: ccpi.gov.cn
解决数据库无法登录的问题(ERROR 2002) 连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock。如果你因为丢失套接字文件而不能连接,你可以简单地通过重启服务器重新创建得到它。发现登录成功,问题解决。若不修改/etc/my.conf 文件的访问地址也可做软连接到/tmp目录下实现登录。**在这之前,需要明白mysql.sock这个文件有什么用?#如果可以查到该文件,只需要做一个软连接到/tmp目录下即可。**该错误为找不到/tmp下的mysql.sock文件****以上两步执行如果找不到可执行下面命令** 阅读详情

相关推荐

Linux手把手教你用extundelete恢复误删文件(附详细安装配置流程)

本文详细介绍了在Linux系统中使用extundelete工具恢复误删文件的完整实战流程。当遭遇`rm -rf`误操作后,首要步骤是立即将分区挂载为只读以防止数据覆盖。文章提供了extundelete的编译安装、分区扫描、基于时间或路径的精准恢复等详细操作指南,并强调了恢复操作必须在独立分区进行的关键要点,是应对Linux数据丢失危机的实用救援手册。

weixin_29303701的博客 71

三十、Lunix恢复已rm文件+已删除但未释放空间(XFS+ext文件系统+lsof)

通过**rm -f**命令删除文件恢复: 1、lsof恢复:通过未结束的进程来恢复被删除的文件(任何类型文件系统) 2、`xfsdump`工具仅可以恢复`xfs`类型的文件,无法恢复`ext`类型的文件; 3、`extundelete`工具仅可以恢复`EXT`类型的文件,无法恢复`xfs`类型的文件

✅ 专注企业级 Linux/DevOps 运维的实战派 ✅ 已输出上百篇可落地方案 ✅ Shell 脚本开箱即用 ✅ K8s/YAML 环境验证 ✅ 故障排查链路完整复现 1028

Linux数据恢复核心工具原理与分层实战指南

Linux数据恢复本质是基于存储原理的逆向工程,而非简单软件操作。其底层依赖文件系统元数据(如ext4 superblock、GPT分区表)、磁盘物理结构(坏道分布、TRIM机制)及进程资源管理(/proc/PID/fd)。关键工具如ddrescue专注扇区级镜像与坏道跳过,TestDisk通过数学计算重建分区头,PhotoRec依据487种文件头签名实现无文件系统恢复,debugfs直探inode结构,lsof则利用Linux内核的文件描述符机制找回已删但未释放的文件。这些能力共同构成覆盖物理层、分区层、

weixin_34059951的博客 485

UNIX系统被删文件恢复策略

与DOS/Windows不同,UNIX文件被删除后很难恢复,这是由UNIX独特 的文件系统结构决定的。UNIX文件目录不像DOS/Windows那样,文 件即使被删除之后仍保存有完整的文件名、文件长度、始簇号(即 文件占有的第一个磁盘块号)等重要信息;相反,它的文件信息全部 依靠一种被称为i节点的数据结构来描述,而i节点在相应文件被删 除之后即被清空,因此,要想直接恢复被删除的文件内容几乎是 不可

水之轮回 1433

Unix删除文件的找回方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34066347的博客 339

UNIX系统被删文件恢复策略(转)

UNIX系统被删文件恢复策略(转)   与DOS/Windows不同,UNIX文件被删除后很难恢复,这是由UNIX独特的文件系统结构决定的。UNIX文件目录不像DOS/Windows那样,文件即使被删除之后仍保存有完整的文件...

cuemes08808的博客 236

UNIX系统被删文件恢复策略(ext3被删除的恢复)

http://linux.sheup.com/linux/40/linux30789.htm http://hi.baidu.com/beibeiboo/blog/item/326391c473b20ba08326ac18.htmlhttp://www.router.net.cn/Article/22101.htmlLinux EXT3下删除MySQL据库数据恢复

cnbird's blog 704

Linux文件系统删除文件深入剖析

与DOS/Windows不同,UNIX文件被删除后很难恢复,这是由UNIX独特              的文件系统结构决定的。UNIX文件目录不像DOS/Windows那样,文              件即使被删除之后仍保存有完整的文件名、文件长度、始簇号(即              文件占有的第一个磁盘块号)等重要信息;相反,它的文件信息全部              依靠一种被称

2611

小记Linux/UNIX下错删文件恢复

原文请猛戳:http://galoisplusplus.gitcafe.io/blog/2016/02/02/how-to-restore-deleted-file-in-linux/ 一个月前,我的洁癖犯了,想执行find . -name "*~" -exec rm {} \;清下某目录下由vim生成的~文件,不料漏打了~,把一些文件删...

weixin_34014555的博客 215

ext2文件系统下反刪除方法

檔案刪除的回復救援今天幹了件很蠢的事情~.. 想要將 a電影.srt 改成跟 電影.avi 同名字.於是就下了 mv a電影.srt 電影.avi ... 當按下 enter 時清醒了過來...發現到那 avi 已經被我清掉了.. 變 srt 了... :~於是就有這篇文章的由來.... 嗚... :~雖然是寫說檔案刪除的回復救援, 但事實上我沒有成功救回來.. XD主要是因為還要 mount

Chopin's nocturnes 2395

Linux VPS文件系统布局实战指南:从目录职责到故障预防

Linux文件系统布局(FHS)是操作系统稳定运行的基础架构,其核心在于通过标准化目录分工实现容错、安全与可维护性。/bin与/usr/bin分离保障系统急救能力,/etc作为配置唯一源需严格权限管控,/var专为动态数据设计必须独立分区防爆满,/tmp启用tmpfs可提升性能并延长SSD寿命。这些设计直接决定VPS在资源受限、无GUI、恢复链路长等场景下的健壮性。理解各目录的职责边界、典型误操作及验证方法,是避免服务崩溃、日志失控、磁盘占满等高频故障的关键。本文聚焦Ubuntu VPS真实环境,提供可立即

无花的专栏 719

档案删除的回复救援

  今天干了件很蠢的事情~.. 想要将 a电影.srt 改成跟电影.avi 同名字.于是就下了 mv a电影.srt 电影.avi ... 当按下 enter 时清醒了过来...发现到那 avi 已经被我清掉了.. 变 srt 了... :~于是就有这篇文章的由来.... 呜... :~虽然是写说档案删除的回复救援, 但事实上我没有成功救回来.. XD主要是因为还要 mount -ro 而

jiangxinyu的专栏 2846

Ubuntu遇到的问题解决方法

安装包依赖问题解决方法。

ZYL142857的博客 745

Linux VPS文件系统布局(FHS)核心原理与实战指南

Linux文件系统层次结构(FHS)是POSIX系统的基础规范,定义了/bin、/etc、/var、/usr等目录的法定职责、生命周期与权限边界。其设计源于解决Unix时代软件安装权属混乱的历史问题,通过静态/动态、系统/用户、运行时/持久化三重维度实现模块化隔离。FHS保障包管理器精准卸载、服务配置与日志分离、内核参数实时映射(如/proc/sys),并支撑Docker镜像构建、systemd服务管理、日志轮转等现代运维实践。理解FHS不是记忆路径,而是掌握Linux操作系统‘宪法级’协作逻辑——本文聚焦

weixin_34235457的博客 374
上一篇: 支持/兼容 Linux 的嵌入式单板机快速参考指南
下一篇: Linux系统下网络分析例解
zcatlinux
博客等级 码龄22年 56粉丝 760原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值