Linux ファイルシステムにおけるタイムスタンプ(mtime、atime、ctime)の違い、確認方法、変更方法
はじめに
Linux OS 上で行う操作はほぼ全て「ファイル」に対して行われます。
ファイルには「作成された時」や「更新された時」の「日時」の情報が付与されています。
タイトルにある mtime 、 atime 、 ctime というのはファイルに関する日時情報にあたりますが、 なぜ 3 つあるのか? 、 それぞれどういった情報なのか? は即答が難しいです。
これら 3 つの「日時」情報を紹介します。
検証環境
「タイムスタンプ」はファイル操作したときの日時情報
Linux ファイルシステムにおける日時情報のことを タイムスタンプ と呼びます。
タイムスタンプ はファイルに対して何らかの操作したときに記録されます。
ファイルが作られたタイミングでもタイムスタンプが記録されるので、「タイムスタンプが存在しない」ということはありえません。
「タイムスタンプ」はいくつかの種類がある
一口に「日時情報」といっても、Linux ファイルシステムには以下の 3 つの「タイムスタンプ」があり、 更新されるタイミングが異なります。
- mtime : 中身(コンテンツ)が変更された日時
- atime : アクセスされた日時
- ctime : 属性が変更された日時
mtime は比較的わかりやすいですが、他のものがわかりにくいです。
具体例をもとにそれぞれのタイムスタンプの変化を見ていきましょう。
タイムスタンプを確認するには?
タイムスタンプを確認する方法はいくつかあります。
ls -l
コマンド ( mtime を確認 )
ls -l
コマンドでファイルの一覧を表示できますが、この際に表示されるタイムスタンプは mtime となります。
ls -lu
コマンド ( atime を確認 )
ls -l
コマンドに更に u
オプションを付与すると、 atime タイムタンプが表示されます。
ls -l
の実行結果と全く一緒なので、違うタイムスタンプが表示されているかわかりませんね。
試しに atime を変更してみましょう。
先に説明した通り、 atime とは アクセスされた日時 のことでした。
そこで内容は変更せず、ファイルの内容の確認だけを行ってみましょう。
このように、atime はファイルの内容を読み込んだ場合に更新されます。
atime をもう少し詳しく解説
実は、 atime の挙動はもう少し複雑です。
/etc/fstab
にて「ファイルシステムがどのようなオプション付きでマウントされているか」によって挙動が変わります。
多くの場合、 relatime オプションが有効になっています。
relatime が設定されているファイルシステムでは、以下のいずれかの条件を満たした場合のみ atime が更新されます。
- mtime よりも古い
- ctime よりも古い
- 現在時刻-24 時間 よりも古い
ls
コマンドや du
コマンドでは更新されません。ファイルサイズもブロックサイズなどから算出しているためだと思います。
vi
や sed
で更新する場合は mtime だけでなく atime も更新されてしまいますが、これは内部的に更新する前に読み込みを行っているためでしょう。
このように atime は思わぬタイミングで更新される可能性があります。
ついでに mtime も変更してみましょう。
ファイルの末尾に文字列を「追記」してみます。
ファイルの末尾に文字列を追記しただけの場合は、mtime だけが更新され、atime は更新されません。
また、 ls
コマンドでファイルの属性情報(≠ 中身)を参照しただけでは、atime は更新されません。
ls -lc
コマンド ( ctime を確認 )
ls -l
コマンドに更に c
オプションを付与すると、 ctime タイムタンプが表示されます。
表示されたタイムスタンプは mtime と同じ値となっているので ctime が表示されたのかわかりません。
試しに ctime を変更してみましょう。
先に説明した通り、 ctime とは 属性が変更された日時 のことでした。
そこで、ファイルの「属性」情報を変更してみましょう。
「属性」といえば、パーミッション、パーミッション変更といえば chmod
ですね。
chmod
実行前の mtime、 atime、ctime と 実行後の mtime、atime、ctimme を表示してみます。
chmod
で変更されたのは、 ctime だけだったのがわかります。
ファイルの内容を変更する場合は、 mtime が変更されるため、「内容」とともに「属性」情報も変更されます。
そのため、 ctime も同時に変更されます。
stat
コマンド
ここまで ls
コマンドでそれぞれのタイムスタンプ情報を確認してきました。
- mtime :
ls -l
で確認 - atime :
ls -lu
で確認 - ctime :
ls -lc
で確認
3 つのタイムスタンプを確認するために 3 回もコマンド実行するのは面倒です。
ファイルのメタ情報 (タイムスタンプを含む) をまとめて確認する場合は、 stat
コマンドを利用します 。
Access が atime、 Modify が mtime、 Change が ctime に該当します。
3 つのタイムスタンプの他に、 Birth 、つまり作成日時も確認できます。
ただし、 Birth が表示されるかどうかは利用しているファイルシステムによって異なり、表示されない場合もあるためあまり期待はできない属性情報です。
まとめ
mtime、atime、ctime の更新タイミングと確認方法は以下の表に表現できます。
タイムスタンプ | 「内容」を変更 | 「属性」を変更 | 「内容」を参照 | タイムスタンプを確認 |
---|---|---|---|---|
mtime | 更新 | - | - | stat / ls -l |
atime | - | - | 更新(ファイルシステムの設定による) | stat / ls -lu |
ctime | 更新 | 更新 | - | stat / ls -lc |
おまけ : touch
コマンドで atime
、 mtime
を更新する
touch
コマンドを使って、 任意の時刻に atime
や mtime
を更新できます。
実際にファイルを用意して、 atime や mtime を更新してみます。
それでは atime を "2022-02-05 13:00" に更新してみます。
touch
コマンド実行時に、 -a
、 -t
オプションを指定します。
>
で始まる部分が変更後のタイムスタンプです。
atime だけを更新するつもりが、 ctime も同時に更新されました 。
今度は mtime を "2022-02-05 14:00" に更新してみます。
touch
コマンド実行時に、 -m
、 -t
オプションを指定します。
mtime だけを更新するつもりが、 ctime も同時に更新されました 。
mtime 、 atime ともに、 touch
コマンドで改ざんできます。
ただし、 touch
コマンドでは ctime を変更できません。
そこで、 なにか変更が行われたのでは?と思ったら、ctime を見ておくのが良さそうです 。
ひとこと
数年前からいつかブログネタに整理したいと思っていたことがようやく投稿できました。
ディスカッション
コメント一覧
まだ、コメントがありません