web-dev-qa-db-ja.com

tune2fs:日付はどのタイムゾーンで作成され、変更することはできますか?

私はtune2fsを使用してLinuxディストリビューションのインストールの経過時間を判断していますが、タイムゾーンがわからないと、その日付はあまり役に立ちません。私が使用している正確なコマンドは ここ からです。ここではわかりやすくするためです。

Sudo tune2fs -l /dev/sda3 | grep created | sed 's/.*created\:\s*//g'

ただし、出力は次の形式です。

Fri Jun 23 23:59:22 2017

記載されているタイムゾーンがないことに注意してください。ただし、dateは次の形式の出力を返します。

Sun Jul 23 17:58:18 AEST 2017

タイムゾーンAESTがどのように言及されているかに注目してください。 tune2fs のマニュアルページを読みました。 Webブラウザの検索ユーティリティを使用して「日付」、「作成済み」、「時刻」を検索しましたが、日付形式のタイムゾーンについての言及が1つも見つかりませんでした。または、手動で設定する方法があるかどうかそれ。 DuckDuckGoで「tune2fsdate」と「tune2fstimezone」を検索しましたが、上位5つの結果を確認しましたが、関連するものは見つかりませんでした。

3
BH2017

日付は、作成時のローカルシステムのタイムゾーンに表示されているようです。

例えば私の/ bootパーティションはraid-1(/ dev/md0)のext4で、昨年ブートドライブを4つのSSDに交換し、ZFSでrootに変換したときに作成されました。緊急時に備えて/ bootext4パーティションを保持しました。

# tune2fs -l /dev/md0 | sed -n -e 's/.*created\:\s*//gp'
Sat Oct  8 16:38:45 2016

# TZ=UTC tune2fs -l /dev/md0 | sed -n -e 's/.*created\:\s*//gp'
Sat Oct  8 05:38:45 2016

私もオーストラリアの東海岸(メルボルン)にいます。16:38と05:38の差は11時間です。これは、AEDTにとって正しいことです(夏時間調整は、それを監視している州では10月に始まります)。


ところで、grepの出力をsedまたはawkにパイプする必要はほとんどありません。どちらもすでに正規表現パターンの一致を実行できます。 awkの例は次のようになります。

# tune2fs -l /dev/md0 | awk -F': +' '/created/ {print $2}'
Sat Oct  8 16:38:45 2016
2
cas

時刻は、カレンダーの日付としてではなく、Unixエポック時刻( スーパーブロックs_mkfs_timeを参照)として保存されるため、タイムゾーンに依存しません。

表示するとき、tune2fsはそれをカレンダー/人間の日付に変換して、タイムゾーンで意味のある表現を提供します。

UTCで時刻を取得するには、次のコマンドで実行します。

TZ=UTC0 LC_ALL=C tune2fs -l /dev/sda3 |
  sed -n 's/^Filesystem created: *//p'

これは、タイムゾーンがUTC(UTCからのオフセットが0)であることをtune2fsに伝えています。

LC_ALL = Cを追加して、Filesystem createdが英語で返され、ユーザーのロケールに関係なく、日付が引き続き米国英語スタイルで表示されるようにしました(e2fsprogsが国際化されている場合)未来)。

S_mkfs_timeはスーパーブロック内のオフセット0x108にあり、スーパーブロックはブロックデバイス内のオフセット0x400から始まるため、そのエポック時間を手動で取得することもできます。

od -vAn -j 0x508 -N4 < /dev/sda3

そしてそれをあなたが好きなフォーマットに変換してください:

$ date --iso-8601=s -d "@$(od -An -j0x508 -N4 -tu4 < /some/device)"
2017-07-23T12:20:22+01:00
$ date -u --iso-8601=s -d "@$(od -An -j0x508 -N4 -tu4 < /some/device)"
2017-07-23T11:20:22+00:00
2