Linux xfs文件系統stat命令Birth欄位為空的原因探究

来源:https://www.cnblogs.com/kerrycode/archive/2023/05/10/17389560.html
-Advertisement-
Play Games

在Linux平臺找出某個目錄下創建時間最早的文件,測試驗證腳本結果是否準確的過程中發現一個很有意思的現象,stat命令在一些平臺下Birth欄位有值,而在一些平臺則為空值,如下所示: RHEL 8.7下, XFS文件系統 [mysql@mysqlu02 ~]$ more /etc/redhat-re ...


在Linux平臺找出某個目錄下創建時間最早的文件,測試驗證腳本結果是否準確的過程中發現一個很有意思的現象,stat命令在一些平臺下Birth欄位有值,而在一些平臺則為空值,如下所示:

RHEL 8.7下, XFS文件系統

[mysql@mysqlu02 ~]$ more /etc/redhat-release 
Red Hat Enterprise Linux release 8.7 (Ootpa)
[mysql@mysqlu02 ~]$ touch test.txt
[mysql@mysqlu02 ~]$ stat test.txt
  File: test.txt
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd05h/64773d    Inode: 144         Links: 1
Access: (0644/-rw-r--r--)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2023-05-06 17:09:44.428050549 +0800
Modify: 2023-05-06 17:09:44.428050549 +0800
Change: 2023-05-06 17:09:44.428050549 +0800
 Birth: 2023-05-06 17:09:44.428050549 +0800

RHEL 7.9 XFS文件系統

[oracle@KerryDB ~]$ more /etc/redhat-release 
Red Hat Enterprise Linux Server release 7.9 (Maipo)
[oracle@KerryDB ~]$ touch test.txt
[oracle@KerryDB ~]$ stat test.txt
  File: ‘test.txt’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd03h/64771d    Inode: 4238838     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  700/  oracle)   Gid: (  600/oinstall)
Access: 2023-05-06 17:03:42.964517675 +0800
Modify: 2023-05-06 17:03:42.964517675 +0800
Change: 2023-05-06 17:03:42.964517675 +0800
 Birth: -
[oracle@KerryDB ~]$

stat命令的Birth欄位表示文件的創建時間,該屬性是ext4的新功能(當然也適用於xfs文件系統),也稱為crtime或btime,但是當前兩個測試環境的文件系統為xfs,之前也在xfs文件系統中測試過,發現xfs不支持creation time. 但是從xfs v5開始,xfs已經支持creation time,文檔[1]中已有闡述,如下所示:

/* version 5 filesystem (inode version 3) fields start here */
     __le32                    di_crc;
     __be64                    di_changecount;
     __be64                    di_lsn;
     __be64                    di_flags2;
     __be32                    di_cowextsize;
     __u8                      di_pad2[12];
     xfs_timestamp_t           di_crtime;
     __be64                    di_ino;
     uuid_t                    di_uuid;

};

*di_crtime*::
Specifies the time when this inode was created.

但是上面這個差異現象,還是讓我有點好奇,因為兩個測試環境對應的xfs版本都是v5,如下所示。

KerryDB這台機器的xfs版本信息:

Oracle用戶:

$ uname -r
3.10.0-1160.80.1.el7.x86_64

$
 dmesg | grep -iE 'xfs.*\s+mounting' | head -1
[    4.041026] XFS (dm-0): Mounting V5 Filesystem

root用戶:

# xfs_db -r /dev/mapper/vg00-home
xfs_db> version
versionnum [0xb4b5+0x18a] = V5,NLINK,DIRV2,ATTR,ALIGN,LOGV2,EXTFLG,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT,CRC,FTYPE
xfs_db>

mysqlu02這台機器的xfs版本信息:

mysql用戶:

$ dmesg | grep -iE 'xfs.*\s+mounting' | head -1
[    7.654324] XFS (dm-0): Mounting V5 Filesystem

root用戶:

# xfs_db -r /dev/mapper/vg00-home
xfs_db> version
versionnum [0xb4b5+0x18a] = V5,NLINK,DIRV2,ATTR,ALIGN,LOGV2,EXTFLG,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT,CRC,FTYPE,FINOBT,SPARSE_INODES,REFLINK
xfs_db>

