web-dev-qa-db-ja.com

USBドライブにコピーされたファイルのタイムスタンプ

PCまたはラップトップからUSBドライブにコピーされたファイルのタイムスタンプに問題があります。元のファイルとコピーされたファイルの最終変更時刻が異なります。したがって、PCとUSBドライブ間でファイルを同期するのはかなり面倒です。

ステップごとの説明

  1. GUIまたはコマンドを使用して、PC /ラップトップからUSBドライブに任意のファイルをコピーします

    cp -a file.txt /media/gabor/CORSAIR/
    
  2. 元のファイルの最終変更時刻を確認します。

    $ ls -l --time-style=full-iso file.txt
    -rw-rw-r-- 1 gabor gabor 0 2018-09-22 15:09:23.317098281 +0200 file.txt
    
  3. コピーしたファイルの最終更新時刻を確認します。

    $ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt
    -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:23.000000000 +0200 /media/gabor/CORSAIR/file.txt
    
  4. ご覧のとおり、コピーされたファイルの最終変更時刻の秒は、10進数のゼロに切り捨てられます。ただし、コマンドを入力すると

    if ! [ file.txt -nt /media/gabor/CORSAIR/file.txt ] && ! [ file.txt -ot /media/gabor/CORSAIR/file.txt ]; then echo "The last modification times are equal."; fi
    

出力を取得しますThe last modification times are equal.

  1. USBドライブをアンマウントして再マウントし、最後の2つのコマンドを再度実行すると、状況が変わります。

    $ ls -l --time-style=full-iso /media/gabor/CORSAIR/file.txt
    -rw-r--r-- 1 gabor gabor 0 2018-09-22 15:09:22.000000000 +0200 /media/gabor/CORSAIR/file.txt
    $ if [ file.txt -nt /media/gabor/CORSAIR/file.txt ]; then echo "The file is newer on the PC."; fi
    The file is newer on the PC.
    
  2. したがって、再マウント後、コピーされたファイルの最終変更時間はさらに1秒短縮されます。ただし、アンマウントと再マウントをさらに行っても、最終変更時刻には影響しません。さらに、ファイルのテストでは、PC上のファイルの方が新しいことが示されています(そうではありません)。

ファイルの最終変更時刻が表示されるという事実により、状況はさらに複雑になります私のPCと私のラップトップでは異なります、日付と時刻の設定は同じですが、正確に2時間です。私のPCと私のラップトップ!

詳細情報

私のPCとラップトップの両方が、上記の動作を示しています。私のPCにはUbuntu 14.04.5(信頼できる)があり、私のラップトップにはUbuntu 16.04.2(xenial)があります。

USBドライブにvfatファイルシステムがあります。 mount | grep CORSAIRon my PCの出力は

/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)

mount | grep CORSAIR私のラップトップ上の出力は

/dev/sdb1 on /media/gabor/CORSAIR type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

私の他のUSBドライブは同じ動作を示します。

質問

最終変更時刻の違いをどうにかして解消できますか?たとえば、マウント/アンマウントで他のパラメーターを使用していますか?それともUbuntuのバグですか?

元のファイルとコピーしたファイルのタイムスタンプが完全に同じになるようにして、同期をより効率的に実行できるようにしたいと考えています。また、vfatファイルシステムをUSBドライブに保持して、Windowsでも使用できるようにしたいと考えています。

13
K. Gabor

タイムスタンプの秒の変更に関する問題は、VFAT(はい、FAT32でも可)ファイルシステムが変更時間を2秒の精度で保存するという事実に起因します。

どうやら、ファイルシステムがマウントされている限り、ファイルシステムドライバーはタイムスタンプを1秒の精度で(おそらくPOSIX要件を満たすために)キャッシュしますが、ファイルシステムがマウント解除されると、キャッシュはクリアされ、実際に何が記録されているかがわかりますファイルシステムディレクトリ。

PCとラップトップの2時間の違いは、おそらくVFATファイルシステムの異なるタイムゾーン設定やデフォルトのマウントオプションによって引き起こされます。 (現在、UTCオフセットが正または負の2時間であるタイムゾーンにいると思います。)

内部的には、LinuxはUnixスタイルのファイルシステムでUTCタイムスタンプを使用します。しかし、VFATファイルシステムでは、(現在の)デフォルトは、VFATファイルシステムのタイムスタンプに現地時間を使用することです。これは、MS-DOSとWindowsが同じことを行うためです。ただし、これに影響を与える可能性のあるマウントオプションは2つあります。マウントオプションtz=UTCを指定してVFATファイルシステムでUTCベースのタイムスタンプを使用するか、time_offset=<minutes>を使用して使用するタイムゾーンオフセットを明示的に指定できます。この特定のファイルシステムで。

VFATのデフォルトのマウントオプションがUbuntu 14.04と16.04の間でカーネル内またはudisksリムーバブルメディアヘルパーサービス内で変更されたため、2時間の差異が生じた可能性があります。

17
telcoM

「USBドライブにvfatファイルシステムを保持したい」という質問を書きましたが、最後にntfsファイルシステムに再フォーマットしました。 LinuxとWindowsはどちらもntfsを処理でき、上に示したタイムスタンプの奇妙な現象を示していないようです。

0
K. Gabor