追加のテキストで満たされた端末ウィンドウが背景にある端末ウィンドウを表示するラップトップ。

「変更」が「変更」を意味しないのはいつですか? Linuxファイルのタイムスタンプについて話しているとき。 このガイドでは、システムがそれらを更新する方法、およびそれらを自分で変更する方法について説明します。

atime、mtime、ctimeの違い

すべてのLinuxファイルには、アクセスタイムスタンプ(atime)、変更されたタイムスタンプ(mtime)、および変更されたタイムスタンプ(ctime)の3つのタイムスタンプがあります。

アクセスタイムスタンプは、ファイルが最後に読み取られた時刻です。 これは、誰かがプログラムを使用してファイルの内容を表示したり、ファイルからいくつかの値を読み取ったりしたことを意味します。 ファイルに何も編集または追加されていません。 データは参照されましたが、変更されていません。

変更されたタイムスタンプは、ファイルの内容が最後に変更された時刻を示します。 ファイルを編集または操作したプログラムまたはプロセス。 「変更」とは、ファイル内の何かが修正または削除されたか、新しいデータが追加されたことを意味します。

変更されたタイムスタンプは、ファイルの内容に加えられた変更を参照していません。 むしろ、ファイルに関連するメタデータが変更された時刻です。 たとえば、ファイルのアクセス許可を変更すると、変更されたタイムスタンプが更新されます。

標準のext4 Linuxファイルシステムは、内部ファイルシステム構造でファイル作成タイムスタンプ用のスペースも割り当てますが、これはまだ実装されていません。 このタイムスタンプが入力されることもありますが、その値に依存することはできません。

タイムスタンプの構造

Linuxタイムスタンプは、日付と時刻ではなく数値を保持します。 この数値は、1970年1月1日の真夜中(00:00:00)であったUnixエポックからの秒数で、協定世界時(UTC)です。 Linuxのタイムスタンプではうるう秒は無視されるため、リアルタイムとは異なります。

Linuxがタイムスタンプを表示する必要がある場合、秒数を日付と時刻に変換します。 これにより、人間が理解しやすくなります。 コンピューターがファイルを表示している場所とタイムゾーンは、秒数から日付と時刻への変換をガイドします。 また、月が正しい言語であることが保証されます。

では、タイムスタンプには何秒保存できますか? 正確には、2,147,483,647です。 それは大きな数字ですが、それで十分ですか? これをUnixエポックに追加し、それを日付と時刻に変換すると、2038年1月19日火曜日の午前03:14:07に取得されます。ただし、それ以前にはタイムスタンプの別のスキームが必要になります。

タイムスタンプの表示

次に示すように、lsで-l(長いリスト)オプションを使用すると、変更されたタイムスタンプを確認できます。

ls -l dp.c

アクセスのタイムスタンプを表示するには、次のように-lu(アクセス時間)オプションを使用します。

ls -lu dp.c

最後に、変更のタイムスタンプを表示するには、-lc(変更時刻)オプションを使用できます。 次のように入力します。

ls -lc dp.c
端末ウィンドウの「ls -l dp.c」コマンド。

上記のタイムスタンプは、ファイルの内容が2019年4月21日に最後に変更されたことを示しています。2020年1月20日にファイルが別のコンピューターからこのコンピューターにコピーされ、両方のタイムスタンプがその時に更新されたため、アクセスと変更のタイムスタンプは同じです。

すべてのタイムスタンプを同時に表示するには、次のようにstatコマンドを使用します。

stat dp.c
端末ウィンドウの「stat dp.c」コマンド。

タイムゾーンは画面の下部に表示されます。 ご覧のとおり、非常に正確な秒の小数部があります。 各タイムスタンプの最後に、-0500または-0400も表示されます。

これらはタイムゾーンのオフセットです。 ファイルシステムは、タイムスタンプをUTCで記録し、statで表示されるときにローカルタイムゾーンに変換します。 この記事の調査に使用したコンピューターは、米国の東部標準時(EST)ゾーンにあるかのように構成されています。

