cat
コマンドを使用してファイルを読み取った後、stat
コマンドを使用して、変更されたアクセス時間を表示しましたが、更新されていません。
私がチェックしました /etc/fstab
ファイルがあり、どのドライブにもnoatime
がないのに、アクセス時間が更新されないのはなぜですか?
Ubuntu 12.04 PrecisePangolinを使用しています。
cat
の代わりに、touch
(または書き込みを強制するもの)を使用するか、マウントオプションでatime
を明示的に宣言する必要があります。
Ubuntuはデフォルトとしてrelatime
を使用します。実際、Linuxカーネルはデフォルトとしてrelatime
を使用します バージョン2.6.30以降 。これにより、すべてではなく、ファイルにアクセスしたときに特定の値のみが更新されます。これにより、cat
の動作が変更され、アクセス時間が更新されなくなります。これはUbuntuマウントオプションのデフォルトです。アクセス時間を変更する唯一の方法は、単純な読み取りではなく、ファイルに触れること(別名、書き込みを強制すること)です。
この背後にある理由は、パフォーマンスです。 POSIXが要求するように、各読み取りが書き込みを必要とする場合、ディスクおよびフラッシュベースのデバイスの効率は悪化します。これは、読み取り専用ファイルシステムでも逆効果のようです。
このトピックについては、AskUbuntuとスーパーユーザーにたくさんの議論があります。
atime
を扱うときに一般的に知っておく必要のある3つのマウントオプションがあります。マウントのマニュアルページから、最初の2つに精通しています。
抜粋
atime Do not use noatime feature, then the inode access time is controlled
by kernel defaults. See also the description for strictatime and
relatime mount options.
noatime
Do not update inode access times on this filesystem (e.g., for
faster access on the news spool to speed up news servers).
あなたがなじみのない他のオプション、そしてあなたの悲しみを引き起こしているのはこれです、これはデフォルトでした カーネル2.6.30以来 :
relatime
Update inode access times relative to modify or change time.
Access time is only updated if the previous access time was
earlier than the current modify or change time. (Similar to
noatime, but doesn't break mutt or other applications that need to
know if a file has been read since the last time it was
modified.)
Since Linux 2.6.30, the kernel defaults to the behavior provided
by this option (unless noatime was specified), and the
strictatime option is required to obtain traditional semantics. In
addition, since Linux 2.6.30, the file's last access time is
always updated if it is more than 1 day old.
/proc/mounts
の下を見ると、これらのオプションがファイルシステムに設定されているかどうかを確認できます。
$ head -5 /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=3976812k,nr_inodes=994203,mode=755 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
relatime
とnoatime
の違いは、現在のアクセス時間が前のアクセス時間より後の場合にのみ変更が加えられることです。
アクセス時間は、前のアクセス時間が現在の変更または変更時間よりも前であった場合にのみ更新されます。 (noatimeに似ていますが、ファイルが最後に変更されてから読み取られたかどうかを知る必要があるmuttやその他のアプリケーションを壊すことはありません。)