ext2文件系统删除后的恢复
一种基于linux文件系统的数据恢复方法

一种基于linux文件系统的数据恢复方法标题:一种基于Linux文件系统的数据恢复方法在现代信息技术环境中,数据安全与数据恢复的重要性不言而喻。
Linux 作为一种广泛应用的操作系统,其稳定性和安全性备受赞誉,但即使是Linux系统,也无法完全避免因误操作、系统崩溃、硬件故障等原因导致的数据丢失问题。
本文将详细介绍一种基于Linux文件系统的数据恢复方法,帮助用户在面临数据丢失困境时能够有效找回重要信息。
【一、理解Linux文件系统】首先,理解Linux文件系统的工作原理是进行数据恢复的前提。
Linux系统主要采用EXT2、EXT3、EXT4、XFS、Btrfs等文件系统,它们负责管理存储设备上的数据和元数据,包括inode(索引节点)、超级块、目录项等关键部分。
当数据丢失时,通过分析这些元数据,我们可以定位到文件的存储位置以及文件的状态信息。
【二、数据丢失场景及应对策略】1. 误删除:当文件被误删除时,实际上只是从目录项中移除了对该文件的引用,而文件内容可能并未立即被覆盖。
可以使用诸如TestDisk或extundelete这类工具尝试恢复已删除文件。
2. 分区表损坏:若分区表出现问题,可通过TestDisk扫描硬盘并重建分区表以找回丢失的分区及其数据。
3. 文件系统损坏:如遇到文件系统损坏的情况,可先尝试fsck工具进行修复,对于严重损坏的文件系统,可能需要使用photorec等深度扫描工具根据文件签名来恢复数据。
【三、数据恢复步骤详解1. 创建备份:在对受损文件系统进行任何操作之前,首要任务是确保原始数据的安全,通过dd命令或者其他备份工具,将待恢复数据所在的整个分区制作成镜像文件。
2. 检测与修复文件系统:运行`fsck /dev/sdaX`(其中sdaX代表受损分区)进行文件系统的初步检查和修复。
3. 使用数据恢复工具:- 对于误删除文件,可以尝试使用extundelete工具,例如:`extundelete /dev/sda1 restore-file /path/to/deleted/file` - 针对分区丢失,利用TestDisk执行“Analyze”和“Quick Search”等功能搜索丢失分区并尝试恢复。
euleros 格式化磁盘指令

euleros格式化磁盘指令在计算机系统中,磁盘是存储数据的重要设备之一。
磁盘的格式化是指对磁盘进行初始化,以便于存储数据和使用操作系统。
euleros是一个流行的操作系统,它提供了一系列的格式化磁盘指令,帮助用户对磁盘进行管理和维护。
本文将介绍euleros的格式化磁盘指令,帮助读者了解如何使用这些指令来管理磁盘。
一、查看磁盘信息在进行磁盘格式化之前,首先需要了解磁盘的相关信息。
euleros提供了一些命令来帮助用户查看磁盘的信息,包括磁盘的大小、分区信息等。
用户可以使用以下命令来查看磁盘信息:1. fdisk -l:这个命令可以列出系统中所有的磁盘信息,包括磁盘的名称、大小、分区情况等。
用户可以通过这个命令来了解系统中磁盘的整体情况。
2. df -h:这个命令可以列出系统中已挂载的文件系统的信息,包括文件系统的大小、已用空间、可用空间等。
用户可以通过这个命令来了解系统中已挂载的文件系统的情况。
二、格式化磁盘当用户了解了磁盘的相关信息之后,就可以对磁盘进行格式化操作了。
euleros提供了一些命令来帮助用户对磁盘进行格式化,包括创建文件系统、设置文件系统的参数等。
用户可以使用以下命令来格式化磁盘:1. mkfs.ext4:这个命令可以创建ext4文件系统,用户可以将其用于磁盘的格式化操作。
用户可以通过指定参数来设置文件系统的相关属性,比如inode大小、块大小等。
2. mkfs.xfs:这个命令可以创建xfs文件系统,用户可以将其用于磁盘的格式化操作。
用户可以通过指定参数来设置文件系统的相关属性,比如inode大小、块大小等。
三、挂载磁盘在格式化磁盘之后,用户还需要将其挂载到系统中,以便系统可以对其进行读写操作。
euleros提供了一些命令来帮助用户挂载磁盘,包括挂载点的设置、挂载参数的设置等。
用户可以使用以下命令来挂载磁盘:1. mount:这个命令可以将格式化好的磁盘挂载到指定的挂载点上。
蓝梦科技数据恢复技术

FAT/NTFS/exFAT文件系统数据恢 复
FAT/NTFS/exFAT 是Windows下的文件系统, 按理说是比较容易的,但是看完NTFS文件 系统以后,觉得微软的设计也不是那么简 单。 NTFS文件系统已经完成了研究工作。这些恢 复是数据恢复的基础,必须得弄清楚。 FAT 与 exFAT 恢复技术类似,几乎都是通过 FAT表和目录区进行恢复
手机数据恢复
当前恐怕已经是每人好几个手机的年代了,
误删除,刷机,初始化等造成文件丢失的 情况太多了。技术难点也许就是如何让我 们的电脑能识别到手机存储设备和提取通 讯录/短信箱中信息了。蓝梦科技研发了 BestRecoverForPhone解决了此类问题。
监控数据恢复
监控录像运用的场所太多了。但是此类设
Oracle数据文件提取恢复技术
数据恢复最有意思的恢复方法,恐怕就是
Oracle 数据文件的提取技术了。这种恢复 技术将数据恢复技术发挥到了极致。比如 说:在JFS、UFS、VxFS等文件系统下删 除文件,特别是多个大的文件,理论上是 不可能恢复的。但是如果你删除的是oracle 数据文件,那就是有可能恢复。这是因为 oracle 数据文件本身特征很明显,弄清楚 oracle数据文件结构,整个卷扫描,就能提
MAC HFS/HFS+文件系统数据恢复
苹果系统MAC采用HFS/HFS+/HFSX 文件系 统,蓝梦科技花费了不少精力去读懂这个 比较复杂的文件系统,最后实现了数据恢 复方法。它采用的是B+Tree的方式存储文 件,结构非常复杂,恢复技术难度系数高。 可以用BestRecoveryForMac来进行数据恢复。
目前蓝梦科技的 RAID 功能可以涵括所有的 阵列组合方式,如RAID0、RAID1、 RAID5、RAID10、ADG、RAID6、 RAID5E 、 RAID5EE 、 JBOD 、HP 双循环 等组合方式。
linux数据恢复

linux数据恢复Linux数据恢复引言在日常使用计算机过程中,数据丢失是一个常见的问题,可能是由于误操作、病毒感染、文件系统损坏等原因导致。
针对这些问题,我们需要一种可靠的数据恢复方法来帮助我们找回丢失的数据。
Linux作为一种开源操作系统,其数据恢复工具的丰富性和强大性使其成为很多人首选的操作系统。
本文将介绍在Linux系统下进行数据恢复的常见方法和工具,帮助用户快速恢复数据。
一、文件恢复方法1. 备份恢复在进行任何文件恢复操作之前,我们强烈建议首先查看您的备份,并尝试从备份中恢复丢失的数据。
如果您定期备份您的数据,您可以轻松地恢复丢失的文件。
备份通常可以通过使用备份工具,如rsync,tar等实现。
备份恢复是一种非常有效的数据恢复方法,因为它可以准确地恢复您需要的文件,而不会丢失任何数据。
2. 使用恢复工具如果没有备份,还有其他方法可以尝试恢复丢失的数据。
Linux系统提供了一些强大的数据恢复工具,可以帮助您找回已删除、格式化或损坏的文件。
以下是一些常用的数据恢复工具:- TestDisk:TestDisk是一个免费的开源工具,可以帮助您恢复丢失的分区和修复损坏的引导扇区。
它支持多个文件系统,包括FAT、NTFS、ext2/ext3/ext4等。
- PhotoRec:PhotoRec是TestDisk的一部分,它专门用于恢复丢失的文件。
它可以从格式化的硬盘、临时分区、CD-ROM等设备中恢复各种类型的文件。
- Scalpel:Scalpel是一种高效的文件恢复工具,它可以通过扫描二进制文件内容来恢复已删除的文件。
它支持各种文件系统,并可以通过配置文件来进行高级恢复操作。
- extundelete:如果您使用的是ext2/ext3/ext4文件系统,并且需要恢复已删除的文件,extundelete是一个非常有用的工具。
它可以查找并还原被删除文件的inode,并将其恢复到原来的位置。
这些工具都支持命令行操作,并且有详细的文档和示例,您可以根据需要选择合适的工具使用。
Linux系统ext2与ext3文件系统的区别与转换