那麼到底是什麼原因導致。Google搜索了相關資料,原來,如果stat命令查看xfs文件系統的文件時,如果要Birth欄位不顯示空置,必須滿足幾個條件,一個是xfs的版本為v5,另外,對操作系統內核版本也有要求(如下所示)

stat “now prints file creation time when supported by the file system, on GNU Linux systems with glibc >= 2.28 and kernel >= 4.11.”

KerryDB這台伺服器內核信息如下所示

$ uname -r
3.10.0-1160.80.1.el7.x86_64

mysqlu02這台伺服器的內核信息如下所示:

$ uname -r
4.18.0-425.3.1.el8.x86_64

如上所示,stat命令Birth欄位為空置的操作系統內核版本為3.10.0,不滿足條件kernerl >=4.11 所以stat命令顯示空值。

參考資料

[1]

1: https://git.kernel.org/pub/scm/fs/xfs/xfs-documentation.git/tree/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc

掃描上面二維碼關註我 如果你真心覺得文章寫得不錯,而且對你有所幫助,那就不妨幫忙“推薦"一下,您的“推薦”和”打賞“將是我最大的寫作動力! 本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GMP調度場景 場景1 P擁有G1,M1獲取P後開始運行G1,G1使用 go func 創建G2,為了局部性G2優先加入到P1的本地隊列 場景2 G1運行完成後(函數:goexit),M上運行的goroutine切換為G0,G0負責調度時協程的切換(函數:schedule)。從P的本地隊列取G2,從 ...
  • Legends-Of-Heroes 一個LOL風格的球球大作戰游戲,基於ET7.2,使用狀態同步 Main 基於C#雙端框架[ET7.2],同步到ET主幹詳情請看日誌。(https://github.com/egametang/ET) 註意:已經升級.Net7,請安裝.Net7 SDK. 此游戲為E ...
  • 字元串駐留池(string intern pool)是指,對於某些編程語言,相同的字元串字面值(即具有相同文本內容的字元串)在程式運行時只會被在記憶體中存儲一份,即只保存一個字元串實例。這樣做可以減少記憶體占用,並提高程式執行的效率。 在 Java 中,字元串駐留池是一個存儲字元串的緩存,它存儲在運行時 ...
  • 1、創建WEBAPI 1 using Dapper; 2 using MesErp.Models; 3 using Microsoft.AspNetCore.Mvc; 4 using Microsoft.Extensions.Configuration; 5 using Newtonsoft.Jso ...
  • C#是一種強類型語言,可以捕獲和處理各種異常,從而幫助我們發現程式中出現的錯誤。在程式開發過程中,如果需要找到特定的錯誤情況並處理,這時就需要創建自定義異常。本文將介紹如何在C#中創建和使用自定義異常。 1、什麼是異常? 異常是指在程式執行期間發生的錯誤或異常情況,例如除法中除以0、文件不存在、記憶體 ...
  • 一:背景 1. 講故事 最近在分析一個 linux 上的 dump,最後的誘因是大量的lock鎖誘發的高頻上下文切換,雖然問題告一段落,但我還想知道一點信息,所謂的高頻到底有多高頻?鎖競爭到底是一個怎樣的鎖競爭? 如果瞭解這些信息對我們後續分析此類問題非常有幫助。 要想獲取此類信息,看 dump 肯 ...
  • 本文屬於OData系列文章 Intro 前面寫了很多有關OData使用的文章,很多讀者會有疑問,直接將實體對象暴露給最終用戶會不會有風險?$expand在預設配置的情況下,數據會不會有泄露風險? 答案是肯定的,由於OData的特性,提供給我們便捷同時也會帶來一些風險。很多地方推薦使用DTO模式來隔離 ...
  • 一、安裝 Mailx Ubuntu sudo apt-get install bsd-mailx CentOS7 yum -y install mailx 二、獲取郵箱授權碼 (解決報錯問題 535 Error: authentication failed, system busy) 以騰訊企業郵箱 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...