日志文件系统(journaling file system)是一个具有故障恢复能力的文件系统,在这个文件系统中,因为对目录以及位图的更新信息总是在原始的磁盘日志被更新之前写到磁盘上的一个连续的日志上,所以它保证了数据的完整性。当发生系统错误时,一个全日志文件系统将会保证磁盘上的数据恢复到发生系统崩溃前的状态。同时,它还将覆盖未保存的数据,并将其存在如果计算机没有崩溃的话这些数据可能已经遗失的位置,这是对关键业务应用来说的一个很重要的特性。

并不是所有的操作系统都提供了同样的日志技术。Windows NT提供了一个完整系统的不太健壮的版本。如果你的Windows NT系统崩溃了,你可能不会丢失整个磁盘卷,但你可能会丢失系统崩溃前没写到磁盘的所有数据。出于同样的原因,缺省的Linux系统,ext2fs,根本没有登记日志。这就意味着,一旦系统崩溃——虽然在Linux系统中不常见——就会毁坏整个磁盘卷。

NTFS是日志式文件系统,U盘\闪存卡的储存芯片读写次数是有限的
使用NTFS系统的话,意味着所有对磁盘的操作都要记录日志。
大量的小文件读写对于U盘寿命有影响。NTFS做日志记录那点开销谈不上伤吧 大容量的、对数据一致性有要求的、一直挂载在设备上的应该用有日志的文件格式 exfat容易丢数据 适合只用来临时几个文件拷过来拷过去的用途 像拔下来要win上插过mac再插的话很容易读不出来 经常要手动fsck

对于 SMR 叠瓦式硬盘怎样使用才最合理?

扔了最合理
smr叠瓦式硬盘最合理的使用方法,是当成CD-RW光盘用。

很多年轻的朋友都没经历过光盘当红的年代,2010年后电脑上的光驱都开始淘汰了。

CD光盘分3类:
一种叫CDROM,是只能工厂刻录,用户买回来只能读不能写,通常用来印刷正版软件和影音、游戏。我们平时买到的亮银色的盗版光盘就是这种。
一种叫CD-R,是内容空白的,用户买回来后只能写入一次,然后就只能读取不能再写入,就跟白纸一样,拿钢笔写过字了就只能看,擦不掉了。
最后一种叫CD-RW,也是空白的,用户买回来后能多次写入和擦除,但每次擦除会损伤光盘涂层,通常擦十几次(国产劣质)到百多次(飞利浦原装)就不能用了。就好像拿铅笔在白纸上写字,用橡皮擦可以擦,但擦几十次纸就烂了。

smr叠瓦式硬盘的擦写特性,就很像完美品质的CD-RW,擦写几千次应该没问题,但跟普通硬盘的几十万次寿命没得比。

所以使用时我建议减少写入次数,也就是只往里面存,不删除。过个一年半载,再买一个硬盘将文件全盘复制过去,然后格式化旧盘,又能当新的用。

用支持cow的文件系统,比如REFS,btrfs,叠瓦虽然写入慢,但是读快。

买条16g傲腾插电脑上加速。

避免做raid,raid重建妥妥报废

经常混合读写,做好硬盘报废准备

SMR盘有好几种,一种带TRIM,一种不带TRIM,带TRIM还好说,不带TRIM你大文件拷多了照样掉速到40m/s
理论党,未经验证,欢迎各位6大佬指正。

SMR的原理就不重复了,简单来说就是因为改写操作麻烦,导致覆盖写入性能低下,并且容易因为扇区映射表的频繁更新导致磁盘故障。

所以,理论上如果用于覆盖写入少的场景,就能较大程度的避免SMR的这个缺点。哪些场景的覆盖写入少呢?我个人认为使用具备COW(Copy On Write,写时复制)特性的文件系统就可以很好的满足这个要求,例如ReFS、ZFS、BtrFS。

当然,即使是cow的文件系统,也是必须要有充裕的未使用空间,才能尽可能避免产生覆盖写入操作。过多的分区会导致未使用空间变小,并不利于文件系统充分利用未使用扇区。

(图片见原链接)

日志型文件系统 - 原理和优化

兰新宇

talk is cheap

关注他

76 人赞同了该文章

说明:本文示例基本来自CRASHCONSISTENCY: FSCKANDJOURNALING。

位于磁盘上的文件系统需要面临的一个问题是:当系统crash或者意外掉电的时候,如何维持数据的一致性。比如现在为了完成某项功能,需要同时更新文件系统中的两个数据结构A和B,因为磁盘每次只能响应一次读写请求,势必造成A和B其中一者的更新先被磁盘接收处理。如果正好在其中一个更新完成后发生了掉电或者crash,那么就会造成不一致的状态。

假设一个文件系统在磁盘上的分布是这样的:其中包括一个文件的inode(即I[v1]),data block(即Da)和记录分配状态的inode bitmap, data bitmap。