ext2和ext3是Linux比较旧的文件系统, 在Linux 7中支持的文件系统已经是 “xfs”,但是为了知识的衔接性,也为 了更深的认识文件系统之间的差别有必 要认识一下这两个文件系统。 这两个文件系统的格式是相同的,不 同的是在ext3文件系统中在硬盘的后面 留出一块磁盘空间来存放日志(journal) 记录。
全部消失。 如果你接手一个很重要的Linux系统, 而这个Linux系统的文件系统还是很老的 ext2,而为了提高性能还要保留原来的 数据就只能使用命令tune2fs命令(在线 转换文件系统ext2→ext3)了。
除了使用“-j”选项创建ext3文件系 统之外,可以直接使用mkfs.ext3 设备名
在开机时Linux系统都会检查每个文件 系统的Valid bit,值如为1则直接挂载该 文件系统,而如果为0值,则系统会扫描 这个文件系统(硬盘分区)查找损坏的 数据,如果这个硬盘分区很大,扫描时 间会很长。 1扫描
0不扫描 由于ext3文件系统有日志机制,开机 时系统会先检查日志中的信息,检查日
创建ext3文件系统。
journal=”日志”
使用命令dumpe2fs /dev/sdc1 | more 可以看到成功创建ext3文件系统。
二、在ext3格式文件系统上,数据写 入硬盘的操作过程为: ⑴数据同样先写 入缓冲区 ① ⑵当数据写入 缓冲区 (内存) 缓冲区满时,先通知 ③ 日志 ext3 文件 ⑶通知日志之后 ② ④ 系统 数据才会写入硬盘中 日志 ⑷数据写入硬盘后,系统 再通知日志数据已经写入硬盘。
三、日志机制 在ext2和ext3中,文件系统的格式是 一样的,不一样的地方是ext2没有日志 机制,而ext3有日志机制。 对于ext2,由于它没有日志机制,在 Linux使用Valid bit标志位来记录系统在 关机之前该文件系统是否已经卸载。因 每一个文件系统都有一个自己的Valid bit 。并且,Valid bit的值为1,则表示这个 文件系统已经卸载,而其值为0,则表示 这个文件系统没有正常关机。
电脑重装系统后怎么恢复原来的文件方法

电脑重装系统后怎么恢复原来的文件方法电脑重装系统后怎么恢复原来的文件?计算机文件(或称文件、电脑档案、档案),是存储在某种长期储存设备上的一段数据流。
所谓“长期储存设备”一般指磁盘、光盘、磁带等。
其特点是所存信息可以长期、多次使用,不会因为断电而消失。
下面就由店铺来给大家说说电脑重装系统后怎么恢复原来的文件吧,欢迎大家前来阅读!电脑重装系统后恢复原来的文件方法建议你使用DiskGenius软件来恢复你失去的文件。
DiskGenius 是一个硬盘分区、数据恢复软件,操作界面完全图形化,非常直观,一看就会,操作简便。
你到网上通过搜索“DiskGenius”就可以找到下载地址。
运行DiskGenius程序,打开程序窗口,你会看到硬盘的分区情况,主分区和逻辑分区一目了然。
你选中要恢复文件的分区,点击工具栏上的“恢复文件”按钮,即可将文件恢复到其他盘。
下面店铺就给大家介绍下什么是DiskGenius吧。
DiskGeniusDiskGenius是一款硬盘分区及数据恢复软件。
它是在最初的DOS 版的基础上开发而成的。
Windows版本的DiskGenius软件,除了继承并增强了DOS版的大部分功能外(少部分没有实现的功能将会陆续加入),还增加了许多新的功能。
如:已删除文件恢复、分区复制、分区备份、硬盘复制等功能。
另外还增加了对VMWare、Virtual PC、VirtualBox虚拟硬盘的支持。
更多功能正在制作并在不断完善中。
功能介绍DiskGenius软件的主要功能及特点如下:1、支持传统的MBR分区表格式及较新的GUID分区表格式。
2、支持基本的分区建立、删除、隐藏等操作。
可指定详细的分区参数;3、支持IDE、SCSI、SATA等各种类型的硬盘。
支持U盘、USB 硬盘、存储卡(闪存卡);4、支持FAT12、FAT16、FAT32、NTFS文件系统;5、支持EXT2/EXT3文件系统的文件读取操作。
支持Linux LVM2磁盘管理方式;6、可以快速格式化FAT12、FAT16、FAT32、NTFS分区。
恢复linuxext4分区上误删除的文件。

恢复linuxext4分区上误删除的⽂件。
我是使⽤ Xmanager Enterprise 4 来连接CentOS Linux 6.4 的。
可恶的XManager有⼀个恶⼼的bug,时不时的出现焦点问题:2012年10⽉15⽇星期⼀,14:44:01==============================================温馨提⽰: Xmanager有个⽑病就是时不时的出现窗⼝之间焦点的切换必须点击菜单栏上⾯的 title 才可以,⽽且不能⽤alt拖动窗⼝了.有时⼜可以..解决⽅法:打开后,按住 win+D 再win+D焦点的切换就会发⽣变化了...可以点击内容切换⽽且,也可以使⽤alt 移动窗⼝了....2013年5⽉25⽇今天,14:09:40==============================================键盘上按p键也会失效。
需要win+D 多次才会解决这个问题不知道有⼈遇到过这个问题没,使⽤ XMing 来连接xdmcp 倒是没问题,⽽且xmanager⽆法hook快捷键,⽤起来快捷键使⽤起来不⽅便,这个就不说了,但是上⾯的我确认是⼀个 BUG。
很恶⼼。
这次我要删除⼀个桌⾯的⽂件,点击后,shift+del 回车,快速删除,⼀看⽂件,没删除,难道。
看看另⼀个nautilus 窗⼝,正在浏览⾃⼰的ftp服务,缺少了⼀个⽂件夹,我勒个去啊。
如果是ntfs分区,windows下的,我可以diskgenius + winhex 速度恢复⽂件。
但是ext4分区下,我真没⼲过这种事情啊。
搜索⼀下,/Qunero/blog/8607今天⼀时⼿快 rm -rf .* ,删除了⼀个重要邮件⽬录,幸好通过extundelete恢复了。
记下操作流程:1.准备⼯作主要通过 extundelete 0.2.0完成恢复https:///projects/extundelete/files/latest/download需要依赖两个包sudo aptitude install e2fsprogs e2fslibs-dev下载页⾯/快速下载: download extundelete编译三部曲./configuremakesudo make install2.如果分区已经挂载,先umount,并且在将要恢复的地⽅查看空间⼤⼩df -h ./如果你要恢复的是根⽬录或者系统⽬录就只有拿硬盘挂到另外⼀台电脑上操作了。
D-Recovery For Linux Manual达思Linux系统数据恢复软件使用说明书

达思Linuxs数据恢复软件说明文档达思凯瑞技术(北京)有限公司2010-9-20D-Recovery for Linux使用说明目录1、D-Recovery for Linux介绍___________________________________ 31.1 分区表损坏_____________________________________________________ 3 1.2 删除文件_______________________________________________________ 3 1.3 高级格式化_____________________________________________________ 3 1.4 文件系统损坏____________________________________________________ 32、D-Recovery for Linux安装___________________________________ 32.1 安装环境要求____________________________________________________ 3 2.2 软件获取方式____________________________________________________ 4 2.3软件安装步骤___________________________________________________ 43、D-Recovery for Linux分区表恢复_____________________________ 83.1 分区表备份_____________________________________________________ 8 3.2 分区表恢复_____________________________________________________ 9 3.3 分区表重建____________________________________________________ 104、D-Recovery for Linux数据恢复_______________________________124.1 删除数据恢复___________________________________________________ 124.1.1 Ext2文件系统删除恢复 _________________________________________________ 124.1.2 Ext3,Ext4文件系统删除恢复_____________________________________________ 14 4.2 格式化数据恢复 _________________________________________________ 174.2.1 Ext2文件系统格式化或目录损坏恢复_____________________________________ 174.2.2 Ext3,Ext4文件系统格式化或目录损坏恢复_________________________________ 20 4.3 文件系统损坏数据恢复___________________________________________ 234.3.1 全盘扫描 ____________________________________________________________ 235、D-Recovery for Linux存储介质镜像 ___________________________265.1 创建磁盘镜像,打开磁盘镜像,关闭磁盘镜像 _________________________ 266、D-Recovery for Linux创建区域_______________________________316.1 创建区域______________________________________________________ 317、D-Recovery for Linux手动提取文件 ___________________________317.1 手动提取文件三种方式___________________________________________ 338、D-Recovery for Linux Lvm(逻辑卷管理)跨盘管理 _______________31 8.1 物理磁盘,镜像文件,物理盘分区,镜像文件分区的任意组合 ____________ 331、D-Recovery for Linux介绍D-Recovery for Linux是由达思凯瑞技术(北京)有限公司自主研发的一款数据恢复软件。
Testdisk_PhotoRec数据恢复快速入门

