Некоторые программы копирования файлов любят rsync
и curl
могут возобновлять неудачные операции передачи / копирования.
Отмечая, что может быть много причин этих сбоев, в некоторых случаях программа может выполнить «очистку», а в некоторых случаях - нет.
Когда эти программы возобновляют работу, они, похоже, просто рассчитывают размер файла / данных, которые были успешно переданы, и просто начинают читать следующий байт из источника и добавлять его к фрагменту файла.
например, размер фрагмента файла, «сделавшего его» по назначению, составляет 1378 байт, поэтому они просто начинают чтение с байта 1379 оригинала и добавляют его к фрагменту.
Мой вопрос заключается в том, что, зная, что байты состоят из битов, а не во всех файлах данные сегментированы на куски чистого байтового размера, откуда эти программы знают, что точка, к которой они решили добавить данные, верна?
При записи файла назначения происходит ли какая-либо буферизация или «транзакции», аналогичные базам данных SQL, на уровне программы, ядра или файловой системы, чтобы гарантировать, что только чистые, правильно сформированные байты попадают в базовое блочное устройство?
Или программы предполагают, что последний байт будет потенциально неполным, поэтому они удаляют его в предположении, что он плохой, перезаписывают байт и начинают добавление оттуда?
зная, что не все данные представлены в байтах, эти предположения кажутся неверными.
Когда эти программы «возобновляются», как они узнают, что запускаются в нужном месте?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
и ОС будет их буферизовать и отправлять на диск еще большими кусками.
fwrite()
?