##
Linux 文件恢复的原理

###
inode 和 block

首先简单介绍一下 Linux 文件系统的最基本单元:inode。inode 译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是 inode,另一部份是 block,block 是用来存储数据用的。而 inode 呢,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode 为每个文件进行信息索引,所以就有了 inode 的数值。linux 操作系统下可以使用 ls –id 命令来查看文件或者目录的 inode 值,一般”root”目录的 inode 值为 2,一个分区挂载到一个目录下时,这个”root”目录的 inode 值为 2









1
                            <div data-line="crayon-52d677621606f795395412-2" style="background-color: inherit;">
                                2
                            </div>

                            <div data-line="crayon-52d677621606f795395412-3" style="background-color: inherit;">
                                3
                            </div>

                                &nbsp;

                        </div>
                    </td>
                    <td style="padding: 5px 16px 5px 12px; border: 1px solid rgb(153, 153, 153); border-image: none; height: 25px; -ms-word-break: break-all; min-height: 25px; min-width: 25px; background-color: inherit;">
                        <div style="font-size: 16px; min-width: 2px; background-color: inherit;">

                                # mount /dev/sdb2 /tmp

                            <div style="background-color: inherit;">
                                # ls -id /tmp
                            </div>

                            <div style="background-color: inherit;">
                                2&nbsp;/&nbsp;tmp
                            </div>

                                &nbsp;

                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>

        &nbsp;

</div>

###
文件恢复的原理

本文要介绍的命令是通过文件系统的 inode 值(一般是 2 )来获取文件系统信息。在 ext3 和 ext4 文件系统中,每个文件都是通过 inode 来描述其数据存放的具体位置,当文件被删除以后,inode 的数据指针部分被清零,文件目录区没有太多变化。文件的读写都是通过 inode 来实现,当 inode 数据指针被清零以后,即便文件内容还在,也没有办法把文件内容组合出来。当 ext3 和 ext4 文件系统中的元数据 metadata 发生变化时,相应的元数据 metadata 在日志文件会有一份拷贝。比如一个文件被删除了,它的 inode 信息会在日志文件中先保存一份,然后把要删除文件 inode 相关信息清零。这个日志文件是循环使用的,当操作过多时,删除的文件的 inode 日志记录会被新的数据替换,这就彻底丧失了根据 inode 找回数据的机会了。如果是大量文件的删除,这个日志文件会被反复循环利用多次,只留给最后删除的那些文件的恢复机会。

&nbsp;

<span style="font-family: &quot;Helvetica Neue&quot;, Helvetica, Tahoma, Arial, STXihei, &quot;Microsoft YaHei&quot;, 微软雅黑, sans-serif; font-size: 16px; font-style: normal; font-weight: normal; background-color: rgb(254, 254, 254);"><font color="#ff0000" style="background-color: inherit;">formost 是一个基于文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具</font></span><span style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, Helvetica, Tahoma, Arial, STXihei, &quot;Microsoft YaHei&quot;, 微软雅黑, sans-serif; font-size: 16px; font-style: normal; font-weight: normal; background-color: rgb(254, 254, 254);">。这个过程通常叫做数据挖掘(data carvubg)。formost 可以分析由 dd、Safeback、Encase 等生成的镜像文件,也可以直接分析驱动器。文件头和尾可以通过配置文件设置,也可以通过命令行开关使用 formost 内建的文件类型。formost 最初是由美国空军特别调查室(Air Force Office of Special Investigations)和信息系统安全研究中心(The Center for Information Systems Security Studies and Research)开发的,现在使用 GPL 许可。Foremost 支持恢复如下格式:avi, bmp, dll, doc, exe, gif, htm, jar, jpg, mbd, mov, mpg, pdf, png, ppt, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, zip。</span>

&nbsp;

<span style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, Helvetica, Tahoma, Arial, STXihei, &quot;Microsoft YaHei&quot;, 微软雅黑, sans-serif; font-size: 16px; font-style: normal; font-weight: normal; background-color: rgb(254, 254, 254);">foremost 支持的文件系统比较多(包括 ext2、 ext3 、vfat、NTFS、ufs、jfs 等)。不过 foremost 只能支持恢复特定格式的文件。</span>

