\r\n\r\n
変える」=「修正する」ではないのはどんなとき?Linuxのファイルのタイムスタンプの話をするとき。このガイドでは、システムがそれらを更新する方法と、自分でそれらを変更する方法について説明します。
Linuxのファイルには、アクセス・タイムスタンプ(atime)、修正タイムスタンプ(mtime)、変更タイムスタンプ(ctime)の3つのタイムスタンプがあります。
アクセスタイムスタンプは、ファイルが最後に読み込まれた時刻である。これは、誰かがそのプログラムを使って、ファイルの内容を表示したり、ファイルから何らかの値を読み取ったりしたことを意味します。編集や追加はされていません。データは参照されていますが、変更されていません。
変更のタイムスタンプは、ファイルのコンテンツが最後に変更された時刻を示す。ファイルを編集または操作するための手順またはプロセス。"Modified "は、ファイル内の何かが変更または削除されたこと、または新しいデータが追加されたことを意味します。
変更のタイムスタンプは、ファイルのコンテンツに加えられた変更ではありません。その代わり、ファイルに関連するメタデータが変更された時刻を示す。例えば、ファイルのパーミッションが変更された場合、そのタイムスタンプが更新されます。
標準のext4linuxファイルシステムは、その内部ファイルシステム構造でファイル作成タイムスタンプのためのスペースを確保することもできますが、これはまだ実装されていません。このタイムスタンプが埋まっていることもあるが、その中の値には依存できない。
Linuxのタイムスタンプは、日時ではなく数字を保持しています。この数値は、Unixエポック(協定世界時、1970年1月1日の午前0時00分00秒)からの秒数です。Linuxのタイムスタンプでは、うるう秒は無視されるので、実時間と似て非なるものです。
Linuxはタイムスタンプを表示する必要があるとき、秒を日付と時刻に変換する。そのため、人間にとって理解しやすいものになっています。ファイルを閲覧しているコンピュータの場所とタイムゾーンは、秒から日付と時刻への変換をガイドします。また、その月が正しい言語であることを保証します。
では、タイムスタンプは何秒まで保存できるのでしょうか?正確には2147483647。これは大きな数字ですが、これでいいのでしょうか?これをUnixのエポックに加え、日付と時刻に変換すると、2038年1月19日(火)午前03時14分7秒というタイムスタンプが得られます。しかし、その前に、別のタイムスタンプ方式が必要です。
lsと一緒に-l(long listing)オプションを使用すると、変更されたタイムスタンプを次のように見ることができます。
ls -l dp.cアクセスタイムスタンプを表示するには、次のように -lu (アクセスタイム) オプションを使用します。
ls -lu dp.c最後に、変更のタイムスタンプを表示するには、-lc(変更時間)オプションを使用し、次のように入力します。
ls -lc dp.c上記のタイムスタンプは、ファイルの内容が2019年4月21日に最終更新されたことを示しています。アクセスタイムと変更タイムスタンプが同じなのは、このファイルが2020年1月20日に別のコンピューターからこのコンピューターにコピーされ、その時に両方のタイムスタンプが更新されたからです。
すべてのタイムスタンプを同時に表示するには、次のようにstatコマンドを使用します。
stat dp.cタイムゾーンはディスプレイの下部に表示されます。ご覧のように、非常に精密な分数秒の成分を持っています。各タイムスタンプの最後には、-0500または-0400も表示されます。
これらはタイムゾーンのオフセットです。ファイルシステムはタイムスタンプをUTCフォーマットで記録し、stat表示時にローカルタイムゾーンに変換します。この論文の調査に使用したコンピューターは、米国東部標準時間帯(EST)に設定されています。
東部標準時が施行された当時、この時間帯はUTCから5時間遅れていた。ただし、東部夏時間(EDT)が適用されると、UTCから4時間遅れとなります。2019年4月、修正されたタイムスタンプが変更され、EDTが適用されます。このため、2つのタイムスタンプのオフセットは5時間で、変更後のタイムスタンプのオフセットは4時間となっています。
オフセットとタイムゾーンはどこにも保存されません。これらの値を保持するための専用のinodeやファイルシステム領域は存在しない。これらの時間は、タイムスタンプ(常にUTC時間)、ファイルを表示しているコンピュータのローカルタイムゾーン、および夏時間が有効であるかどうかを使用して動的に計算する必要があります。
また、ファイルの作成日として予約されている「誕生」タイムスタンプが表示されます。これは実装されていないため、タイムスタンプの代わりにハイフン"-"が表示されます。
関連:Linuxのinodeについて知っておきたいことすべて
必要であれば、ファイルのタイムスタンプを変更することができます。touchコマンドを使用して、アクセスまたは変更、あるいはその両方のタイムスタンプを変更することができます。
touch -a dp.c新しいアクセスタイムスタンプを設定するには、-a(アクセスタイム)オプションを使用します。このコマンドは、アクセスタイムスタンプをコンピュータの現在時刻に設定します。
stat dp.cアクセスタイムスタンプは予想通り変更されましたが、変更されたタイムスタンプも更新されており、これは正常な状態です。
修正時刻を変更する場合は、-m(修正時刻)オプションを使用することができます。
touch -m dp.c stat dp.cこのとき、修正・変更のタイムスタンプが更新される。
アクセスタイムと修正タイムスタンプの両方を変更するには、-d (date)オプションを使用することができます。また、日時を指定することも可能で、タイムスタンプを現在に変更することに限定されるものではありません。
以下のコマンドで、アクセスおよび修正のタイムスタンプを2020年1月15日10:30:45に設定することにします。
touch -d "2020-01-15 10:30:45" dp.c stat dp.c現在、アクセスおよび変更のタイムスタンプを過去の日付に設定し、変更のタイムスタンプはコンピュータの現在時刻に更新しています。
あるファイルのタイムスタンプを他のファイルのタイムスタンプ値に設定するには、次のように -r (reference) オプションを使用することもできます。
touch dp.c -r dice_words.sl3 stat dp.cそして、-0400と-0500のタイムスタンプが混在する、ほぼ最初の状態に戻る。
変更のタイムスタンプにのみ影響を与えるようなことをしてみましょう。ここでは、chmodコマンドを使って、すべてのユーザーに実行可能なファイルのパーミッションを付与します。
chmod +x dp stat dp変更時のタイムスタンプのみが更新されます。これは、ファイルそのものが変更されていないためで、アクセスも修正もされていない。ただし、ファイルに関するメタデータは変更されています。
関連:Linuxでのchmodコマンドの使い方
ファイルシステムをインストールする際、そのファイルシステムをどのように操作・処理するかを指定するためのオプションがいくつか用意されています。これらは、/etc/fstab ファイルに保存され、起動時に読み込まれ処理されます。また、アクセスタイムスタンプの更新に使用するスキームを指定するオプションを設定することができます。
を選択することができます。
このコンピュータの /etc/fstab ファイルを見て、どのようなオプションが設定されているかを見てみましょう。
less /etc/fstab以下のように、/etc/fstab ファイルが表示されます。
以下は、回り込みをしない場合の文書内容です。
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <opti***> <dump> <pass> # / was on /dev/sda1 during installation UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0エントリーは2つだけで、そのうちの1つはスワップファイルなので無視できます。もう一つは、ファイルシステムのルートディレクトリ(/)にインストールされ、インストール時のデバイスは/dev/sda1である。これは最初のハードディスクの最初のパーティションで、たまたまext4ファイルシステムが入っています。
これに渡される唯一のオプションは errors=remount ro で、これは、このファイルシステムを読み書き可能なファイルシステムとしてマウントしようとしたときにエラーが発生した場合、オペレーティングシステムに読み取り専用ファイルシステムとして再マウントするように指示します。
そのため、アクセスタイムスタンプがどのように扱われるかについては言及されていません。それでは、/proc/mountsから何がわかるのか、掘り下げてみましょう。ここでは、/proc/mountsの出力をgrepでパイプすることにします。検索文字列は、ハードディスクの識別子である「sda」とします。
以下のように入力します。
cat /proc/mounts | grep "sda"次のようなオプションが表示されました。
それはどこから来るのか? さて、リラスタイムのプログラムは、次のようなケースで使われています。
ext4ファイルシステムの/etc/fstabエントリには、アクセスタイムスタンプの更新オプションが指定されていないため、Linuxは賢明な選択をしてrelatimeを使用します。
関連:Linuxでのfstabファイルの書き方
タイムスタンプは、ファイルへのアクセス、修正、変更のタイミングを簡単に確認するためのものです。しかし、より重要なのは、どのファイルをバックアップする必要があるのかを判断するためのバックアップと同期のためのソフトウェアを提供することです。
タイムスタンプを操作する機能は、あるファイルやファイル群を強制的に取り込んだり無視したりする必要がある場合に有効です。