Testdisk/PhotoRec数据恢复快速入门Testdisk是分区表恢复、Raid恢复、分区恢复的开源免费工具。
PhotoRec是个功能相当强大的免费数据恢复工具,通常与Testdisk一起下载,可根据各种文件的文件签名来恢复已删除文件。
TestDisk支持的功能:∙修复分区表, 恢复已删除分区∙用FAT32备份表恢复启动扇区∙重建FAT12/FAT16/FAT32启动扇区∙修复FAT表∙重建NTFS启动扇区∙用备份表恢复NTFS启动扇区∙用MFT镜像表(MFT Mirror)修复MFT表∙查找ext2/ext3备份的SuperBlock∙从FAT,NTFS及ext2文件系统恢复删除文件∙从已删除的FAT,NTFS及ext2/ext3分区复制文件PhotoRec支持的功能:PhotoRec 是一款用于恢复硬盘、光盘中丢失的视频、文档、压缩包等文件,或从数码相机存储卡中恢复丢失图片的数据恢复软件(因此,该软件命名为Photo Recovery这个名字)。
PhotoRec忽略文件系统,能直接从介质底层恢复数据,因此,在介质的文件系统严重破坏或被重新格式化后,它也能进行数据恢复。
Testdisk详细中文简介:/wiki/TestDisk_CNPhotoRec详细中文简介:/wiki/PhotoRec_CNPhotoRec数据恢复快速入门1.解压Testdisk程序包后,进入win目录找到photorec_win.exe,双击运行。
然后选择正确的磁盘。
2.选择分区表类型一般选择Intel (如果是GPT分区,请选择EFI GPT),其它操作系统,请相应的选择。
3. 接下来要选择要全盘搜索,还是针对某个分区进行搜索恢复。
4. 设定File Opt (文件选项),设置需要恢复的文件类型注:如果只是根据某些文件签名要恢复部分文件类型,那么可以按s取消全部勾选,然后移动光标到要恢复的文件类型,可按空格来选择高亮选中的类型。
Linux下用rm删除的文件的恢复方法

Linux下⽤rm删除的⽂件的恢复⽅法对于rm,很多⼈都有惨痛的教训。
我也遇到⼀次,⼀下午写的程序就被rm掉了,幸好只是⼀个⽂件,第⼆天很快⼜重新写了⼀遍。
但是很多⼈可能就不像我这么幸运了。
本⽂收集了⼀些在Linux下恢复rm删除的⽂件的⽅法,给⼤家作为参考。
⾸先,最好的⽅法是避免这个问题,以下是⼏点建议: 1、rm -rf误操作的后果是可怕的,rm -f也要三思⽽⾏,不能轻易使⽤。
2、做好数据备份。
3、⽤⼀些策略避免出错: 提倡在shell下⽤ TAB 补全,⽤脚本执⾏任务,减少出错的机会。
或者编写⼀个脚本,起名rm,在脚本⾥将真实的rm改为mv ,将删除的都mv到⼀个指定的⽬录⾥⾯,定期清理。
那么rm删除的⽂件还能恢复吗? rm的man⾥⾯有如下说法: 请注意,如果使⽤ rm 来删除⽂件,通常仍可以将该⽂件恢复原状。
如果想保证该⽂件的内容⽆法还原,请考虑使⽤ shred。
所以理论上rm删除的⽂件是还能恢复的。
删掉⽂件其实只是将指向数据块的索引点(information nodes)释放,只要不被覆盖,数据其实还在硬盘上,关键在于找出索引点,然后将其所指数据块内的数据抓出,再保存到另外的分区。
在⽤rm误删除⽂件后,我们要做的第⼀件事就是保证不再向误删⽂件的分区写数据。
通常我们可以有以下⼏种选择: 1、借助⼯具。
2、⾃⼰写程序。
你需要会编程并了解对应的⽂件系统。
3、如果数据很有⽤,也许可以找专业公司抢救。
⼯具 3、⼀个全能的⼯具,Finaldata,可以恢复unix/linux/dos下误删的⽂件。
对于unix,⽀持这些产品, Solaris、AIX和HP-UX。
对于linux,⽀持EXT2的⽂件系统。
对于dos,⽀持FAT 12/16/32, NTFS 4/5/5.1 的⽂件系统。
4、如果⽂件系统是ext2(对ext3⽆效): ext3的删除机制是直接把 inode data 删除了,所以造成 ext3 ⽆法反删除(ext3设计为⽆法恢复被删除的⽂件)。
EXT2文件系统

ext2 文件系统格式The Second Extended File System(ext2)文件系统是 Linux 系统中的标准 文件系统,是通过对 Minix 的文件系统进行扩展而得到的,其存取文件的性能 极好。
在 ext2 文件系统中,文件由 inode(包含有文件的所有信息)进行唯一标识。
一个文件可能对应多个文件名,只有在所有文件名都被删除后,该文件才会被 删除。
此外,同一文件在磁盘中存放和被打开时所对应的 inode 是不同的,并 由内核负责同步。
ext2 文件系统采用三级间接块来存储数据块指针,并以块 (block,默认为 1KB)为单位分配空间。
其磁盘分配策略是尽可能将逻辑相 邻的文件分配到磁盘上物理相邻的块中, 并尽可能将碎片分配给尽量少的文件, 以从全局上提高性能。
ext2 文件系统将同一目录下的文件(包括目录)尽可能 的放在同一个块组中,但目录则分布在各个块组中以实现负载均衡。
在扩展文 件时,会尽量一次性扩展 8 个连续块给文件(以预留空间的形式实现)。
2.1. 总体存储布局 请点评我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例 如某种 mkfs 命令)格式化成某种格式的文件系统,然后才能存储文件,格式 化的过程会在磁盘上写一些管理存储布局的信息。
下图是一个磁盘分区格式化 成 ext2 文件系统后的存储布局。
图 1. ext2 文件系统的总体存储布局文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确 定的,例如 mke2fs 的-b 选项可以设定块大小为 1024、2048 或 4096 字节。
而上图中启动块(Boot Block)的大小是确定的,就是 1KB,启动块是由 PC 标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启 动块。
启动块之后才是 ext2 文件系统的开始, ext2 文件系统将整个分区划成若干 个同样大小的块组(Block Group),每个块组都由以下部分组成。
Linux系统数据丢失如何恢复

Linux是一个多用户网络操作系统。
现如今,电脑手机端都存在Linux系统,因其免费且实用的功能被大家所喜爱。
如果Linux系统的数据丢失了后果是十分严重的,那Linux系统数据丢失如何修复呢?当我们使用窗口管理器来删除文件时,我们仅仅只是将文件从某个目录移动到了另一个目录中(回收站)。
在这种情况下,获得更新的就是你文件系统索引节点(inode)的元数据信息,例如被删除文件的时间戳、文件所占存储区块和扩展属性等数据。
你可以使用tune2fs(调整和查看ext2/ext3文件系统的文件系统参数)来查看文件系统的索引节点信息,在命令行工具中输入下列指令:sudo tune2fs -l /dev/sda1 |grep -i inode运行之后,你将会获得类似下方所给出的示例信息:$ sudo tune2fs -l /dev/sda1 |grep -i inodeFilesystem features: has_journal ext_attr resize_inode dir_index filetypeneeds_recoveryextent flex_bg sparse_super large_filehuge_file uninit_bg dir_nlinkextra_isizeInode count: 30007296Free inodes: 29382378Inodes per group: 8192Inode blocks per group: 512First inode: 11Inode size: 256Journal inode: 8First orphan inode: 21628027Journal backup: inode blocks文件删除知多少?当你使用SSH远程访问你的计算机时,你可以在目录“~/.local/share/Trash”中看到所有被删除的文件。
这样一来,我们就可以直接使用GUI窗口来还原被删除的文件,非常的简单。
android e2fsck原理

android e2fsck原理
Android的e2fsck原理是基于Linux的ext2文件系统检查工具。
e2fsck (ext2 file system consistency checker)用于检查和修复
ext2/ext3/ext4文件系统的问题。
当Android设备上的文件系统发生错误或损坏时,e2fsck可以用来检查和修复文件系统的一致性。
它通过扫描文件系统的各个部分,检查文件系统的元数据和数据块是否正确和一致,如果发现错误或不一致,它会尝试自动修复或提示用户进行修复。
e2fsck主要通过以下步骤进行检查和修复:
1. 打开文件系统:首先,e2fsck需要打开要检查的文件系统设备。
2. 检查文件系统的一致性:e2fsck会检查文件系统的各个部分,包括超级块、inode、目录项、数据块等,以确保它们是正确和一致的。
3. 修复文件系统:如果发现错误或不一致,e2fsck会尝试自动修复或提示用户进行修复。
常见的修复操作包括重建索引、修复连接、删除无效的目录项等。
4. 关闭文件系统:当检查和修复完成后,e2fsck会关闭文件系统设备。
在Android系统中,e2fsck通常作为系统恢复或升级过程中的一部分来运行,以确保文件系统的完整性和一致性。
第九章_Ext2文件系统_ro机

