web-dev-qa-db-ja.com

ubuntu12.04でファイルアクセス時間が更新されない

catコマンドを使用してファイルを読み取った後、statコマンドを使用して、変更されたアクセス時間を表示しましたが、更新されていません。

私がチェックしました /etc/fstabファイルがあり、どのドライブにもnoatimeがないのに、アクセス時間が更新されないのはなぜですか?

Ubuntu 12.04 PrecisePangolinを使用しています。

4
Cody

catの代わりに、touch(または書き込みを強制するもの)を使用するか、マウントオプションでatimeを明示的に宣言する必要があります。


Ubuntuはデフォルトとしてrelatimeを使用します。実際、Linuxカーネルはデフォルトとしてrelatimeを使用します バージョン2.6.30以降 。これにより、すべてではなく、ファイルにアクセスしたときに特定の値のみが更新されます。これにより、catの動作が変更され、アクセス時間が更新されなくなります。これはUbuntuマウントオプションのデフォルトです。アクセス時間を変更する唯一の方法は、単純な読み取りではなく、ファイルに触れること(別名、書き込みを強制すること)です。

この背後にある理由は、パフォーマンスです。 POSIXが要求するように、各読み取りが書き込みを必要とする場合、ディスクおよびフラッシュベースのデバイスの効率は悪化します。これは、読み取り専用ファイルシステムでも逆効果のようです。

このトピックについては、AskUbuntuとスーパーユーザーにたくさんの議論があります。

5
Braiam

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

relatimenoatimeの違いは、現在のアクセス時間が前のアクセス時間より後の場合にのみ変更が加えられることです。

アクセス時間は、前のアクセス時間が現在の変更または変更時間よりも前であった場合にのみ更新されます。 (noatimeに似ていますが、ファイルが最後に変更されてから読み取られたかどうかを知る必要があるmuttやその他のアプリケーションを壊すことはありません。)

4
slm