Linux 日誌文件系統原來是這樣工作的

2021-02-14 民工哥技術之路

點擊上方「民工哥技術之路」,選擇「設為星標」

回復「1024」獲取獨家整理的學習資料!


文件系統要解決的一個關鍵問題是怎樣防止掉電或系統崩潰造成數據損壞,在此類意外事件中,導致文件系統損壞的根本原因在於寫文件不是原子操作,因為寫文件涉及的不僅僅是用戶數據,還涉及元數據(metadata)包括 Superblock、inode bitmap、inode、data block bitmap等,所以寫操作無法一步完成,如果其中任何一個步驟被打斷,就會造成數據的不一致或損壞。

舉一個簡化的例子,我們對一個文件進行寫操作,要涉及以下步驟:

從data block bitmap中分配一個數據塊;

在inode中添加指向數據塊的指針;

把用戶數據寫入數據塊。

如果步驟2完成了,3未完成,結果是數據損壞,因為該文件認為數據塊是自己的,但裡面的數據其實是垃圾;

如果步驟2完成了,1未完成,結果是元數據不一致,因為該文件已經把數據塊據為己有,然而文件系統卻還認為該數據塊未分配、隨後又可能會把該數據塊分配給別的文件、造成數據覆蓋;

如果步驟1完成了、2未完成,結果就是文件系統分配了一個數據塊,但是沒有任何文件用到這個數據塊,造成空間浪費;

如果步驟3完成了,2未完成,結果就是用戶數據寫入了硬碟數據塊中,但白寫了,因為文件不知道這個數據塊是自己的。

日誌文件系統(Journal File System)就是為解決上述問題而誕生的。

它的原理是在進行寫操作之前,把即將進行的各個步驟(稱為transaction)事先記錄下來,保存在文件系統上單獨開闢的一塊空間上,這就是所謂的日誌(journal),也被稱為write-ahead logging,日誌保存成功之後才進行真正的寫操作、把文件系統的元數據和用戶數據寫進硬碟(稱為checkpoint),這樣萬一寫操作的過程中掉電,下次掛載文件系統之前把保存好的日誌重新執行一遍就行了(術語叫做replay),避免了前述的數據損壞場景。

有人問如果保存日誌的過程中掉電怎麼辦?最初始的想法是把一條日誌的數據一次性寫入硬碟,相當於一個原子操作,然而這並不可行,因為硬碟通常以512位元組為單位進行操作,日誌數據一超過512位元組就不可能一次性寫入了。所以實際上是這麼做的:給每一條日誌設置一個結束符,只有在日誌寫入成功之後才寫結束符,如果一條日誌沒有對應的結束符就會被視為無效日誌,直接丟棄,這樣就保證了日誌裡的數據是完整的。

一條日誌在它對應的寫操作完成之後就沒用了,佔用的硬碟空間就可以釋放。保存日誌的硬碟空間大小是有限的,被循環使用,所以日誌也被稱為circular log。

至此可以總結一下日誌文件系統的工作步驟了:

Journal write : 把transaction寫入日誌中;

Journal commit : 在一條日誌保存好之後,寫入結束符;

Checkpoint : 進行真正的寫操作,把元數據(metadata)和用戶數據(user data)寫入文件系統;

Free : 回收日誌佔用的硬碟空間。

以上方式把用戶數據(user data)也記錄在日誌中,稱為Data Journaling,Linux EXT3文件系統就支持這種方式,這種方式存在效率問題:

就是每一個寫操作涉及的元數據(metadata)和用戶數據(user data)實際上都要在硬碟上寫兩次,一次寫在日誌裡,一次寫在文件系統上。元數據倒也罷了,用戶數據通常比較大,拷貝幾個GB的電影文件也要乘以2實在是降低了效率。

一個更高效的方式是Metadata Journaling,不把用戶數據(user data)記錄在日誌中,它防止數據損壞的方法是先寫入用戶數據(user data)、再寫日誌,即在上述」Journal write」之前先寫用戶數據,這樣就保證了只要日誌是有效的,那麼它對應的用戶數據也是有效的,一旦發生掉電故障,最壞的結果也就是最後一條日誌沒記完,那麼對應的用戶數據也會丟,效果與Data Journaling丟棄日誌一樣,重要的是文件系統的一致性和完整性是有保證的。