其它 Linux 发行版用户可以在&nbsp;&nbsp;[`http://foremost.sourceforge.net/`&nbsp;](http://foremost.sourceforge.net/)&nbsp;下载源代码编译安装。

&nbsp;

要在 CentOS/RHEL 7 中安装 Foremost,需要首先启用 Repoforge:
# rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm# yum install foremost



 


下面看看使用方法。

恢复单个类型文件

笔者删除一个 USB(/dev/sdba1)存储器中一个 png 文件然后使用 formost 恢复。










1
                                <div data-line="crayon-52d6776216089149343922-2" style="background-color: inherit;">
                                    2
                                </div>

                                    &nbsp;

                            </div>
                        </td>
                        <td style="padding: 5px 16px 5px 12px; border: 1px solid rgb(153, 153, 153); border-image: none; height: 25px; -ms-word-break: break-all; min-height: 25px; min-width: 25px; background-color: inherit;">
                            <div style="font-size: 16px; min-width: 2px; background-color: inherit;">

                                    #rm -f /dev/sdb1/photo1.png

                                    #foremost -t png -i /dev/sdb1

                                    &nbsp;

                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>

            &nbsp;

    </div>

        &nbsp;

</div>

    恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立 png 子目录下会包括所有可以恢复的 png 格式的文件。

    需要说明的是 png 子目录下会包括的 png 格式的文件名称已经改变,另外 output 目录下的 audit.txt 文件是恢复文件列表。

    **恢复多个类型文件**

<div style="color: rgb(51, 51, 51); font-family: &quot;Helvetica Neue&quot;, Helvetica, Tahoma, Arial, STXihei, &quot;Microsoft YaHei&quot;, 微软雅黑, sans-serif; font-size: 16px; background-color: rgb(254, 254, 254);">
    <div data-settings=" minimize scroll-mouseover" style="background-color: inherit;">
        <div style="background-color: inherit;">
            <table border="1" cellpadding="2" cellspacing="0" style="font-size: 14px; margin-top: 10px; margin-bottom: 10px; display: table; border-collapse: collapse; background-color: inherit;">
                <tbody style="background-color: inherit;">
                    <tr style="background-color: inherit;">
                        <td data-settings="show" style="padding: 5px 16px 5px 12px; border: 1px solid rgb(153, 153, 153); border-image: none; height: 25px; -ms-word-break: break-all; min-height: 25px; min-width: 25px; background-color: inherit;">
                            <div style="font-size: 16px; min-width: 2px; background-color: inherit;">
                                <div data-line="crayon-52d6776216090903384318-1" style="background-color: inherit;">
                                    1
                                </div>

                                    &nbsp;

                            </div>
                        </td>
                        <td style="padding: 5px 16px 5px 12px; border: 1px solid rgb(153, 153, 153); border-image: none; height: 25px; -ms-word-break: break-all; min-height: 25px; min-width: 25px; background-color: inherit;">
                            <div style="font-size: 16px; min-width: 2px; background-color: inherit;">

                                    #foremost -v -T -t doc,pdf,jpg,gif -i /dev/sda6 -o /media/disk/Recover

                                    &nbsp;

                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>

            &nbsp;

    </div>

        &nbsp;

</div>

    恢复完成后会在当前目录建立一个 output 目录,在 output 目录下会建立四个子目录(/doc,/pdf,/jpg,/gif),分别包括四种类型文件。另外 output 目录下的 audit.txt 文件是恢复文件列表。

    &nbsp;

    <span style="text-align: justify; color: rgb(61, 68, 80); font-family: &quot;Microsoft Yahei&quot;, Helvetica, Arial, sans-serif; font-size: 15px; font-style: normal; font-weight: normal; background-color: rgb(255, 255, 255);">foremost可能运行很长时间,时间长短取决于分区的大小。</span>