1.rm-rf删除目录里的文件后,为什么可以恢复?

105317164.jpg

首先创建一个空目录test,目录的blocksize为4096字节

100805859.jpg

为了空目录还是4096?首先,目录的大小取决它所包含的文件的inode(访问时间,文件的字节数,uid和gid),4096的大小是在建立文件系统时规划的。可以使用dumpe2fs查看

101617189.jpg

看到根分区的blocksize是默认4096

下面继续,我们在新建的test目录里创建1000个文件

for ((i=0; i<1000; i++)); do touch file$i; done

102127989.jpg

由于创建了1000个新文件,所以test目录的blocksize也变大了,随即我们把test目录下的所有文件删除,再次查看test目录发现,目录里为空,但是目录本身的bocksize仍然不变,这也就是我们“数据恢复”的原理:因为rm-rf只是删除了directoryentry相关的描述符(dirfd)而datablocks,inodes和metadata仍然存在磁盘里。

102453701.jpg

可以使用stace查看我的想法,rm-rf过程中主要调用unlinkat()和fstatat64()两个systemcall

110525380.jpg

fstatat()这个systemcall作用是getfilestatusrelativetoadirectoryfiledescriptor

unlinkat()这个systemcall作用是removeadirectoryentryrelativetoadirectoryfiledescriptor

可以看出删除的过程中只是获取与目录文件描述信息有关的文件状态并且删除directoryentry对应的文件描述符(其实“目录”的内容就是一长串directoryentry的数据结构,directoryentry用来描述文件名和inode地址)因为datablocks,inodes以及inodes里存放的metadata(文件大小、所属关系等)仍然存在磁盘里,所以目录的大小在删除目录里文件后没有任何变化。

所以使用photorec恢复一下被删除的文件,轻而易举的恢复了。

2.关于使用vim编辑文件大小问题

我们创建一个文件file,vim打开输入内容“1234567”共7个字节

143058110.jpg

查看file文件的大小为8个字节

使用od查看,vim会自动补上一个字节\n换行符,所以7个字节变成8个字节

143642274.jpg


3.软连接文件大小问题

首先给install.log文件创建一个软连接名为install,查看软连接install的大小为11字节,为什么是11字节呢?数数原文件的文件名字节数11字节,这就对了。

144723127.jpg

4.如何真正删除一个文件

1.删除文件描述符(filedescriptor),由第一个问题可以知道,执行rm-rf*后其实删除的文件是可以恢复的,也就是说文件的数据还是可以被访问的,是因为datablocks,inodes以及inodes里存放的metadata都在磁盘上。

2.删除元数据(metadata),可以使用>filename,datablock里的真实数据依然存在磁盘里。

3.删除真实数据(datablock),需要产生一些随机数填充文件,然后再删除文件

顺序是ddif=/dev/randomof=filename然后rm-rffilename

这样真实数据就会被删除。更快的方法是使用设备/dev/urandom,不过虽然没有/dev/random的随机性强,但已经能满足擦除磁盘数据的目的了。

为什么使用/dev/random设备比使用/dev/zero设备更好一些呢?

两者设备都会读取之前数据记录(datatrace),使用/dev/zero会比使用/dev/random设备更容易读取到之前的数据记录(datatrace)。