第九章_Ext2文件系统_ro机第九章Ext2文件系统9.1基本概念在上一章中,我们把Ext2、Minix、Ext等实际可使用的文件系统称为具体文件系统.具体文件系统管理的是一个逻辑空间,这个逻辑空间就象一个大的数组,数组的每个元素就是文件系统操作的基本单位——逻辑块,逻辑块是从0开始编号的,而且,逻辑块是连续的.与逻辑块相对的是物理块,物理块是数据在磁盘上的存取单位,也就是每进行一次I/O操作,最小传输的数据大小.我们知道数据是存储在磁盘的扇区中的,那么扇区是不是物理块呢?或者物理块是多大呢?这涉及到文件系统效率的问题.如果物理块定的比较大,比如一个柱面大小,这时,即使是1个字节的文件都要占用整个一个柱面,假设Linux环境下文件的平均大小为1K,那么分配32K的柱面将浪费97%的磁盘空间,也就是说,大的存取单位将带来严重的磁盘空间浪费.另一方面,如果物理块过小,则意味着对一个文件的操作将进行更多次的寻道延迟和旋转延迟,因而读取由小的物理块组成的文件将非常缓慢!可见,时间效率和空间效率在本质上是相互冲突的.因此,最优的方法是计算出Linux环境下文件的平均大小,然后将物理块大小定为最接近扇区的整数倍大小.在Ext2中,物理块的大小是可变化的,这取决于你在创建文件系统时的选择,之所以不限制大小,也正体现了Ext2的灵活性和可扩充性,一是因为要适应近年来文件的平均长度缓慢增长的趋势,二是为了适应不同的需要.比如,如果一个文件系统主要用于BBS服务,考虑到BBS上的文章通常很短小,所以,物理块选的小一点是恰当的.通常,Ext2的物理块占一个或几个连续的扇区,显然,物理块的数目是由磁盘容量等硬件因素决定的.逻辑块与物理块的关系类似于虚拟内存中的页与物理内存中的页面的关系.具体文件系统所操作的基本单位是逻辑块,只在需要进行I/O操作时才进行逻辑块到物理块的映射,这显然避免了大量的I/O操作,因而文件系统能够变得高效.逻辑块作为一个抽象的概念,它必然要映射到具体的物理块上去,因此,逻辑块的大小必须是物理块大小的整数倍,一般说来,两者是一样大的.通常,一个文件占用的多个物理块在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可供使用.因此,必须提供一种方法将一个文件占用的多个逻辑块映射到对应的非连续存储的物理块上去,Ext2等类文件系统是用索引节点解决这个问题的,具体实现方法后面再予以介绍.为了更好的说明逻辑块和物理块的关系,我们来看一个例子.假设用户要对一个已有文件进行写操作,用户进程必须先打开这个文件,file结构记录了该文件的当前位置.然后用户把一个指向用户内存区的指针和请求写的字节数传送给系统,请求写操作,这时系统要进行两次映射.一组字节到逻辑块的映射.这个映射过程就是找到起始字节到结束字节所占用的所有逻辑块号.这是因为在逻辑空间,文件传输的基本单位是逻辑块而不是字节.逻辑块到物理块的映射.这个过程必须要用到索引节点结构,该结构中有一个物理块指针数组,以逻辑块号为索引,通过这些指针找到磁盘上的物理块,具体实现将在介绍Ext2索引节点时再进行介绍.图9.1是由一组请求的字节到物理块的映射过程示意图.图9.1一组字节映射到物理块的示意图有了逻辑块和物理块的概念,我们也就知道通常所说的数据块是指逻辑块,以下没有特别说明,块或数据块指的是逻辑块.在Ext2中,还有一个重要的概念:片,它的作用是什么? 每个文件必然占用整数个逻辑块,除非每个文件大小都恰好是逻辑块的整数倍,否则最后一个逻辑块必然有空间未被使用,实际上,每个文件的最后一个逻辑块平均要浪费一半的空间,显然最终浪费的还是物理块.在一个有很多文件的系统中,这种浪费是很大的.Ext2使用片来解决这个问题.片也是一个逻辑空间中的概念,其大小在1K至4K之间,但片的大小总是不大于逻辑块.假设逻辑块大小为4K,片大小为1K,物理块大小也是1K,当你要创建一个3K大小的文件时,实际上分配给你了3个片,而不会给你一个逻辑块,当文件大小增加到4K时,文件系统则分配一个逻辑块给你,而原来的四个片被清空.如果文件又增加到5K时,则占用1个逻辑块和1个片.上述三种情况下,所占用的物理块分别是3个、4个、5个,如果不采用片,则要用到4个、4个、8个物理块,可见,使用片,减少了磁盘空间的浪费.当然,在物理块和逻辑块大小一样时,片就没有意义了.由上面分析也可看出:物理块大小100>12,所以要用到一次间接块,在一次间接块中查找第88项,此项内容就是对应的物理块的地址.而如果要找第1000个逻辑块对应的物理块,由于1000>256+12,所以要用到二次间接块了.索引节点的标志取下列几个值的可能组合.EXT2_SECRM_FL0x00000001完全删除标志.设置这个标志后,删除文件时,随机数据会填充原来的数据块.EXT2_UNRM_FL0x00000002可恢复标志.设置这个标志后,删除文件时,文件系统会保留足够信息,以确保文件仍能恢复EXT2_COMR_FL0x00000004压缩标志.设置这个标志后,表明该文件被压缩过.当访问该文件时,文件系统必须采用解压缩算法进行解压.EXT2_SYNC_FL0x00000008同步更新标志.设置该标志后,则该文件必须和内存中的内容保持一致,对这种文件进行异步输入、输出操作是不允许的.这个标志仅用于节点本身和间接块.数据块总是异步写入磁盘的.除了这几个常用标志外,还有12个标志就不一一介绍了.索引节点在磁盘上是经过编号的.其中,有一些节点有特殊用途,用户不能使用.这些特殊节点也在include/Linux/ext2_fs.h中定义.#defineEXT2_BAD_INO1该节点所对应的文件中包含着该文件系统中坏块的链接表#defineEXT2_ROOT_INO2该文件系统的根目录所对应的节点#defineEXT2_IDX_INO3ACL节点#defineEXT2_DATA_INO4ACL节点#defineEXT2_BOOT_LOADER_INO5用于引导系统的文件所对应的节点#defineEXT2_UNDEL_DIR_INO6文件系统中可恢复的目录对应的节点没有特殊用途的第一个节点号为11#defineEXT2_FIRST_INO11文件的类型、访问权限、用户标识号、用户组标识号等将在后面介绍.与Ext2超级块类似,当磁盘上的索引节点调入内存后,除了要填写VFS的索引节点外,系统还要根据它填写另一个数据结构,该结构叫ext2_inode_info,其作用也是为了存储特定文件系统自己的特性,它在include/Linux/ext2_fs_i.h中定义如下:structext2_inode_info{__u32i_data[15]数据块指针数组*/__u32i_flags;打开文件的方式*/__u32i_faddr;片的地址*/__u8i_frag_no;如果用到片,则是第一个片号*/__u8i_frag_size;片大小*/__u16i_osync;同步*/__u32i_file_acl;文件访问控制链表*/__u32i_dir_acl;目录访问控制链表*/__u32i_dtime;文件的删除时间*/__u32i_block_group;索引节点所在的块组号*//******以下四个域是用于操作预分配块的*__u32i_next_alloc_block;__u32i_next_alloc_goal;__u32i_prealloc_block;__u32i_prealloc_count;__u32i_dir_start_lookupinti_new_inode:1/*Isafreshlyallocatedinode*/};VFS索引节点中是没有物理块指针数组的域,这个Ext2特有的域在调入内存后,就必须保存在ext2_inode_info这个结构中.此外,片作为Ext2比较特殊的地方,在ext2_inode_info中也保存了一些相关的域.另外,Ext2在分配一个块时通常还要预分配几个连续的块,因为它判断这些块很可能将要被访问,所以采用预分配的策略可以减少磁头的寻道时间.这些用于预分配操作的域也被保存在ext2_inode_info结构中.9.2.4组描述符块组中,紧跟在超级块后面的是组描述符表,其每一项称为组描述符,是一个叫ext2_group_desc的数据结构,共32字节.它是用来描述某个块组的整体信息的. structext2_group_desc{__u32bg_block_bitmap;/*组中块位图所在的块号*/__u32bg_inode_bitmap;组中索引节点位图所在块的块号*/__u32bg_inode_table;/*组中索引节点表的首块号*/__u16bg_free_blocks_count;/*组中空闲块数*/__u16bg_free_inodes_count;/*组中空闲索引节点数*/__u16bg_used_dirs_count;/*组中分配给目录的节点数*/__u16bg_pad;填充,对齐到字*/__u32[3]bg_reserved;用null填充12个字节*/}每个块组都有一个相应的组描述符来描述它,所有的组描述符形成一个组描述符表,组描述符表可能占多个数据块.组描述符就相当于每个块组的超级块,一旦某个组描述符遭到破坏,整个块组将无法使用,所以组描述符表也像超级块那样,在每个块组中进行备份,以防遭到破坏.组描述符表所占的块和普通的数据块一样,在使用时被调入块高速缓存.9.2.5位图在Ext2中,是采用位图来描述数据块和索引节点的使用情况的,每个块组中都有两个块,一个用来描述该组中数据块的使用情况,另一个描述该组中索引节点的使用情况.这两个块分别称为数据块位图块和索引节点位图块.数据位图块中的每一位表示该组中一个块的使用情况,如果为0,则表示相应数据块空闲,为1,则表示已分配,索引节点位图块的使用情况类似.Ext2在安装后,用两个高速缓存分别来管理这两种位图块.每个高速缓存最多同时只能装入Ext2_MAX_GROUP_LOADED个位图块或索引节点块,当前该值定义为8,所以也应该采用一些算法来管理这两个高速缓存,Ext2中采用的算法类似于LRU算法.前面说过,ext2_sp_info结构中有四个域用来管理这两个高速缓存,其中s_block_bitmap_number[]数组中存有进入高速缓存的位图块号,而s_block_bitmap[]数组则存储了相应的块在高速缓存中的地址.s_inode_bitmap_number[]和s_inode_bitmap[]数组的作用类似上面.我们通过一个具体的函数来看Ext2是如何通过这四个域管理位图块高速缓存的.在Linux/fs/ext2/balloc.c 中,有一个函数load__block_bitmap,它用来调入指定的数据块位图块,下面是它的执行过程:如果指定的块组号大于块组数,出错,结束;通过搜索s_block_bitmap_number[]数组可知位图块是否已进入高速缓存,如果已进入,则结束,否则,继续; 如果块组数不大于Ext2_MAX_GROUP_LOADED,高速缓存可以同时装入所有块组的数据块位图块,不用采用什么算法,只要找到s_block_bitmap_number[]数组中第一个空闲元素,将块组号写入,然后将位图块调入高速缓存,最后将它在高速缓存中的地址写入s_block_bitmap[]数组中;如果块组数大于Ext2_MAX_GROUP_LOADED,则需要采用以下算法;首先通过s_block_bitmap_number[]数组判断高速缓存是否已满,若未满,则操作过程类似上一步,不同之处在于需要将s_block_bitmap_number[]数组各元素依次后移一位,而用空出的第一个元素存储块组号,s_block_bitmap[]也要做相同处理;如果高速缓存已满,则将s_block_bitmap[]数组最后一项所指的位图块从高速缓存中交换出去,然后调入所指定的位图块,最后对这两个数组作和上面相同的操作;可以看出,这个算法很简单,就是对两个数组的简单操作,只是在块组数大于Ext2_MAX_GROUP_LOADED时,要求数组的元素按最近访问的先后次序排列,显然,这样也是为了更合理的进行高速缓存的替换操作.9.2.6索引节点表及实例分析在两个位图块后面,就是索引节点表了,每个块组中的索引节点都存储在各自的索引节点表中,并且按索引节点号依次存储.索引节点表通常占好几个数据块,索引节点表所占的块使用时也像普通的数据块一样被调入块高速缓存.有了以上几个概念和数据结构后,我们分析一个具体的例子,来看看这些数据结构是如何配合工作的.在fs/ext2/inode.c中,有一个ext2_read_inode,用来读取指定的索引节点信息.其代码如下:voidext2_read_inode{structbuffer_head*bh;structext2_inode*raw_inode; unsignedlongblock_group; unsignedlonggroup_desc; unsignedlongdesc; unsignedlongblock; unsignedlongoffset;structext2_group_desc *gdp;if)||inode->i_ino>le32_to_cpu){ext2_error;gotobad_inode;}block_group/EXT2_INODES_PER_GROUP;if{ext2_error;gotobad_inode;}group_desc=block_group>>EXT2_DESC_PER_BLOCK_BITS; desc=block_group&1);bh=inode->i_sb->u.ext2_sb.s_group_desc[group_desc]; if{ext2_error;gotobad_inode;}gdp=bh->b_data;/**Figureouttheoffsetwithintheblockgroupinodetable*/offset=%EXT2_INODES_PER_GROUP) *EXT2_INODE_SIZE;block=le32_to_cpu+);if)){ext2_error;gotobad_inode;}offset&=-1);raw_inode=;inode->i_mode =le16_to_cpu; inode->i_uid=le16_to_cpu;inode->i_gid =le16_to_cpu; if)){inode->i_uid |=le16_to_cpui_gid|=le16_to_cpui_nlink=le16_to_cpu; inode->i_size =le32_to_cpu; inode->i_atime =le32_to_cpu; inode->i_ctime =le32_to_cpu;inode->i_mtime=le32_to_cpu;inode->u.ext2_i.i_dtime =le32_to_cpu;/*Wenowhaveenoughfieldstocheckiftheinodewasactiveornot.Thisis needed because nfsd might tryto access dead inodes *the testisthat same one thate2fsck usesNeilBrown 1999oct15*/if){/*thisinodeisdeleted*/brelse;gotobad_inode;}inode->i_blksize =PAGE_SIZE;/*ThistheoptimalIOsize,notthefsblocksize*/inode->i_blocks=le32_to_cpu;inode->i_version=++event;inode->u.ext2_i.i_flags =le32_to_cpu;inode->u.ext2_i.i_faddrle32_to_cpu;inode->u.ext2_i.i_frag_no =raw_inode->i_frag;inode->u.ext2_i.i_frag_size =raw_inode->i_fsize; inode->u.ext2_i.i_file_acl =le32_to_cpu;if)inode->i_size|=le32_to_cpu)u.ext2_i.i_dir_acl=le32_to_cpu;inode->i_generation=le32_to_cpu;inode->u.ext2_i.i_prealloc_count =0;inode->u.ext2_i.i_block_group =block_group;/**NOTE!Thein-memoryinodei_dataarrayisinlittle-endianorder*evenonbig-endianmachines: wedoNOT byteswap theblock numbers! */for/* Nothingtodo*/;elseif){inode->i_op=&ext2_file_inode_operations; inode->i_fop=&ext2_file_operations;inode->i_mapping->a_ops=&ext2_aops;}elseif){inode->i_op=&ext2_dir_inode_operations; inode->i_fop=&ext2_dir_operations; inode->i_mapping->a_ops=&ext2_aops;}elseif){ifinode->i_op=&ext2_fast_symlink_inode_operations; else{inode->i_op=&page_symlink_inode_operations; inode->i_mapping->a_ops=&ext2_aops;}}elseinit_special_inode);brelse;inode->i_attr_flags=0;if{inode->i_attr_flags|=A TTR_FLAG_SYNCRONOUS; inode->i_flags|=S_SYNC;}if{inode->i_attr_flags|=A TTR_FLAG_APPEND;inode->i_flags|=S_APPEND;}if{inode->i_attr_flags|=A TTR_FLAG_IMMUTABLE; inode->i_flags|=S_IMMUTABLE;}if{inode->i_attr_flags|=A TTR_FLAG_NOA TIME; inode->i_flags|=S_NOATIME;}return;bad_inode:make_bad_inode;return;}这个函数的代码有200多行,为了突出重点,下面是对该函数主要内容的描述:如果指定的索引节点号是一个特殊的节点号,或者小于第一个非特殊用途的节点号,即EXT2_FIRST_INO ,或者大于该文件系统中索引节点总数,则输出错误信息,并返回;用索引节点号整除每组中索引节点数,计算出该索引节点所在的块组号;即block_group=/Ext2_INODES_PER_GROUP找到该组的组描述符在组描述符表中的位置.因为组描述符表可能占多个数据块,所以需要确定组描述符在组描述符表的哪一块以及是该块中第几个组描述符. 即:group_desc=block_group>>Ext2_DESC_PER_BLOCK_BITS表示块组号整除每块中组描述符数,计算出该组的组描述符在组描述符表中的哪一块.我们知道,每个组描述符是32字节大小,在一个1K大小的块中可存储32个组描述符.块组号与每块中组的描述符数进行”与”运算,得到这个组描述符具体是该块中第几个描述符.即desc=block_group&-1).有了group_desc和desc,接下来在高速缓存中找这个组描述符就比较容易了:即:bh=inode->i_sb->u.ext2_sb.s_group_desc[group_desc],首先通过s_group_desc[]数组找到这个组描述符所在块在高速缓存中的缓冲区首部;然后通过缓冲区首部找到数据区,即gdp=bh->b_data.找到组描述符后,就可以通过组描述符结构中的bg_inode_tabl找到索引节点表首块在高速缓存中的地址:offset=%Ext2_INODES_PER_GROUP)*Ext2_INODE_SIZE,计算该索引节点在块中的偏移位置;block=le32_to_cpu+),计算索引节点所在块的地址;代码中le32_to_cpu、le16_to_cpu按具体CPU的要求进行数据的排列,在i386处理器上访问Ext2文件系统时这些函数不做任何事情.因为不同的处理器在存取数据时在字节的排列次序上有所谓”bigending”和”littleending”之分.例如,i386就是”littleending”处理器,它在存储一个16位数据0x1234时,实际存储的却是0x3412,对32位数据也是如此.这里索引节点号与块的长度都作为32位或16位无符号整数存储在磁盘上,而同一磁盘既可以安装在采用”little ending”方式的CPU机器上,也可能安装在采用”big ending”方式的CPU机器上,所以要选择一种形式作为标准.事实上,Ext2采用的标准为”littleending”,所以,le32_to_cpu、le16_to_cpu函数不作任何转换.计算出索引节点所在块的地址后,就可以调用sb_bread通过设备驱动程序读入该块.从磁盘读入的索引节点为ext2_Inode数据结构,前面我们已经看到它的定义.磁盘上索引节点中的信息是原始的、未经加工的,所以代码中称之为raw_inode,即raw_inode=与磁盘索引节点ext2_inode相对照,内存中VFS的inode结构中的信息则分为两部分,一部分是属于VFS层的,适用于所有的文件系统;另一部份则属于具体的文件系统,这就是inode中的那个union,因具体文件系统的不同而赋予不同的解释.对Ext2来说,这部分数据就是前面介绍的ext2_inode_info结构.至于代表着符号链接的节点,则并没有文件内容,所以正好用这块空间来存储链接目标的路径名.ext2_inode_info结构的大小为60个字节.虽然节点名最长可达255个字节,但一般都不会太长,因此将符号链接目标的路径名限制在60个字节不至于引起问题.代码中inode->u.*设置的就是Ext2文件系统的特定信息.接着,根据索引节点所提供的信息设置inode结构中的inode_operations结构指针和file_operations结构指针,完成具体文件系统与虚拟文件系统VFS之间的连接.目前2.4版内核并不支持存取控制表ACL,因此,代码中只是为之留下了位置,而暂时没做任何处理.另外,通过检查inode结构中的mode域来确定该索引节点是常规文件、目录、符号链接还是其他特殊文件而作不同的设置或处理.例如,对Ext2文件系统的目录节点,就将i_op和i_fop分配设置为ext2_dir_inode_operations和ext2_dir_operations.而对于Ext2常规文件,则除i_op和i_fop以外,还设置了另一个指针a_ops,它指向一个address_apace_operation结构,用于文件到内存空间的映射或缓冲.对特殊文件,则通过init_special_inode函数加以检查和处理.从这个读索引节点的过程可以看出,首先要寻找指定的索引节点,要找索引节点,必须先找组描述符,然后通过组描述符找到索引节点表,最后才是在这个索引节点表中找索引节点.当从磁盘找到索引节点以后,就要把其读入内存,并存放在VFS索引节点相关的域中.从这个实例的分析,读者可以仔细体会前面所介绍的各种数据结构的具体应用.9.2.7Ext2的目录项及文件的定位文件系统一个很重要的问题就是文件的定位,如何通过一个路径来找到一个文件的具体位置,这就要依靠ext2_dir_entry这个结构.1.Ext2目录项结构在Ext2中,目录是一种特殊的文件,它是由ext2_dir_entry这个结构组成的列表.这个结构是变长的,这样可以减少磁盘空间的浪费,但是,它还是有一定的长度方面的限制,一是文件名最长只能为255个字符.二是尽管文件名长度可以不限,但系统自动将之变成4的整数倍,不足的地方用null字符填充.目录中有文件和子目录,每一项对应一个ext2_dir_entry.该结构在include/Linux/ext2_fs.h中定义如下:/**Structureofadirectoryentry*/#defineEXT2_NAME_LEN255structext2_dir_entry{__u32inode;Inodenumber*/__u16rec_len;Directoryentrylength*/__u16name_len;Namelength*/charname[EXT2_NAME_LEN]Filename*/};这是老版本的定义方式,在ext2_fs.h中还有一种新的定义方式:/**Thenewversionofthedirectory entry.SinceEXT2structures are*storedinintelbyteorder,andthename_lenfieldcouldneverbe*than255chars,it’ssafetoreclaimtheextrabyteforthe*file_typefield.*/structext2_dir_entry_2{__u32inode;Inode number*/__u16rec_len;Directorylength*/__u8name_len;Namelength*/__u8file_type;charname[EXT2_NAME_LEN]Filename*/};其二者的差异在于,一是新版中结构名改为ext2_dir_entry_2;二是老版本中ext2_dir_entry中的name_len为无符号短整数,而新版中则改为8位的无符号字符,腾出一半用作文件类型.目前已定义的文件类型为:**Ext2directorytypes.Onlythelow3bitsareused.The*otherbitsarereservedfornow.*/enum{EXT2_FT_UNKNOWN, /*未知*/EXT2_FT_REG_FILE,/*常规文件*/EXT2_FT_DIR,/*目录文件*/EXT2_FT_CHRDEV,/*字符设备文件*/EXT2_FT_BLKDEV,/*块设备文件*/EXT2_FT_FIFO,/*命名管道文件*/EXT2_FT_SOCK,/*套接字文件*/EXT2_FT_SYMLINK,/*符号连文件*/EXT2_FT_MAX/*文件类型的最大个数*/};2.各种文件类型如何使用数据块我们说,不管哪种类型的文件,每个文件都对应一个inode结构,在inode结构中有一个指向数据块的指针i_blaock,用来标识分配给文件的数据块.但是Ext2所定义的文件类型以不同的方式使用数据块.有些类型的文件不存放数据,因此,根本不需要数据块,下面对不同文件类型如何使用数据块给予说明.常规文件常规文件时最常用的文件.常规文件在刚创建时是空的,并不需要数据块,只有在开始有数据时才需要数据块;可以用系统调用truncate清空一个常规文件.目录文件Ext2以一种特殊的方式实现了目录,这种文件的数据块中存放的就是ext2_dir_entry_2结构.如前所述,这个结构的最后一个域是可变长度数组,因此该结构的长度是可变的.在ext2_dir_entry_2结构中,因为rec_len域是目录项的长度,把它与目录项的起始地址相加就得到下一个目录项的起始地址,因此说,rec_len可以被解释为指向下一个有效目录项的指针.为了删除一个目录项,把ext2_dir_entry_2的inode域置为0并适当增加前一个有效目录项rec_len域的值就可以了.符号连如果符号连的路径名小于60个字符,就把它存放在索引节点的i_blaock域,该域是由15个4字节整数组成的数组,因此无需数据块.但是,如果路径名大于60个字符,就需要一个单独的数据块.设备文件、管道和套接字这些类型的文件不需要数据块.所有必要的信息都存放在索引节点中.3.文件的定位文件的定位是一个复杂的过程,我们先看一个具体的例子,然后再结合上面的数据结构具体介绍一下如何找到一个目录项的过程.如果要找的文件为普通文件,则可通过文件所对应的索引节点找到文件的具体位置,如果是一个目录文件,则也可通过相应的索引节点找到目录文件具体所在,然后再从这个目录文件中进行下一步查找,来看一个具体的例子.假设路径为/home/user1/file1,home和user1是目录名,而file1为文件名.为了找到这个文件,有两种途径,一是从根目录开始查找,二是从当前目录开始查找.假设我们从根目录查找,则必须先找到根目录的节点,这个节点的位置在VFS中的超级块中已经给出,然后可找到根目录文件,其中必有home所对应的目录项,由此可先找到home节点,从而home的目录文件,然后依次是user1的节点和目录文件,最后,在该目录文件中的file1目录项中找到file1的节点,至此,已经可以找到file1文件的具体所在了.目录中还有两个特殊的子目录:”.”和”..”,分别代表当前目录和父目录.它们是无法被删除的,其作用就是用来进行相对路径的查找.现在,我们来分析一下fs/ext2/dir.c中的函数ext2_find_entry,该函数从磁盘上找到并读入当前节点的目录项,其代码及解释如下:/**ext2_find_entry**findsanentryinthespecifieddirectorywiththewantedname.It* returns the pagein which the entry was found, andthe entry itself*.Pageis returned mapped andunlocked.*Entryisguaranteedtobevalid.*/typedefstructext2_dir_entry_2ext2_dirent; structext2_dir_entry_2*ext2_find_entry{constchar*name=dentry->d_;/*目录项名*/intnamelen=dentry->d_name.len;/*目录项名的长度*/ unsignedreclen=EXT2_DIR_REC_LEN;/*目录项的长度*/ unsignedlongstart,n;unsignedlongnpages=dir_pages;/*把以字节为单位的文件大小转换为物理页面数*/。
如何恢复 Linux 上删除的文件

