理解ext4,第二部分時間戳記(Timestamps)

來源:互聯網
上載者:User

準備環境

首先,在EXT4檔案系統下,建立另一個測試檔案

# echo Time for knowledge >testfile# touch -a -t 211101231917.42 testfile# touch -m -t 204005160308.19 testfile

使用touch命令可以直接修改檔案的atime(最後訪問時間)、mtime(最後修改時間),這樣可以把這些時間戳記設定為我們想要的時間,否則這個新建立檔案的atime、mtime時間戳記將會是建立檔案的時間。有一點需要指出,我剛才設定的atime、mtime都是遙遠的未來的一個時間點,而在舊的Unix的檔案系統中,由於時間資訊是32位的,所以會引起一些麻煩(比如“2038年問題”,或稱unix千年蟲)。

現在,讓我們比較一下標準的linux下的stat命令、Sleuthkit工具包裡的istat、debugfs版本的stat的輸出結果:

# stat testfile File: `testfile' Size: 19  Blocks: 8 IO Block: 4096 regular fileDevice: fc03h/64515d Inode: 6554914 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2111-01-23 19:17:42.000000000 -0800Modify: 2040-05-16 03:08:19.000000000 -0700Change: 2011-03-12 07:36:13.872411014 -0800# istat /dev/mapper/RD-home 6554914inode: 6554914AllocatedGroup: 800[...]Inode Times:Accessed:       Tue Dec 17 12:49:26 1974File Modified:  Wed May 16 03:08:19 2040Inode Modified: Sat Mar 12 07:36:13 2011[...]# debugfs -R 'stat ' /dev/mapper/RD-home[...] ctime: 0x4d7b92ed:cfffbe18 -- Sat Mar 12 07:36:13 2011 atime: 0x0954b156:00000001 -- Tue Dec 17 12:49:26 1974 mtime: 0x845e5913:00000000 -- Wed May 16 03:08:19 2040crtime: 0x4d7b92e4:148af06c -- Sat Mar 12 07:36:04 2011[...]

我已經對輸出進行了編輯,使時間戳記比較明顯。正如你所看到的,這三個命令輸出了相同的mtime和ctime,但是istat和debugfs在解析2111年的atime的時候出現了問題,只有stat命令獲得了正確值。

你可能已經也注意到了EXT4的一些新功能:

  • stat命令、debugfs命令輸出的時間戳記帶有小數部分,現在EXT4時間戳記支援精確到毫微秒(nanosecond)。
  • 在debugfs的stat中可以看到"crtime"(create time)這一項,在EXT4中終於支援檔案“誕生”的時間戳記,就像NTFS一樣,用來標記檔案被建立的時間點。
  • 至少在stat、touch命令已經可以完美的支援未來的時間戳記。EXT4的實現方式已經解決了(事實上是延遲了)2038年問題。

EXT4通過64位的時間戳記來提供這些功能,這給你足夠的空間來支援毫微秒級的時間戳記,並且還有空餘的兩位可以滿足未來對時間戳記的擴充要求。

顯示細節

但是,就像我提到的,EXT4的開發人員盡了最大的努力,使EXT4能夠向下相容EXT2、EXT3的inode結構。64位的時間戳記、全新的檔案建立時間項,明顯與這個目標相矛盾。EXT4開發人員解決這個問題的方法是通過在EXT4的256位inode中的高128位中,設定一個擴充部分。

這是一個16位編輯器顯示的結果(請參照第一部分):

將一個檔案inode的開始作為0,則各個高亮的時間戳記的地區如下所示:

Bytes   8 -  11: Access time seconds       12 -  15: Change time seconds       16 -  19: Modification time seconds

132 - 135: Change time "extra" 136 - 139: Modification time "extra" 140 - 143: Access time "extra" 144 - 147: Create time seconds 148 - 151: Create time "extra"

在inode起始位置的標準MACtime值本質上沒有改變。它們以自1970年1月1日(unix元年)以來的秒數,然後,EXT4將這些值以無符號數而不是有符號數的形式儲存。使用擴充位的方式使“2038年問題”變為“2106年問題”。

你可以實際看到上面例子中的2040年的mtime。通過小端位元組序傳換而來,16進位的mtime值是0x845E5913, 或者十進位的2220775699,這個數將會引起32位有符號數產生溢出。可以通過以下命令將這個十進位數轉換為可讀的日期:

# date -d @2220775699
Wed May 16 03:08:19 PDT 2040

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.