首页微盘公告硬盘写到一半时断电,文件体系里会发作啥

硬盘写到一半时断电,文件体系里会发作啥

分类:微盘公告

2017-03-23

455

知乎疑问:


断电时文件系统发生了啥?硬盘又发生了啥?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?


更进一步的, 文件系统如何保证事务性, 会不会存在某种极点情况致使例如最终几个bit还没写完, 文件系统却认为它成功了的情况?


答复不限任何文件系统,谢谢!



作者「北极」的答复:



断电的一瞬间,很多工作是无法判定的:


1.你无法判定你企图向设备驱动发送的写指令是不是成功,驱动程序自身一般都有缓存;


2. 即使写指令正常回来,你也无法判定设备实习上是不是写成功,因为设备自身或许也有缓存。现在没有设备能保证写指令回来的情况下,一切数据一定成功的保存在介质上(但有些厂商能保证少量数据一定能成功写入),对存储设备的flush操作并非必定可靠;


3. 哪些成功哪些失利或许是乱序的,换句话说,假设先发送写央求A,再发送写央求B,并且都成功回来,掉电时央求A或许扔掉,但B成功(NCQ功用);


4. 机械式磁盘或许会出现扔掉半截数据的情况(比如,一个512字节扇区只写入了100字节,也便是题主说的bit级差错),但这种一般都会通过校验位查看出来。


因为有以上这么多的约束,实习上文件系统一般没办法保证数据一定不扔掉,甚至哪些扔掉哪些能恢复也是不判定的。


一般来说,文件系统有以下的几种战略:


1. 完全不管差错的工作,错了就错了;


2. 打符号位的办法,假设怀疑有错,通过磁盘查看功用恢复;


3. 在计划上保证文件系统结构上可恢复,但不保证用户数据可恢复;


4. 能在用户数据层面上保证数据的必定精确。


第一种和第二种战略现在比照稀有,FAT文件系统算是归于这类;干流文件系统基本上都能保证第三种,比如NTFS之类的;第四种比照难,一般都要合作存储驱动一起,多见于Flash介质的专属文件系统。


保证数据不损坏,具体的方案一般有:


方案1:Copy-On-Write,写数据的时分不在本来的方位写,而是先读一份,然后写到其他一个方位,当供认写成功时,把文件系统的指针指向新的方位。如下图:



实习运用中,比这个情况凌乱,因为Data2写入的过程中,File1自身的一些信息(修正时间等)也发生了改动,所以CopyOnWrite发生的影响不止这一个块,而是很多。


方案2:日志(Journal)技能。运用日志记载meta-data甚至是数据块的改动情况(NTFS便是这种战略),一旦出现掉电情况,在日志中反推到一个精确的情况上,就可以保证meta-data不损坏。


多见的方案就这两种,当然还有其他更凌乱的技能,可以参阅这个衔接(Comparison of file systems),但不管用啥方案,本质上都是以牺牲功用为价值交流结构上的安稳。


最终回到题主的疑问,文件系统如何保证数据的精确性?假设是指文件的数据有些,是无法保证的,因为文件系统无法判定数据究竟写没写进入,绝大多数文件系统只能保证自身结构是精确的,但这个精确或许是回滚往后的情况,具体回滚多少内容,文件系统自个也不能保证。


这事说起来挺凌乱的,不一样文件系统,不一样设备,不一样介质,效果都是有区其他。


作者「马涛」的答复:



文件系统的计划一般是功用和数据完整性的让步,假设你想要最高完整性,那么功用会差一些,假设你想要最高功用,那么数据完整性会差一些,仅此而已。当然这些都是对于数据而言的,对于文件系统自身的元数据,一般计划者为了自身数据完整性的考虑都会有日志系统(比如ext4运用jbd2),然后尽量保证文件系统在断电时没有疑问或许疑问很少(需要运用fsck来处理),但是用户数据是不是完备是由用户选择和配备的,而文件系统会根据不一样配备选择不一样的战略。


我们以Linux最通用的ext4为例,他有三种形式供用户选择data=writeback/ordered/journal,对应的是数据落盘的三种办法,writeback是指元数据更新的时分数据不考虑是不是落盘,所以掉电往后或许会看到一些凌乱无章的数据,ordered的意思是元数据更新在数据更新往后(假设你没有更改元数据那就没有办法保证数据了),还有一种是journal意思是数据也先写journal再写文件(double write),这种数据安全性最高,当然功用也最差。具体的介绍可以参与mount(8)。


说完文件系统,我们再说硬盘,硬盘微盘经纪人在文件系统下面,所以文件系统是重度依托硬盘来完结数据完整性的,而硬盘也供应了一些指令来保证文件系统数据完整性的语义。比如硬盘会供应flush指令,保证只需上层文件系统调用了这个指令,那么文件系统之前写到硬盘里面的内容有必要落盘了(一般的硬盘有内存cache,为了进步写入功用会缓存一有些数据,flush会指令硬盘将cache内容落盘。当然假设硬盘假设有电容可以保证cache即使掉电也会落盘,那么他也可以诈骗上层的文件系统 :) ),这么文件系统在写入一些要害数据往后有必要调用flush,在得到硬盘的flush反响往后再进行后边的工作。当然现代硬盘还有一些FUA(Force Unit Access)之类的操作,这些是为了加快某类磁盘落盘的操作,本质上即使硬盘不供应文件系统可以改成write+flush来完结(只是功用差一些),假设感兴趣我们可以自行google之。


说完底层,还有一层要说一下,便是你的运用是如何写文件和硬盘的,假设是buffer write(运用只写到操作系统的内存,由操作系统推迟回写到硬盘),那么很大或许你在掉电之前一段时间写入的数据都会不见了(操作系统还没有回写),假设运用是direct IO(运用绕过操作系统内存,直接写硬盘),那么或许只要掉电时间正在写入的数据不见了,当然这儿或许还涉及到direct IO的语义以及不一样文件系统的具体完结,和文件系统有关,就需要具体疑问具体分析了。

Cg-4WVGcYomIKsQ2AABkqDV6xIUAAIo4gAxsJMAAGTA904.jpg

留言(●'◡'●)

欢迎 发表评论:

热门微盘代理 标签云 关于我们 |

赚钱牛盘网致力成为微盘代理招商导航第一平台!

Powered By 微盘代理招商导航第一平台