如何恢复 Linux 上删除的文件,第 1 部分原理及普通文件的恢复要想恢复误删除的文件,必须清楚数据在磁盘上究竟是如何存储的,以及如何定位并恢复数据。
本文从数据恢复的角度,着重介绍了ext2 文件系统中使用的一些基本概念和重要数据结构,并通过几个实例介绍了如何手工恢复已经删除的文件。
最后针对ext2 现有实现存在的大文件无法正常恢复的问题,通过修改内核中的实现,给出了一种解决方案。
对于很多 Linux 的用户来说,可能有一个问题一直都非常头疼:对于那些不小心删除的数据来说,怎样才能恢复出来呢?大家知道,在 Windows 系统上,回收站中保存了最近使用资源管理器时删除的文件。
即便是对于那些在命令行中删除的文件来说,也有很多工具(例如recover4all, FinalData Recovery)可以把这些已经删除的文件恢复出来。
在Linux 下这一切是否可能呢?实际上,为了方便用户的使用,现在 Linux 上流行的桌面管理工具(例如gnome 和KDE)中都已经集成了回收站的功能。
其基本思想是在桌面管理工具中捕获对文件的删除操作,将要删除的文件移动到用户根目录下的 .Trash 文件夹中,但却并不真正删除该文件。
当然,像在 Windows 上一样,如果用户在删除文件的同时,按下了 Shift 键并确认删除该文件,那么这个文件就不会被移动到 .Trash 文件夹中,也就无从恢复了。
此时,习惯了使用 Windows 上各种恢复工具的人就会顿足捶胸,抱怨 Linux 上工具的缺乏了。
但是请稍等一下,难道按照这种方式删除的文件就真的无从恢复了么?或者换一个角度来看,使用rm 命令删除的文件是否还有办法能够恢复出来呢?背景知识在开始真正进行实践之前,让我们首先来了解一下在 Linux 系统中,文件是如何进行存储和定位的,这对于理解如何恢复文件来说非常重要。
我们知道,数据最终以数据块的形式保存在磁盘上,而操作系统是通过文件系统来管理这些数据的。
Linux命令行中的文件恢复和数据修复技巧