(图片见原链接)

现在要在文件末尾追加一部分内容,那么需要分配一个新的data block(即Db),这会导致inode和data bitmap都发生相应的变化。

(图片见原链接)

因此需要对磁盘的三个不同位置(3个blocks)分别进行写操作,如果在这三次写操作的间隙发生了crash,那么可能出现若干种情况:只更新了其中一个部分,或者只更新了其中的两个部分。

传统的Unix系统对此的解决办法是使用fsck工具,但是fsck通常需要在发生crash重启后,扫描整个磁盘,繁琐且速度较慢,因此目前更流行的做法是使用日志(Journaling)。

原理

日志型文件系统的基本思想是这样的:在真正更新磁盘上的数据之前,先往磁盘上写入一些信息,这些信息主要是描述接下来要更新什么,相当于 wrtie ahead,因此这种方式又被称为write-ahead logging。

这样,即便发生crash,也可通过记录的日志信息,回溯并恢复crash前正在进行的操作(称为replay)。在更新的时候增加一点额外的操作,换来了recovery时所需的工作量的减少。

在Linux中,ext2文件系统将磁盘划分成若干个block groups,每个block group包含一个inode bitmap, data bitmap, inodes和若干个data blocks,它没有使用日志。

(图片见原链接)

而在ext3文件系统中,加入了对日志的支持,日志部分单独占据一块磁盘空间。

(图片见原链接)

还是前面那个例子,现在我们要更新磁盘上的inode(I[v2]), bitmap(B[v2])和data block (Db)。在更新这个数据之前,我们把这个更新操作的步骤(称为一个 transcation),加上分别表示这个transcation开始和结束的TxB和TxE,写入磁盘。

Transaction的概念起源于数据库领域,它有助于在操作未能完成的情况下保证数据的一致性。同一transcation的TxB和TxE具有相同的sequence number。

(图片见原链接)

在一个记录步骤信息的transcation完成之后,才真正地更新磁盘上的文件数据(这一步称为checkpoint)。

Journal是为了保证数据一致性的,而journal本身也是由多个部分组成,那在写入journal的过程中发生了crash怎么办?由于I/O scheduling等原因,各个部分不一定是按照提交的顺序写入的(out of order),那么可能出现下图所示的这种情况:缺少了Db,但TxB和TxE都存在,系统恢复的时候会误以为这是一个完整的transcation。

(图片见原链接)

解决的办法是使用write barrier。写入除TxE以外的部分后(这一步叫做 journal write),执行一次barrier操作(对于支持journal checksum的ext4文件系统,此步骤可省略)。如果在此期间crash了,由于没有TxE,这个transcation会被认为是不完整的,重启后就不会试图恢复这个transcation所代表的步骤。

(图片见原链接)

待journal write顺利完成以后,再写入TxE(这一步叫做 journal commit),然后再执行一次barrier操作,以保证数据的写入是发生在journal完成之后(write barrier在保证数据一一致性的同时,会不可避免地对性能造成影响,如果能够接受不使用barrier带来的潜在风险,可以在mount文件系统的时候使用"nobarrier"选项)。

(图片见原链接)

因此,在日志型文件系统中,一个完整的数据写操作由"journal write","journal commit"和"checkpoint"三部分组成。写操作完成后,就可以释放journal本身所占据的磁盘空间了。

(图片见原链接)

至此,涉及多个block的写操作的数据一致性问题算是有了保证,但这基于的是一个block的数据要么完全写了,要么完全没写的前提,那会不会出现一个block的数据只写了一部分的情况呢(half-written)?这其实是一个原子性的问题,由磁盘本身提供保障,即对一个block的操作必须是原子的(不可分割的)。

优化

journal好是好,不过要多做的工作也是显而易见的,别的不说,磁盘的I/O负载首先就会蹭蹭地上升。那有什么办法可以优化吗?(此处的「优化」是真的优化哈,不是公司裁人的那种所谓“优化”)。

一种比较容易想到的方法是将多个journal的操作进行聚合处理,这种batching的思想在软件设计中也是随处可见的。结合到日志型文件系统自身的过程,还可以将journal中对"Db"的记录移除,即journal中只包含对inode和bitmap更新的记录。

(图片见原链接)

此时,write barrier只能保证对meta data(包括inode和bitmap)的真实写操作发生在journal的写操作之后,由于磁盘写操作的out of order特性,user data的真实写操作则可能发生在此过程中的任何节点,这种模式被称为"Writeback"。

允许out of order对性能的提升当然是有裨益的,但如果crash是发生在journal写操作之后,meta data的真实写操作之前(假设也在user data的写操作之前),那么进行文件系统的recover时,meta data的写操作会被replay,但是user data的写操作不会,这将有可能造成同一文件的meta data和user data的不一致(图1左侧部分)。

图 1(图片见原链接)

