Mam problem ze znacznikami czasowymi plików skopiowanych z komputera lub laptopa na dyski USB: czas ostatniej modyfikacji oryginalnego pliku i skopiowanego pliku jest inny. Dlatego synchronizacja plików między komputerem a napędem USB jest dość kłopotliwa.
Opis krok po kroku
Kopiuję dowolny plik z komputera / laptopa na dysk USB za pomocą GUI lub za pomocą polecenia
cp -a file.txt /media/gabor/CORSAIR/
Sprawdzam czas ostatniej modyfikacji oryginalnego pliku:
$ 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
Sprawdzam czas ostatniej modyfikacji skopiowanego pliku:
$ 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
Jak widać, sekundy ostatniej modyfikacji zmodyfikowanego pliku są skracane do zerowych cyfr dziesiętnych. Jeśli jednak wprowadzę polecenie
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
Dostaję wynik The last modification times are equal.
Sytuacja zmienia się, jeśli odłączę i ponownie podłączę dysk USB i ponownie wykonam dwa ostatnie polecenia:
$ 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.
Dlatego po ponownym zamontowaniu czas ostatniej modyfikacji skopiowanego pliku jest dodatkowo skrócony o jedną sekundę. Dalsze odmontowywanie i ponowne podłączanie nie ma jednak wpływu na czas ostatniej modyfikacji. Poza tym test na plikach pokazuje teraz, że plik na komputerze jest nowszy (chociaż tak nie jest).
Sytuację dodatkowo komplikuje fakt, że czas ostatniej modyfikacji plików jest wyświetlany inaczej na moim komputerze i laptopie , różnica wynosi dokładnie 2 godziny, chociaż data i godzina są takie same na moim komputerze i laptopie!
Dalsza informacja
Zarówno mój komputer, jak i laptop pokazują zachowanie opisane powyżej. Mam Ubuntu 14.04.5 (zaufany) na komputerze i Ubuntu 16.04.2 (xenial) na laptopie.
Moje dyski USB mają system plików VFAT. Dane wyjściowe mount | grep CORSAIR
na moim komputerze to
/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)
Wydajność mount | grep CORSAIR
na moim laptopie to
/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)
Moje inne napędy USB wykazują to samo zachowanie.
Pytanie
Czy można w jakiś sposób wyeliminować różnicę w czasach ostatniej modyfikacji? Na przykład, używając innych parametrów podczas montowania / odmontowywania? Czy jest to błąd w Ubuntu?
Chciałbym osiągnąć, że znaczniki czasu oryginalnych i skopiowanych plików są dokładnie takie same, aby synchronizacja mogła być wykonywana bardziej wydajnie. Chciałbym również zachować system plików vfat na moich dyskach USB, aby móc ich używać również w systemie Windows.
źródło
ext4
system plików Linux ? (Wsparcie w systemie Linux dla zastrzeżonych systemów plików Microsoft, FAT32, exFAT, NTFS, ma pewne ograniczenia.) Zobacz ten link, który sugeruje nie tylko,ext4
ale takżeudf
jako alternatywę dla zastrzeżonych systemów plików Microsoft.Odpowiedzi:
Problem ze zmianą sekund znacznika czasu wynika z faktu, że system plików VFAT (tak, nawet FAT32) przechowuje czas modyfikacji z rozdzielczością zaledwie 2 sekund.
Najwyraźniej, dopóki system plików jest zamontowany, sterownik systemu plików buforuje znaczniki czasu z dokładnością do 1 sekundy (prawdopodobnie w celu spełnienia wymagań POSIX), ale gdy system plików zostanie odmontowany, pamięci podręczne zostaną wyczyszczone i zobaczysz, co jest faktycznie zapisane katalog systemu plików.
Dwugodzinna różnica między komputerem a laptopem jest prawdopodobnie spowodowana różnymi ustawieniami strefy czasowej i / lub różnymi domyślnymi opcjami montażu systemu plików VFAT. (Zgaduję, że znajdujesz się w strefie czasowej, której przesunięcie UTC wynosi obecnie 2 godziny (dodatnie lub ujemne).
Wewnętrznie Linux używa znaczników czasu UTC w systemach plików w stylu Uniksa; ale w systemach plików VFAT (bieżącym) domyślnym ustawieniem jest używanie czasu lokalnego na znacznikach czasu systemu plików VFAT, ponieważ to właśnie zrobił MS-DOS i Windows nadal. Istnieją jednak dwie opcje montowania, które mogą na to wpłynąć: możesz określić opcję montowania,
tz=UTC
aby używać znaczników czasu opartych na UTC w systemach plików VFAT, lub możesztime_offset=<minutes>
jawnie określić przesunięcie strefy czasowej, które ma być używane z tym konkretnym systemem plików.Może się zdarzyć, że domyślne opcje montowania VFAT zmieniły się między Ubuntu 14.04 i 16.04, albo w jądrze, albo w
udisks
usłudze pomocniczej nośników wymiennych, co powoduje dwugodzinną różnicę, którą widzisz.źródło
mount | grep CORSAIR
na moim laptopie, który rzeczywiście różni się od wyjścia na moim komputerze. Poza tym masz rację, jestem w środkowej Europie w strefie czasowej CEST (= UTC + 2).udisks
powinny szanować opcje montowania określone w/etc/fstab
, jeśli napiszesz na nim wpis dotyczący napędu USB.Chociaż w swoim pytaniu napisałem, że „chciałbym zachować
vfat
system plików na dyskach USB”, w końcu ponownie sformatowałem je dontfs
systemu plików. Zarówno Linux, jak i Windows potrafią sobie zntfs
tym poradzić i wydaje się, że nie pokazuje to dziwnego zjawiska z przedstawionymi powyżej znacznikami czasu.źródło