Linux命令行中的文件恢复和数据修复技巧数据丢失对每个计算机用户来说都是一个令人沮丧的问题,但在Linux系统上,通过命令行工具,您可以使用一些技巧来尝试恢复丢失的文件和修复受损的数据。
本文将介绍一些常用的Linux命令行中的文件恢复和数据修复技巧。
注意:在执行以下命令之前,请确保您具有足够的权限,并备份您的数据以防止进一步损失。
1. 使用grep命令搜索并恢复文件Grep命令在文件中搜索指定的模式。
如果您知道丢失文件的部分内容,您可以使用grep命令来搜索并尝试恢复它。
示例使用方式:```grep -a -B 25 -A 100 '关键词' /dev/sda1 > recovered_file.txt```上述命令会搜索/dev/sda1设备中包含关键词的文件,并将搜索结果输出到recovered_file.txt文件中。
2. 使用extundelete恢复已删除的文件extundelete是一个Linux命令行工具,用于恢复已删除的文件。
它可以在ext2/ext3/ext4文件系统上运行,但需要在文件被覆盖前立即执行。
示例使用方式:```extundelete /dev/sdb1 --restore-all```上述命令将尝试恢复/dev/sdb1设备上已删除的所有文件。
3. 使用testdisk恢复分区和文件testdisk是一个功能强大的命令行工具,用于恢复丢失的分区和文件。
它可以用于各种文件系统,包括FAT、NTFS、ext2/ext3/ext4等。
示例使用方式:```testdisk /dev/sdc```上述命令将启动testdisk工具,并提示您选择要恢复的分区和文件。
4. 使用ddrescue恢复受损的硬盘如果您的硬盘因物理损坏或磁道损坏而无法读取,您可以使用ddrescue命令来尝试复制可读取的数据,并跳过无法读取的部分。
示例使用方式:```ddrescue /dev/sdd1 recovered_image.img logfile.log```上述命令将复制/dev/sdd1设备上的数据到recovered_image.img文件中,并将日志保存在logfile.log中。
十大硬盘修复软件 数据还原