Metadata Journaling又叫Ordered Journaling,大多數文件系統都採用這種方式。像Linux EXT3文件系統也是可以選擇Data Journaling還是Ordered Journaling的。

參考資料:Crash Consistency: FSCK and Journaling

來源:http://linuxperf.com/?p=153

華為第一款臺式機正式上線!

用了 10 年 Windows 後,我最終轉向 Linux

從 lsof 開始,深入理解 Linux 虛擬文件系統

一款超牛逼的 Linux 終端復用神器(附安裝、使用教程)

超詳細 116 頁 Elasticsearch 實戰文檔!高清可下載

抓包工具 tcpdump 用法說明

Linux 系統多網卡環境下的路由配置

Linux 或 Windows上實現埠映射

相關焦點

  • Linux系統文件
    1.文件系統定義1)文件系統是一種組織計算機文件和資料的方法;2)作業系統中封裝的系統服務程序,實際上是一個軟體程序,用來存儲和管理計算機文件和資料。 2.文件系統分類1)磁碟文件系統:NTFS(Windows下),EXT3(linux下,基於日誌);2)快閃記憶體文件系統(u盤):JFFS2,YAFFS;3)資料庫文件系統
  • Linux-系統日誌簡介
    前言日誌在排查文件的時候至關重要,在Linux上一般跟系統相關的日誌默認都會放到/var/log下面。1、/var/log/boot.log一般包含系統啟動時的日誌,包括自啟動的服務。在系統啟動時,會在屏幕上顯示許多與硬體有關的信息。可以直接查看這個文件或者使用dmesg這個命令查看。5、/var/log/lastlog記錄所有用戶的最近信息。非文本文件,可以使用lastlog進行查看。6、/var/log/maillog包含來著系統運行電子郵件伺服器的日誌信息。
  • 深度好文:Linux文件系統剖析
    在註冊新的文件系統時,會把這個文件系統和它的相關信息添加到 file_systems 列表中(見圖 2 和 linux/ include/ linux/ mount.h)。這個列表定義可以支持的文件系統。在命令行上輸入 cat /proc/filesystems,就可以查看這個列表。圖 2. 向內核註冊的文件系統
  • Linux文件系統
    1.EXT3EXT3是基於日誌方式的文件系統;系統中每個文件都是有索引,用戶對對文件的每一個操作都會記錄日誌,形成一個任務隊列排著執行   (可以監控用戶對文件系統的操作,比如:用戶在進行操作的時候發生了什麼錯誤,或者類似於崩潰這樣的問題,它可以通過得到相應的記錄從而進行很好地檢修或更改修復,同時把用戶的操作記錄成日誌後
  • Linux 文件和文件夾權限詳解
    Linux 文件和文件夾權限詳解一點PHP建站技術分享之linux權限探討,很多初學者只是在練習的時候使用過幾次命令,例如chmod又或者chown等,但是很少會在實際中會去關心這個問題,下面一點博主詳細給大夥分析linux
  • Linux運維之Linux文件管理
    我們先來看看Linux系統大體上的目錄有哪些Linux系統目錄結構在Linux系統中,目錄被組織成一個:單根倒置樹結構,文件系統從根目錄開始,用/來表示。文件名稱區分大小寫( 大小寫敏感還需要看具體的文件系統格式 ),以.開頭的為隱藏文件,路徑用/來進行分割(windows中使用\來分割),文件有兩個種類:元數據與數據本身.在操作linux系統時,通常會遵循以下的分層結構規則:LSB (Linux Standard Base) / FHS
  • 最小的Linux系統製作過程詳解
    五,linux系統引導過程簡介首先,主板的BIOS會讀取硬碟的主引導記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬碟讀取作業系統核心文件並運行,因為這個小程序太小了,因此通常這個小程序不具備直接引導系統內核的能力,他先去引導另一個稍微大一點的小程序,再由這個大一點的小程序去引導系統內核.在linux系統中這樣的小程序有LILO和GRUB.在這個項目中,我決定用
  • 嵌入式Linux NFS 根文件系統的構建及研究
    摘要:在嵌入式Linux系統開發過程中,根文件系統是構建嵌入式Linux系統的重要組成部分。為了方便和簡化嵌入式Linux開發過程中的調試過程,主要研究了如何使用Busybox構建出基本的嵌入式Linux根文件系統,包括Busybox的配置、編譯和安裝。
  • 性能工具之linux常見日誌統計分析命令
    引言在上文中性能工具之linux三劍客awk、grep、sed詳解,我們已經詳細介紹 linux
  • Linux 系統內核的調試
    這樣,就與目標機上的kgdb調試接口建立了聯繫。一旦建立聯接之後,對Linux內的調試工作與對普通的運用程序的調試就沒有什麼區別了。任何時候都可以通過鍵入ctrl+c打斷目標機的執行,進行具體的調試工作。  在kgdb 2.0之前的版本中,編譯內核後在arch/i386/kernel目錄下還會生成可執行文件gdbstart。
  • 基於busybox的嵌入式Linux根文件系統的的製作方法
    根文件系統一直是Linux系統不可或缺的組件,在嵌入式Lin-ux中,內核在啟動期間進行的最後操作之一就是安裝根文件系統。Busybox是構建嵌入式Linux根文件系統的軟體,用它製作根文件系統簡單、方便,而且設置靈活。
  • 在linux下使用noatime提升文件系統性能的方法
    在linux下使用noatime提升文件系統性能的方法 linux系統功能強大,但是目前大多數用戶都是用的是windows系統,對於linux系統來說很多功能用戶還很陌生,本文介紹了在linux下如何使用noatime提升文件系統性能的方法。
  • ARM Linux根文件系統Root Filesystem的製作
    首先介紹根文件系統的組成:目錄、Shell、庫、腳本,一個個來。根文件系統要包含這些必須有的目錄:/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys/dev是devfs(設備文件系統)或者udev的掛在點所在。
  • WinSCP軟體雙系統(Win-Linux)文件傳輸教程
    WinSCP軟體是windows下的一款使用ssh協議的開源圖形化SFTP客戶端,也就是一個文件傳輸的軟體,它有什麼優點嗎,咱們嵌入式開發中經常會將windows中的文件複製到linux系統當中,比較常用的方式就是添加共享文件夾,每次通過添加的共享文件夾來相互傳輸文件,這裡介紹的是一款能夠跨系統使用的文件傳輸軟體。
  • 如何在Linux系統安裝Apollo
    安裝Apollo軟體,需要提前準備環境:JDK1.8,mysql5.7安裝資料庫:參照- Linux系統安裝mysql資料庫.docx文件即可,安裝JDK1.8(1)將jdk-8u211-linux-x64.tar.gz文件拷貝到相關目錄,執行解壓命令:tar –zxf jdk-8u211-linux-x64.tar.gz(2)配置環境變量:vim /etc/profile編輯如下內容:
  • 採用busybox的嵌入式Linux根文件系統的的製作方法
    根文件系統一直是Linux系統不可或缺的組件,在嵌入式Lin-ux中,內核在啟動期間進行的最後操作之一就是安裝根文件系統。Busybox是構建嵌入式Linux根文件系統的軟體,用它製作根文件系統簡單、方便,而且設置靈活。
  • Linux 下重要文件被刪除?我有妙招
    誤刪除linux系統文件了?不用急,本文將給你一個恢復linux文件的方法,讓你輕鬆應對運維中的各種風險問題。
  • Linux系統logger日誌命令詳解
    -f file_name    記錄特定的文件。-p priority_level    指定輸入消息的優先級,優先級可以是數字或者指定為 「facility.level」 的格式。比如:"-p local3.info " local3 這個設備的消息級別為info。默認級別是 「user.notice」。-s    將消息記錄到標準錯誤以及系統日誌。
  • 基於S3C2440的嵌入式Linux根文件系統構建
    而文件系統作為作業系統的重要組成部分,用於控制對數據文件及設備的存取,提供對文件和目錄的分層組織形式,數據緩衝以及對文件存取權限的控制。根文件系統一直是Linux系統不可或缺的組件,在嵌入式Lin-ux中,內核在啟動期間進行的最後操作之一就是安裝根文件系統。busybox是構建嵌入式Linux根文件系統的軟體,用它製作根文件系統簡單、方便,而且設置靈活。
  • linux作業系統常用命令及常用問題
    ●apt :APT是一個為Debian系列系統(Ubuntu,Kubuntu等等)開發的高級包管理器,在Gnu/Linux系統上,它會為包自動智能地搜索、安裝、升級以及解決依賴問題。在你的Linux機器上跟蹤系統事件的守護進程名是什麼?        'syslogd',它負責跟蹤系統信息,並將跟蹤日誌存儲在特定的日誌文件裡。●4.