深刻理解Linux文件系统

1.rm-rf删除目录里的文件后,为何能够恢复?node

105317164.jpg

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

100805859.jpg

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

101617189.jpg

看到根分区的blocksize是默认4096dom

下面继续,咱们在新建的test目录里建立1000个文件ide

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仍然存在磁盘里。ui

102453701.jpg

可使用stace查看个人想法,rm-rf过程当中主要调用unlinkat()和fstatat64()两个systemcallspa

110525380.jpg

fstatat()这个systemcall做用是getfilestatusrelativetoadirectoryfiledescriptor3d

unlinkat()这个systemcall做用是removeadirectoryentryrelativetoadirectoryfiledescriptorblog

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

因此使用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)。

相关文章
相关标签/搜索