LINUX.ORG.RU

Команда CP бьет файлы

 ,


0

1

Всем доброго времени суток. Такая вот напасть преследует меня уже целый год и порядком надоела, решить ее так и не могу потому и обратился на форум.

Перекидываю посредством USB с компьютера под управлением arch linux на плеер с microSD музыку. Неважно, хоть командой CP, хоть внутри файлового менеджера из контекстного меню я нажму кнопку copy - зачастую песня перекидывается не полностью, а обрывается где-то на середине. Будь то жесткий диск, будь то SSD, неважно. Разные порты, разные шнуры уже перепробовал. Разные карточки и разные плееры.

Как это лечить? Можно ли как-то валидировать передачу? Всем спасибо!



Последнее исправление: NorthernBlow (всего исправлений: 1)

По-моему, если целостность исходных файлов сомнений не вызывает, есть только два варианта: либо usb-носитель извлекается без umount, либо ФС на usb-носителе повреждена. Скорее первое.

UPD: вспомнил третий вариант - сбоит оперативная память компьютера, но это должно проявляться и в других случаях (вылеты программ, кернел паники без причины и т.п.)

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 2)

как сказал annulen небось флешку выдергиваешь раньше чем надо. Если не уверен надо хотя бы открыть терминал и сделать sync. Тогда наверняка.

зы небось флешка еще не особо дорогая и поэтому тормозная.

monkdt
()

В Linux, как и в Windows, файлы никогда не копируются с диска на диск напрямую. Данные сперва считываются с диска A и помещаются в оперативную память так быстро, как это возможно, а уже потом записываются на диск B так быстро, как можно.

Это быстрее, чем прямое копирование, так как не нужно ждать конца записи перед считыванием новой порции данных (данные обычно считываются быстрее, чем записываются).

Однако, есть нюанс чисто в отображении процесса. На Linux для команд в терминале cp и для GUI файлового менеджера процесс копирования завершен в тот момент, когда все данные были считаны. Запись он не проверяет, в отличии от GUI в Windows.

Чтобы гарантировать запись, нужно или выполнить в терминале серию команд: sync для синхронизации дискового кеша с реальными данными на дисках, umount /dev/sdXn для отмонтирования раздела на диске и eject /dev/sdX, чтобы освободить диск от управления ОС. Сколько данных ещё должно записаться на диск можно оценить командой grep Dirty /proc/meminfo — значение никогда не бывает нулевым, но под конец записи малое.

Или просто нажать в GUI файлового менеджера кнопку извлечения диска, она всё это сделает, и как закончит, можно вынимать. Но вот если вынимать «на горячую», то данные не успеют синхронизироваться с дисковым кешем.

К слову, такое удобство в виде корректного отображения записи в GUI появилось только в Windows 10, да и то не сразу. До этого «безопасно извлекать» флешки нужно было и там, да и сейчас не лишнее.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от NorthernBlow

понял, надо sync выполнять каждый раз

umount - это по сути sync + проверка, что запущенные приложения не используют файлы с носителя (а после завершения работы команды - гарантия, что больше не будут).

annulen ★★★★★
()

Можно ли как-то валидировать передачу?

Хеш-сумма
man md5sum, man b2sum, man sha1sum, etc.

Или используйте rsync, так как:

Note that rsync always verifies that each transferred file was correctly reconstructed on the receiving side by checking a whole-file checksum that is generated as the file is transferred

Если после копирования, до того как отмонтировали и извлекли накопитель, хеш-суммы файлов совпадают, то значит они были корректно переданы драйверу фс накопителя. Переданные файлы обычно не сразу физически записываются на накопитель, так как большинство фс, в целях улучшения времени отклика, осуществляют кеширование в оперативной памяти, физически сбрасывая данные на накопитель в фоне.

Команда sync просит драйверы фс сбросить кешированные данные на накопители, но исполнение этой просьбы зависит от самих драйверов.

Кроме того, перед извлечением сменного накопителя, в обязательном порядке отмонтируйте фс. При этом происходит не только автоматический сброс кешированных данных, но и завершаются операции производимые драйвером в фоне для обслуживания фс. Наконец, после отмонтирования фс, и до физического извлечения накопителя можно отключить питание с помощью команды udisksctl power-off.

QsUPt7S ★★
()
Последнее исправление: QsUPt7S (всего исправлений: 1)
Ответ на: комментарий от monkdt

umount запускает sync автоматически. Но можно и явно запустить, так даже предпочтительнее, так как после запуска sync диск ещё пригоден к использованию, а при запуске umount - уже нет.

Werenter ★★☆
()

Даже в Виндоуз ХП выскакивало предупреждение о необходимости безопасного извлечения устройства, если выдергивал флешку без предупреждения. А в Линукс UX так и не завезли?

Человек целый год мучился!

filosofia
()
Последнее исправление: filosofia (всего исправлений: 2)
Ответ на: комментарий от SpaceRanger

Билли жеж лет 10 назад разрешил вытаскивать флешки без жмакания «Безопасное извлечение»

В оффтопике, насколько я помню, в этих целях по-умолчанию просто отключили кеширование записи для съёмных устройств. Для улучшения отзывчивости устройства его приходилось включать вручную, а перед извлечением жмакать «Безопасное извлечение».

QsUPt7S ★★
()
Ответ на: комментарий от Vsevolod-linuxoid

Взрослые офисные работники с удивлением узнают, что есть такой «механизм» как «Безопасное извлечение накопителя». Сильно удивляются, что это необходимо (это достаточно свежее наблюдение, реальные события)

master_0K
()

Кстати, выше не рассмотрен еще один вариант сбоев при чтении файлов с SD-карты. Копирование на SD происходит правильно, c синхронизацией и отмонтированием. Но файлы читаются с ошибкой! Связано это с фрагментацией файла на части. Многие устройства (например 3D-принтера) имеют упрощенный драйвер файловой системы без учета фрагментирования. Т.е. если файл хранится одним куском - все читается правильно, если файл разбит на части - читается только первый фрагмент - потом ошибка!
Особенно это больно, когда после многочасовой печати происходит останов из-за ошибки чтения. В таких случаях надо не удалять ничего с флэшки, а при заполнении выполнять форматирование вместо удаления файлов.

sigurd ★★★★★
()