电脑突然死机或者断电,硬盘数据丢失?U盘重要文件不小心删掉了? 电脑中毒,文件丢失或无法读取? 系统突然崩溃,重要文件丢失?使用计算机最怕的就是象以上这些突如其来的灾难性故障导致重要数据的丢失,误操作、计算机病毒的攻击和软、硬件故障等天灾人祸都在时刻威胁着数据文件的安全,因此如何保障计算机数据的安全完整成为人们日益关注的话题。
针对各种可能的威胁,我们可以通过防火墙、反病毒软件以及各式各样的数据备份软件来预防这些问题的发生,但是在数据丢失事故发生之后还需要一个能够帮助我们拯救数据的恢复工具,这就是小编下面要为大家推荐的数据恢复软件,下面就由小编为大家一一道来吧!1.FinalData PremiumFinalData能够对FAT、FAT32和NTFS三种文件系统中的文件进行恢复,而且它的界面风格和操作方法和Windows资源管理器非常接近,即使是非计算机专业人员的普通用户也可以在几分钟的时间里掌握基本的使用方法,完成大部分数据恢复工作。
另外,快速高效则是FinalData的另一个显著特点,恢复单个丢失的文件只需要几秒钟的时间,而对于整个硬盘的恢复也可以在几十分钟内完成。
软件版本:2.0 软件大小:5486KB软件下载地址:点击即可下载软件评价:软件扫描硬盘速度非常的慢,扫描结果以文件类型方式以及全部方式两种方式显示,不支持原始目录结构显示及恢复。
有特色的是支持常见格式的图片和文本等文件的预览2.EasyRecovery 数据恢复软件EasyRecovery 是世界著名数据恢复公司Ontrack 的技术杰作,它是一个威力非常强大的硬盘数据恢复工具。
能够帮你恢复丢失的数据以及重建文件系统。
EasyRecovery不会向你的原始驱动器写入任何东东,它主要是在内存中重建文件分区表使数据能够安全地传输到其他驱动器中。
你可以从被病毒破坏或是已经格式化的硬盘中恢复数据。
该软件可以恢复大于8.4GB的硬盘。
支持长文件名。
Linux命令行救星如何恢复误删除的文件

Linux命令行救星如何恢复误删除的文件在使用Linux命令行界面进行文件管理时,不可避免地会经历一些意外情况,例如误删除文件。
然而,Linux系统提供了一些强大的工具和技巧,可以帮助我们恢复这些误删除的文件。
本文将介绍一些常用的Linux命令行救星,帮助您恢复误删除的文件。
请按照以下步骤进行操作:1. 停止写入操作:在意识到误删除文件后,首先要立即停止对文件系统的任何写入操作。
这是因为在Linux中,误删除文件并不是真正从磁盘中移除,而是将其标记为可被覆盖的空间。
如果继续写入操作,可能会导致该空间被新的数据覆盖,从而无法恢复文件。
2. 使用ls命令确认文件是否真的删除:输入以下命令来确认文件是否真的被删除:```ls -l 文件路径```如果该命令显示文件不存在,那么可以肯定文件已被删除。
3. 使用grep命令搜索磁盘:如果文件已被删除,但我们知道其文件名或者一部分内容,可以使用grep命令来搜索整个磁盘并找回该文件。
输入以下命令:```grep -a -C 100 '关键词' /dev/sda1```其中,关键词是您记得的文件名或者文件中的某些内容。
`/dev/sda1`是您要搜索的磁盘设备。
请注意,这一过程可能需要较长时间,特别是在大型磁盘上进行搜索。
4. 使用extundelete恢复文件:如果grep命令无法找回文件,可以尝试使用extundelete工具来恢复误删除的文件。
首先,确保extundelete已安装在您的系统中。
接下来,输入以下命令:```extundelete /dev/sda1 --restore-file '文件路径'```其中,`/dev/sda1`是您的磁盘设备,'文件路径'是要恢复的文件在系统中的路径。
注意,extundelete只能恢复ext2、ext3和ext4文件系统下的文件。
5. 使用TestDisk和PhotoRec工具:如果以上方法都无效,可以尝试使用TestDisk和PhotoRec工具来恢复误删除的文件。
数据恢复软件