不过呢,Writeback模式相对完全不用journal的模式,造成不一致的概率降低了,不一致带来的危害也降低了,作为性能和稳健的平衡,还是有相当的可取之处的。如果想把稳健性再提高一点呢,就再多做出一点限制:即保证对user data的真实写操作发生在journal的写操作之前,这就是"Ordered"模式(图1中间部分)。

对于Ordered的模式,如果crash发生在user data的写操作之后,journal的写操作之前,那么将造成这一部分user data的丢失,不过不会造成不一致的问题。如果crash发生在journal的写操作之后,meta data的真实写操作之前,那么完全可以通过replay来还原。

可见,从"Writeback"模式,到"Ordered"模式(同为Metadata Journal),再到本文最开始介绍的基本模式(Data Journal),数据丢失和不一致的风险是依次降低的,而对性能的损耗则是依次升高的。现代的文件系统通常会提供多种模式的选择,供不同场景下的用户使用。

参考:

  • 日志文件系统是怎样工作的

  • https://en.wikipedia.org/wiki/Ext3

  • https://en.wikipedia.org/wiki/Journaling_file_system

  • Barriers and journaling filesystems

原创文章,转载请注明出处

日志文件系统(journaling file system)相关推荐

  1. 星际文件系统(InterPlanetary File System,缩写IPFS)

    星际文件系统(InterPlanetary File System,缩写IPFS)是个旨在创建持久且分布式存储和共享文件的络传输协议.它是一种内容可寻址的对等超媒体分发协议.在IPFS网络中的节点将构 ...

  2. adb 文件传输,解决只读文件系统Read-only file system问题

    操作代码: adb push C:\xxdir\project /sdcard/xxx 执行此行代码,有可能会报错:错误如下 failed to copy './xxx' to '/xxx/xxx': ...

  3. 内核中设置文件结束符_Linux 日志文件系统原来是这样工作的

    文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata) ...

  4. linux c 编程 pdf_C/C++编程笔记:Linux 日志文件系统未解之谜,你知道吗?

    文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata) ...

  5. linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...

    文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为写文件涉及的不仅仅是用户数据,还涉及元数据(metadata) ...

  6. 日志文件系统是怎样工作的

    原文:http://linuxperf.com/?p=153 文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏,在此类意外事件中,导致文件系统损坏的根本原因在于写文件不是原子操作,因为 ...

  7. linux - FSCK与日志文件系统

    日志文件系统(Journal File System)解决了掉电或系统崩溃造成元数据不一致的问题,细节参见<日志文件系统是怎样工作的>,它的原理是在进行写操作之前,把即将进行的各个步骤(称 ...

  8. FSCK与日志文件系统

    转载自 FSCK与日志文件系统 日志文件系统(Journal File System)解决了掉电或系统崩溃造成元数据不一致的问题,细节参见日志文件系统是如何工作的, 它的原理是在进行写操作之前,把即将 ...

  9. 【转】The Google File System 中文版

    原文链接 http://www.cnblogs.com/lijunjie/archive/2011/03/08/1976660.html#top 摘要 我们设计并实现了Google GFS文件系统,一 ...

最新文章

  1. jquerymobile知识点三:弹出层popup
  2. java有没有求组合的函数_如何在Java 8中使用compose和andThen组合函数
  3. c语言程序设计论文结构,c语言顺序结构设计实验报告.docx
  4. json.dumps()和json.loads()
  5. 域名”A记录,MX记录,CNAME记录,TTL值,URL转发”解释
  6. php 获取URL 各部分参数
  7. V8 Promise源码全面解读
  8. matplotlib 旋转刻度_Matplotlib数据可视化:文本与坐标轴
  9. Java安全编码之用户输入
  10. Eclipse导入android项目包xml报错
  11. Avoided redundant navigation to current location
  12. 程序员撕开京东 618 大促压测的另一面 | 原力计划
  13. css table 合并单元格
  14. Kerloud UAV室内光流定位教程
  15. 华为会强迫升级鸿蒙,华为手机升级鸿蒙系统好用吗
  16. 写给独自站在人生面前的自己1-java加密算法
  17. 【Java】保留两位小数(不四舍五入)
  18. 不要为明天忧虑(10.14)
  19. python网课教学_如何上好网课 — 老师录课和在线上课教学经验谈
  20. Weakly-Supervised Physically Unconstrained Gaze Estimation论文翻译

热门文章

  1. Python获取Amazon限时特惠信息
  2. MySQL常见数据类型(小胖虎带你了解MySQL基础知识,只为博君一关注)
  3. Witt向量简介 §2.1:整数环Z关于p-进赋值的完备化的Z_p表示法
  4. 从电焊女工到Google台湾总经理
  5. 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】
  6. .Net CLR运行时是如何编译函数的
  7. spark-submit参数设置
  8. 秒杀秘籍大曝光 教你以超低价买到正品货
  9. Gem5和NVMain集成使用教程
  10. JS红宝书·读书笔记