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

2023-10-27

与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节点的地址表逐
一释放文件占用的磁盘数据块,然笄蹇障嘤Φ慕诘悖詈笫头舏
节点。

  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系统下文件系统恢复的具体实现依赖于不同操作系统和
不同版本的具体文件系统结构和磁盘块分配算法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 打包用来部署跨平台?

    在 Windows 上 应用程序通常打包为 MSI 在 Redhat Linux 上打包为 RPM 可用于将应用程序部署到所有平台 包括不同风格的 UNIX 和 Windows 的最佳开源打包方法是什么 内容包括 exe unix 二进制文
  • 将多个参数传递给 UNIX shell 脚本

    我有以下 bash shell 脚本 理想情况下我会用它来按名称杀死多个进程 bin bash kill ps A grep awk print 1 然而 虽然此脚本有效 但传递了一个参数 端镀铬 脚本名称为end 如果传递多个参数 则它不
  • 如何使用 diff 排除多行模式?

    我想对两个 xml 文件进行比较 但忽略 2 3 行模式 例如 假设我想在比较下面的 xml 格式时忽略可用性和价格 这是我到目前为止所拥有的 diff I
  • 在单个命令中使用前缀重命名文件夹中的所有文件

    重命名带有前缀的文件夹中的所有文件 Unix 假设一个文件夹有两个文件 a txt b pdf 那么它们都应该从一个命令重命名为 Unix a txt Unix b pdf 如果您的文件名包含没有空格并且你没有任何子目录 你可以使用一个简单
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 如何在gcc中打印UINT64_t?

    为什么这段代码不起作用 include
  • Python 用静态图像将 mp3 转换为 mp4

    我有x文件包含一个列表mp3我想转换的文件mp3文件至mp4文件带有static png photo 似乎这里唯一的方法是使用ffmpeg但我不知道如何实现它 我编写了脚本来接受输入mp3文件夹和一个 png photo 然后它将创建新文件
  • 如何在Unix中将相对路径转换为绝对路径[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想转换 相对路径 home stevin data APP SERVICE datafile txt to 绝对路径 home stev
  • 类unix系统中的python和python3命令有什么区别?

    我通读了每个命令的描述 但每个命令的描述都是完全相同的 所以我不明白这两个命令在类 Unix 系统中的工作方式有何不同 谁能解释其中的区别吗 Python3命令的引入是因为python命令指向了python2 从那时起 Python3 已成
  • 我的 unix 脚本出了什么问题

    bin bash while echo n Player s name read name name ZZZ do searchresult grep name playername if searchresult 0 then echo
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • SCP 权限被拒绝(公钥)。仅当在目录上使用 -r 标志时才在 EC2 上

    scp r Applications XAMPP htdocs keypairfile pem uploads ec2 user publicdns var www html 其中 uploads 是目录 返回权限被拒绝 公钥 Howeve
  • UNIX系统调用监视器

    如何监控进程的系统调用 Check strace http linux die net man 1 strace 在最简单的情况下 strace 运行指定的命令直到退出 它拦截并记录进程调用的系统调用以及进程接收的信号 每个系统调用的名称
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • awk/Unix 分组依据

    有这个文本文件 name age joe 42 jim 20 bob 15 mike 24 mike 15 mike 54 bob 21 试图得到这个 计数 joe 1 jim 1 bob 2 mike 3 Thanks awk F NR
  • ssh远程变量赋值?

    以下内容对我不起作用 ssh email protected cdn cgi l email protection k 5 echo k 它只是返回一个空行 如何在远程会话 ssh 上分配变量 Note 我的问题是not关于如何将本地变量传
  • 针对库编译时出现“未定义引用”错误

    我在代码中添加了第三方库 但在运行时遇到这样的错误make 请帮助我理解这个错误 text 0x9b4 undefined reference to snd strerror home bet Tent tun app Common hl
  • 为什么main()后面有函数定义?

    我假设最常用的系统功能之一 ls由最权威的程序员之一 Richard Stallman 编写的最著名的操作系统之一 linux 的代码可能是真正编写良好的代码的一个例子 因此 由于它是开源的 我决定看一下代码 参见例如here http m
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL

随机推荐

  • 如何高效的进行版本管理,版本管理的方法

    如何进行高效的版本管理 版本管理的方法 云效Projects版本管理为不同的产品线 模块建立版本 对集成版本进行相关活动的管理 在Projects版本管理中规划发布内容 可以关联需求 任务 缺陷 立即体验 开启版本管理 项目管理员和项目拥有
  • 【Hyper-v 管理器虚拟机配置内网外网固定ip】

    1 Default Switch Hyper v默认虚拟网卡 无法设置固定ip Hyper V自带一个不能删除的Default Switch虚拟交换机 虚拟机使用该网络可以自动获取IP直接上网 但这个网络的网关地址每次重启后都会改变 所以你
  • 原生Servlet与Spring Controller性能比较

    在实际项目工作 有同事提出 Java原生的Servlet性能 响应速度与并发数 要比封装过的Spring Controller高 基于这点 楼主用Apache的ab工具 对两个简单的应用做1000并发压力测试 查看两者的响应速度与并发数 平
  • 元旦过后

    今天是13号了 自从元旦过后 就一直没有做什么事情 觉得好空虚啊 一心只盼望着过年放假回家 哎 感觉熬日子啊 本来就觉得日子过得好快 却还不懂得珍惜 不能这样了哈 在回家之前先做点有用的事情吧 讲一个小故事吧 一天 有一个姑娘去买红薯 本来
  • 解决video标签播放m3u8格式视频失败问题

    前言 什么是m3u8 效果 效果地址 m3u8视频切换 效果图片 解决方法 采用video js插件 引入 引入videoJS插件样式文件 引入videoJS插件JS文件 引入videoJS插件播放m3u8格式视频的HLS功能 HTML代码
  • 定时检测接口是否正常飞书告警脚本

    第一版 支持多个接口地址 循环检测 定时每分钟执行一次脚本 告警效果 脚本 飞书机器人创建忽略跳过 各大协作平台大同小异拿出机器人hook地址 bin bash URL LIST https gatewaxxxxxxxxxxxxxxxxxx
  • 笔记本电脑键盘失灵一键修复_笔记本部分按键失灵的键盘可以用了,省下键盘的钱...

    情况 笔记本曾经拆装 清理灰尘之类 也重装过系统 键盘可以使用 就是部分按键失灵 触控板正常使用 驱动也安装了 最初判断 键盘坏了 但笔记本电脑键盘拆卸比较麻烦 没有动手 实际原因 驱动问题 处理方法 更新驱动即可 具体操作如下 右击此电脑
  • python逻辑判断

    1 if语句 info my name is xiaomu info list info split print info list if info list 0 xiaomu info list 0 dewei if info list
  • 【Matlab】二维图绘制及填色总结(basic)

    编程渣的艰难探索之Matlab绘图 个人需求 用matlab绘制多条曲线并在指定不规则区域填色 为什么一定要用Matlab呢 因为我觉得图形便于修改 看起来较为正规 代码量较少 1 同时绘制多条曲线 1 1 基本代码 真的很基础 x 0 0
  • redis在springboot中如何配置并启动

    在Spring Boot中配置和启动Redis非常简单 首先你需要安装Redis 然后添加一个Redis的配置文件 然后在Spring Boot的配置文件中添加相关的Redis配置信息 最后通过Spring Boot启动Redis即可
  • linux搭建FTP服务器步骤

    linux搭建FTP服务器 在linux操作系统中搭建ftp服务器 ftp服务器会提供三种远程登录方式 分别是匿名登录方式 本地用户方式和虚拟用户方式 这里我将把这三种搭建ftp服务器的操作步骤分享出来 供大家参考 一 匿名搭建 1 安装F
  • 22年字节跳动飞书人力套件二面面经

    前言 前文链接 https www hengy1 top article c956b8c6 html 简单介绍本次面试 波澜起伏吧 面试完自己心里没有啥底 24届本科菜鸡 没网上问的那么难 八股偏少 话不多说了直接来个复盘 二面 70min
  • logging模块学习

    logging 基础知识 logging的基础知识 logging basicConfig 参数介绍 filename 创建一个 FileHandler 使用指定的文件名 而不是使用 StreamHandler filemode 如果指明了
  • go socket编程

    8 1 Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket 话虽然有点夸张 但却也几乎如此了 现在的网络编程几乎都是用Socket来编程 你想过这些情景么 我们每天打开浏览器浏览网页时 浏览器进程怎么和Web服务器进行
  • kafka查询指定消费Group未消费的数据

    最近线上出现kafka生产者发送成功了 但是消费者没有拉取到 出现这种现象是偶发的 就是在几分钟内有几个消息没消费到 后面就没再出现过 首先先去卡夫卡上确认是否有消息堆积 下载kafka 不是src版的哦 http kafka apache
  • SQl CASE WHEN 语句的嵌套使用方式

    select id userid ys case when pj ys is NULL then case when pj ys1 is NUll then ys else pj ys1 end else pj ys end t from
  • 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法

    前言 梦想就是一种让你感到坚持就是幸福的东西 技巧分享篇 如何从GitHub上下载某个项目中单个文件的方法 一 Github项目里的单个js文件下载实例演示 1 点击查看文件 2 点击源码 Raw 3 通过 ctrl s 保存即可 二 Gi
  • Obsidian利用插件Remotely-save实现超低成本全平台云笔记

    Obsidian作为一个笔记软件 是目前最满足我需求的了 本地存储文件 Markdown格式作为基础 双链支持 以及好用的搜索等功能 基本实现了我对一款文字笔记软件的要求 但是Obsidian的收费价格确实不低 虽然软件本身的所有功能基本免
  • Visual Unit 简明教程

    载自 http www vckbase com index php wv 1270 VU1 0 简介 Visual Unit 简称VU 是新一代单元测试工具 功能强大 使用简单 完全可视化 不需编写测试代码 VU的测试结果使程序行为一目了然
  • UNIX系统被删文件的恢复策略

    与DOS Windows不同 UNIX文件被删除后很难恢复 这是由UNIX独特 的文件系统结构决定的 UNIX文件目录不像DOS Windows那样 文 件即使被删除之后仍保存有完整的文件名 文件长度 始簇号 即 文件占有的第一个磁盘块号