开发商说明:
1. Improve Data Protection and Integrity by Pre-Installing FINALDATA
Recovery even if the partition table is damaged
Finds partitions automatically, even if the boot sector, FAT or system files of the MFT have been erased or damaged
Drive Rescue NhomakorabeaDrive Rescue是一款优秀而且免费的磁盘数据拯救程序,它能恢复驱动器(例如硬盘)上误删或遗失的数据,即使已经失去分区表或硬盘已被快速格式化或者遭遇系统崩溃等情况,找回驱动器重要文件系统信息如分区表、引导记录、FAT、文件/目录记录等。当然对于物理损坏的硬盘它也无能为力。Drive Rescue支持FAT 12/16/32分区和Windows全系列操作系统以及双硬盘。
GetDataBack能帮我们在5个步骤之内轻轻松松的还原数据,不管您的硬盘是否还能被操作系统所辨认,也不管您的根目录或者是所有的目录都已经丢失了。
RecoverNT
RecoverNT是一套功能强大的硬盘资料恢复软件,可以在Windows9x下将你不小心格式化 ;硬盘资料给起死回生,适用于FAT、FAT32、NTFS系统下,可以挽救单独的文件或是整个目录的文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ext2文件系统下数据进行数据恢复摘要ext2文件系统下数据进行数据恢复---------------------------------------------------------------------本系的 BBS 系统真是多灾多难 (嗯 .... 其实是因为我的疏忽,才会这么多灾多难 ....) ,继这几日系统时间不正确,造成许多人的 ID 被误砍后,又一次因系统设定上的问题,将 BBS 的重要备份档给杀了。
这件事是学弟发现后告诉我的,当我上站来一见到他的mail, 当真是欲哭无泪,差点没去撞墙。
那时已是周六晚 11:00 左右,我一边想着要编一套说辞向大家解释无法替大家进行数据恢复旧信件与设定了,一边还在想是否能够挽回局面。
大家知道, UNIX like 的系统是很难像 M$ 的系统一样,做到 undelete 的,所有网管前辈都曾再三警告我们,要小心! 小心! 砍档之前三思而后行,砍了之后再后悔也没用。
虽然我已渐渐做到砍档三思而后行,但之次误砍事件是系统在背景中定时执行的,等到我找出原因时已是数据被砍后一个多小时。
我凭着一点点的印象,想起在网络上,有人讨论过在 Linux ext2 filesystem中 undelete 的可能性,但我所见到的多半是负面的答案,但好象真的有人做过这件事,于是我第一个所做的,就是马上将该数据原来所在的 partition mount成 read-only, 禁止任何的写入动作,不是怕再有数据被误砍 (因为已没什么可砍的了) ,而是怕有新数据写进来,新资料可能会覆盖到旧资料原本存在的磁区 (block) 。
我们现在唯一个指望,就是企图将数据原来存在的磁区一个个找回来,并且「希望」这些磁区上的旧资料都还在,然后将这些磁区串成一个数据。
终于被我找到了!! 原来这方面的技术文件就存在我自己的系统中 :-))/usr/doc/HOWTO/mini/Ext2fs-Undeletion.gz于是我就按照这份文件的指示一步步来,总算将一个长达 8MB 的压缩档数据恢复了 99%, 还有一个长达 1.1 MB 的压缩档完整无缺地救了回来。
感谢上帝、 Linux 的设计者、写那篇文件的作者、曾经讨论过此技术的人、以及 Linux 如此优秀的 ext2 filesystem, 让我有机会抢救过去。
现在,我将我的抢救步骤做一个整理让大家参考,希望有派得上用场的时候 (喔! 不,最好是希望大家永远不要有机会用到以下的步数 :-)))在此严正声明!! 写这篇文章的目的,是给那些处于万不得已情况下的人们,有一个挽回的机会,并不意味着从此我们就可以大意,砍档不需要三思。
前面提到,我有一个数据无法100% 救回,事实上,长达 8MB 的数据能救回 99% 已是幸运中的幸运,一般的情况下若能救回 70% - 80% 已经要愉笑了。
所以,不要指望 undelete 能救回一切。
预防胜于治疗! 请大家平时就养成好习惯,砍档前请三思!!!理论分析我们能救回的机会有多大? 在kernel-2.0.X 系列中(本站所用的kernel 是2.0.33) ,取决以下两点:数据原来所在的磁区是否没有被覆写?数据是否完全连续?第一点我们可以与时间竞赛数据恢复,就是当一发现数据误砍时,要以最快的速度umount 该 filesystem, 或将该 filesystem remount 成唯读。
就这次的情况而言,数据误砍是在事发一个小时后才发现的,但由于该 filesystem 写入的机会很少 (我几乎可确定一天才只有一次,做 backup),所以第一点算是过关了。
第二点真的是数据恢复要听天由命了,就本站所使用的 kernel, 必须要在假设「长数据」所占的 block 完全连续的情况下,才有可能完全救回来! 一个 block 是 1024 bytes,长达8 MB 的数据就有超过 8000 个 block。
在经常读写的 filesystem 中,可以想见长数据很难完全连续,但在我们的系统中,这一点似乎又多了几分指望。
同时,Linux ext2 如此精良的filesystem, 能做到前 7950 多个 block 都连续,这一点也功不可没。
好了,以下我就讲一下我的步骤。
数据恢复,抢救步骤 I - mount filesystem readonly该数据的位置原来是在 /var/hda/backup/home/bbs 下,我们系统的 filesystem 组态是:root@bbs:/home/ftp/rescue# dfFilesystem 1024-blocks Used Available Capacity Mounted on/dev/sda1 396500 312769 63250 83% //dev/sda3 777410 537633 199615 73% /home/dev/hda1 199047 36927 151840 20% /var/hda/dev/hda2 1029023 490998 485710 50% /home/ftp因此 /var/hda 这个 filesystem 要马上 mount 成 readonly (以下请用 root 身份):mount -o remount,ro /var/hda当然也可以直接 umount 它,但有时候可能有某些 process 正在此 filesystem下运作,您可能无法直接 umount 它。
因此我选择 mount readonly。
但您也可以用:fuser -v -m /usr看一下目前是那些 process 在用这个 filesystem, 然后一一砍掉,再 umount。
数据恢复,抢救步骤 II执行echo lsdel | debugfs /dev/hda1 | less看一下该 filesystem 最近被砍的 inode (数据) 有那些 (为什么是 /dev/hda1? 请见上头的 df 列表)? 在这奶F数据的重要资讯,如大小、时间、属性等等。
就我们的系统而言,其列示如下:debugfs: 92 deleted inodes found.Inode Owner Mode Size Blocks Time deleted ....................................................................29771 0 100644 1255337 14/14 Sat Jan 30 22:37:10 199929772 0 100644 5161017 14/14 Sat Jan 30 22:37:10 199929773 0 100644 8220922 14/14 Sat Jan 30 22:37:10 199929774 0 100644 5431 6/6 Sat Jan 30 22:37:10 1999请注意!我们必须要在数据大小、被砍时间等资讯中判断出要救回的数据是那一个。
在此,我们要救回 29773 这个 inode。
数据恢复,抢救步骤 III执行echo "stat <29773>" | debugfs /dev/hda1列出该 inode 的所有资讯,如下:debugfs: stat <29773>Inode: 29773 Type: regular Mode: 0644 Flags: 0x0 Version: 1User: 0 Group: 0 Size: 8220922File ACL: 0 Directory ACL: 0Links: 0 Blockcount: 16124Fragment: Address: 0 Number: 0 Size: 0ctime: 0x36b31916 -- Sat Jan 30 22:37:10 1999atime: 0x36aebee4 -- Wed Jan 27 15:23:16 1999mtime: 0x36adec25 -- Wed Jan 27 00:24:05 1999dtime: 0x36b31916 -- Sat Jan 30 22:37:10 1999BLOCKS:123134 123136 123137 123138 123140 131404 131405 131406131407 131408 131409 131 410 131411 131668TOTAL: 14现在的重点是,数据恢复必须将该 inode 所指的数据,所指的 block 全部找回来。
在这它?14 个 block? 不对啊! 应该要有 8000 多个 block 才对啊! 在这卯ilesystem 的「奥密」了。
上头所列的前 12 个 block 是真正指到数据资料的 block, 称之为 direct block 。
第 13 个称为第一阶 indirect block, 第 14 个称为第二阶 indirect block 。
什么意思? 该档的资料所在的 block 位置如下:各位明白吗? 第 13 个 (131411) 与第 14 个 block 其实不是 data, 而是 index,它指出接下来的 block 的位置。
由于一个 block 的大小是 1024 bytes, 一个 int 在 32 位系统中是 4 bytes, 故一个 block 可以记录 256 笔资料。
以 131411 block 为例,它所记录的资料即为 (在数据未砍前):131412 131413 131414 .... 131667 (共 256 笔)而这 256 个 block 就真正记录了数据资料,所以我们称为第一阶。
同理,第二阶就有两个层 index, 以 131668 来说,它可能记录了:131669 131926 132182 .... (最多有 256 笔)而 131669 的 block 记录为:131670 131671 131672 .... 131925 (共 256 笔)而这 256 个 block 才是真正储存数据资料的。
而我们要的,就是这些真正储存数据资料的 block 。
理论上,我们只要将这些 index block 的内容全部读出来,然后照这些 index把所有的 block 全部读到手,就能 100% 数据恢复 (假设这些 block 全部没有被新数据覆写的话)。
工程很大,但是可行。
不幸的是,在 kernel-2.0.33, 其设计是,如果该数据被砍了,则这些 index block 全部会规零,因此我所读到的是0 0 0 0 0 ..... (共 256 笔)哇! 没办法知道这些 data block 真正所在的位置。