Дельта на месте пишет из трубы

994
Atemu

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

Мой план состоит в том, чтобы сделать небольшую дедупликацию, в то время как я делаю резервную копию своего раздела NTFS в файл образа, чтобы этот файл образа был ссылкой на предыдущий образ резервной копии в BTRFS.
(Думайте об этом как о жесткой ссылке, в которую вы можете писать без изменения исходного файла)

Я заполняю неиспользуемые части моего NTFS-раздела нулями, паяя partcloneв себя, поэтому вход - это канал, а не устройство.
Думайте об этом как

cat /dev/sda4 | command -i - -o newbackup.img

где commandнаходится то, что я ищу, и newbackup.imgэто файл, который уже содержит 894 ГБ данных, которые в значительной степени совпадают с входными данными, но фактическое использование диска в файле изображения равно количеству блоков, которые были перезаписаны.

rsyncможет делать это с --no-whole-file --inplaceпараметрами (IIRC) благодаря его дельта-передаче, но он неоправданно медленен (не считывает входные и выходные данные одновременно, обрабатывает дельты в одном потоке и, как правило, очень неэффективно по времени), а rsyncтакже не работает с трубы (насколько мне известно), так что об этом не может быть и речи.

2
Существуют инструменты для создания «бинарных» исправлений и применения исправлений, см., Например, [здесь] (https://stackoverflow.com/questions/1945075/how-do-i-create-binary-patches). Это то, что вам нужно? Каналы являются последовательными по определению, вы не сможете искать в трубе, поэтому нет необходимости выполнять дельта-запись на месте, но вы должны быть в состоянии создать двоичный патч из трубы и существующего файла (хотя я не тестировал тот). dirkt 5 лет назад 0
Я не совсем понимаю, почему вы должны искать канал для дельта-записей на месте, разве это не должно быть полностью последовательным? На мой взгляд, это будет работать так: читать биты из трубы; прочитать n бит из файла; если они не равны, перезапишите эти n бит в файле; повторите со следующими n битами. Atemu 5 лет назад 0
Ах, я не понял, что это то, что вы подразумеваете под «записью дельты на месте» - мое понимание было «на месте» = для существующего файла, а не для создания копии, и «дельта записи» = запись только тех части, которые меняются. Что касается «чтения n битов из канала и из файла, перезаписать, если они не равны»: такую ​​программу просто написать. Но было бы более эффективно просто перезаписать файл: теперь у вас есть n блочных записей вместо n блочных чтений и m блочных записей, где m - количество измененных блоков. Если вы не хотите по какой-то причине избегать записи, потому что на вашем носителе они стоят дороже, чем чтение. dirkt 5 лет назад 0
@dirkt CoW поведение Btrfs является причиной. Перезапись любой части повторно связанного файла приводит к тому, что эта часть занимает свое собственное пространство на устройстве, а не разделяет блоки на уровне файловой системы. Это происходит, даже если вы перезаписываете одни и те же данные, в этом суть. Оставление неизменных частей без изменений экономит место на устройстве. Kamil Maciorowski 5 лет назад 2
Похоже, реальное исправление должно быть вариантом BTRFS ... в любом случае, как я уже сказал, программу легко написать. Пара строк кода на C, больше, если вы хотите установить размер блока и т. Д. dirkt 5 лет назад 0

0 ответов на вопрос

Похожие вопросы