そのタイムゾーンは、ESTが実施されているときのUTCから5時間遅れています。 ただし、東部夏時間(EDT)が実施されているときは、UTCより4時間遅れています。 2019年4月に変更されたタイムスタンプが変更されたとき、EDTが有効でした。 そのため、タイムスタンプのうち2つに5時間のオフセットがありますが、変更されたものには4時間のオフセットがあります。

オフセットとタイムゾーンはどこにも保存されません。 これらの値を保持するための専用のiノードもファイルシステムスペースもありません。 タイムスタンプ(常にUTC時間です)、ファイルを表示するコンピューターのローカルタイムゾーン、およびDSTが有効であったかどうかを使用して、これらを即座に計算する必要があります。

また、ファイルの作成日に予約されている「Birth」タイムスタンプも表示されます。 これは実装されておらず、タイムスタンプの代わりにハイフン「-」が表示されます。

関連:Linuxのiノードについて知りたいことすべて

タイムスタンプの変更

必要に応じて、ファイルのタイムスタンプを変更できます。 touchコマンドを使用して、アクセスまたは変更されたタイムスタンプ、あるいはその両方を変更できます。

touch -a dp.c

新しいアクセスタイムスタンプを設定するには、-a(アクセス時間)オプションを使用します。 次のコマンドは、アクセスタイムスタンプをコンピューターの現在の時刻に設定します。

stat dp.c
端末ウィンドウでの「touch -a dp.c」コマンド。

予想通り、アクセスタイムスタンプが変更されました。 ただし、変更されたタイムスタンプも更新されました。 これは正常です。

変更されたタイムスタンプを変更するには、-m(変更された時間)オプションを使用できます。

touch -m dp.c
stat dp.c
端末ウィンドウでの「touch -m dp.c」コマンド。

今回は、変更および変更されたタイムスタンプが更新されました。

アクセスタイムスタンプと変更されたタイムスタンプの両方を同時に変更する場合は、-d(日付)オプションを使用できます。 日時を指定することもできます。タイムスタンプを現在に変更することに限定されません。

次のコマンドを使用して、アクセスおよび変更されたタイムスタンプを2020年1月15日の10:30:45に設定します。

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
端末ウィンドウでの「touch -d '2020-01-15 10:30:45' dp.c」コマンド。

アクセスと変更されたタイムスタンプを過去の日付に設定しました。 変更されたタイムスタンプもコンピューターの現在の時刻に更新されました。

あるファイルのタイムスタンプを別のファイルのタイムスタンプ値に設定する場合は、以下に示すように-r(参照)オプションを使用することもできます。

touch dp.c -r dice_words.sl3
stat dp.c
端末ウィンドウでの「touch dp.c -r dice_words.sl3」コマンド。

その後、タイムスタンプが-​​0400と-0500が混在するようになりました。

変更されたタイムスタンプにのみ影響するようなことをしましょう。 chmodコマンドを使用して、すべてのユーザーに実行可能ファイルの実行権限を与えます。

chmod + x dp
stat dp
端末ウィンドウの「chmod + x dp」および「stat dp」コマンド。

変更されたタイムスタンプは、更新された唯一のものです。 これは、ファイル自体は変更されなかったため、アクセスも変更もされなかったためです。 ただし、ファイルに関するメタデータは変更されました。

関連:Linuxでchmodコマンドを使用する方法

ファイルシステムによるタイムスタンプの更新方法

ファイルシステムがマウントされている場合、そのファイルシステムの動作または処理方法を指定するために使用できるオプションがあります。 これらは/ etc / fstabファイルに保存され、ブート時に読み取られて処理されます。 オプションを設定して、アクセスタイムスタンプの更新に使用するスキームを指示することもできます。

以下は、最も一般的なオプションの一部です。

  • strictatime(strict atime):このオプションは、アクセスされるたびにファイルのアクセスタイムスタンプを更新します。 このアプローチにはオーバーヘッドが伴いますが、一部のサーバーはこのスキームの恩恵を受けることができます。 デスクトップまたはラップトップコンピュータではほとんどメリットがありません。 noatime(no atime):このオプションは、ファイルとディレクトリのアクセスタイムスタンプの更新を完全に無効にします。 ただし、変更されたタイムスタンプは更新されます。 nodiratime(no dir atime):このオプションは、ファイルの更新のアクセスタイムスタンプを有効にしますが、ディレクトリのアクセスタイムスタンプは無効にします。 relatime(相対atime):このオプションは、24時間以上前のアクセスタイムスタンプ、または以前のタイムスタンプが現在の変更または変更されたタイムスタンプよりも古い場合にのみ、アクセスタイムスタンプを更新します。 これにより、アクセスタイムスタンプが頻繁に更新されるか、まったく更新されないかのバランスが取れます。

このコンピューターの/ etc / fstabファイルを見て、設定されているオプションを確認してみましょう。

より少ない/ etc / fstab
端末ウィンドウの「less / etc / fstab」。

以下に示すように、/ etc / fstabファイルが表示されます。

ターミナルウィンドウのlessにある「/ etc / fstab」ファイル。

ラップアラウンドなしのファイルの内容は次のとおりです。

#/ etc / fstab:静的ファイルシステム情報。 ## 'blkid'を使用して、デバイスの#一意の識別子を出力します。 これは、デバイスに名前を付けるためのより堅牢な方法としてUUID =とともに使用できます。これは、ディスクが追加および削除されても機能します。 fstab(5)を参照してください。 ## #/はインストール中に/ dev / sda1にありましたUUID = 4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors = remount-ro 0 1 / swapfile none swap sw 0 0

エントリは2つしかなく、そのうちの1つはスワップファイルですが、無視してかまいません。 もう1つはファイルシステムのルート(/)にマウントされており、インストール時にデバイス/ dev / sda1にありました。 これが最初のハードドライブの最初のパーティションであり、ext4ファイルシステムが含まれています。

渡される唯一のオプションは、errors = remount-roです。これは、読み取りおよび書き込みファイルシステムとしてマウントしようとしたときにエラーが発生した場合、このファイルシステムを読み取り専用として再マウントするようにオペレーティングシステムに指示します。

したがって、アクセスタイムスタンプの処理方法については触れられていません。 より深く掘り下げて、/ proc / mountsが教えてくれるものをチェックしてみましょう。 / proc / mountsからの出力をgrepにパイプします。 検索文字列は「sda」(ハードドライブ識別子)になります。

次のように入力します。

cat / proc / mounts | grep "sda"
端末ウィンドウでの「cat / proc / mounts | grep 'sda'」コマンド。

次のオプションが表示されます。

  • rw:ファイルシステムは、読み取りおよび書き込みファイルシステムとしてマウントされます。 relatime:ファイルシステムは「相対atime」スキームを使用してアクセスタイムスタンプを更新します。

それはどこから来ましたか? さて、relatimeスキームは次の状況で使用されます。

  • デフォルトの/ etc / fstabオプションが使用されている場合。 relatime / etc / fstabオプションが使用されている場合。 / etc / fstabでアクセスタイムスタンプオプションが使用されておらず、Linuxカーネル2.6.30以降を使用している場合。

ext4ファイルシステムの/ etc / fstabエントリにはアクセスタイムスタンプ更新オプションが指定されていないため、Linuxは賢明な選択を行い、relatimeを使用しました。

関連:Linuxでfstabファイルを書き込む方法

タイムスタンプは重要です

タイムスタンプを使用すると、ファイルがアクセス、変更、または変更された時期を簡単に確認できます。 しかし、さらに重要なことに、これらのツールは、ソフトウェアをバックアップおよび同期して、バックアップする必要があるファイルを決定する方法を提供します。

タイムスタンプを操作する機能は、ファイルまたはファイルのセットをプログラムに含めるか無視するかをプログラムに強制的に説得する必要がある場合に役立ちます。