изменить порядок секторов на блочном устройстве?

420
Matei David

Я рассматриваю возможность резервного копирования некоторых данных на DVD / BD. (Я знаю о DVDisaster.) Я где-то читал, что внешние секторы на DVD более подвержены износу, чем внутренние. Это говорит о том, что со временем блоки во второй половине изображения с большей вероятностью будут повреждены, чем блоки в первой половине. Итак, мой вопрос, есть ли способ записать одни и те же данные на 2 образа DVD, так что

  1. можно смонтировать любой DVD, возможно, в 2 этапа (например, смонтировать ISO-файл, хранящийся на DVD), но без предварительного копирования всего на HD и манипулирования им
  2. основные данные должны быть записаны на 2 DVD в существенно различном порядке

Если мне неясно, вот что может быть возможным решением.

Предположим, на секунду существует драйвер Linux, который может смонтировать ISO-образ в обратном направлении. Итак, я даю ему iso-файл, и когда ему нужен 1-й сектор, он читает последние 2048 байт файла назад, а не первые 2048 байт в обычном порядке. Я не знаю, существует ли такой драйвер, но если бы он существовал, это было бы одним из решений моей проблемы, потому что я мог бы сделать это: поместить мои данные в iso-образ; вычислить второе изображение как первое в обратном направлении; инкапсулировать каждое изображение в простую файловую систему UDF с одним файлом; записать две файловые системы UDF на разные DVD. Теперь, когда я подключаю любой DVD, я могу просто смонтировать один iso-файл, чтобы вернуть мои данные. Кроме того, данные будут записываться на 2 DVD-диска по-разному, поэтому, если оба DVD-диска потеряют последние 1/3 своих секторов, я все равно смогу восстановить их все (вручную,

Другими возможными решениями будет общий драйвер для перестановки / поворота / переупорядочения блоков произвольного размера в устройстве произвольного блока. Или, возможно, есть способ сохранить файл в файловой системе UDF, используя определенный порядок секторов? Учитывая, что UDF является полноценной файловой системой, это определенно возможно, но есть ли инструмент для этого?

Спасибо!!

Изменить : как я объяснил в первом ответе, я не имею в виду заменить DVDisaster, но дополнить его. Рассмотрим 2 стратегии резервного копирования 4G данных. Стратегия A: используйте 2 одинаковых DVD, каждый с 15% ecc от DVDisaster. Стратегия B: использовать 2 DVD, каждый с 15% ecc, но с дополнительной перестановкой, о которой я упоминал выше (на 1 из 2 DVD). Я утверждаю, что из-за закономерностей износа DVD-дисков (в частности, из-за корреляции ошибок), через некоторое время вероятность полного восстановления от B значительно больше, чем от A (при прочих равных условиях).

Edit2 : Чтобы подтвердить мое утверждение о том, что DVDisaster не является лекарством от всего, вот сценарий, демонстрирующий, как DVDisaster с 33% ECC-данными переносит потерю данных только с 1,3% повреждением. Очевидное противоречие состоит в том, что 33% относятся только к коррупции «в лучшем случае», а не к «любой» коррупции. К вашему сведению, я создаю файл, охватывающий всю файловую систему test.1.udf, меняя только последний сектор в файле на ноль test.2.udf, вычисляя данные ecc для обоих и сравнивая сектора, включая данные ecc. Дело в том, что если у test.1.udfвас есть данные, и вы теряете сектора, которые отличаются и только те, вы не сможете восстановить, test.1.udfпотому что test.2.udfэто еще одна возможность.

n_blocks=8192 tdir=$(mktemp -d) mkudffs -b 2048 test.1.udf $n_blocks sudo mount test.1.udf $tdir -o bs=2048 sudo chown $USER.$USER $tdir n=$(df -B 2K $tdir | tail -n 1 | awk '') let n-=1 dd if=/dev/urandom of=$tdir/file bs=2K count=$n 2>/dev/null last=$(od <$tdir/file -Ad -t x1 | tail -n 2 | head -n 1 | cut -d ' ' -f 2-) sudo umount $tdir start_of_last_block=$(od <test.1.udf -Ad -t x1 | grep -A 1 "$last" | tail -n 1 | awk '') last_block=$(($start_of_last_block / 2048)) dd if=test.1.udf bs=2K count=$(($last_block - 1)) >test.2.udf 2>/dev/null dd if=/dev/zero bs=2K count=1 >>test.2.udf 2>/dev/null dd if=test.1.udf bs=2K skip=$last_block count=$(($n_blocks - $last_block)) >>test.2.udf 2>/dev/null n_blocks_with_ecc=$(echo "$n_blocks * 133 / 100" | bc) echo "add dvdisaster ecc data, using in total $n_blocks_with_ecc" #run dvdisaster on the 2 files, then... n_blocks_different=$(for i in $(seq 0 $(($n_blocks_with_ecc - 1))); do if [ $((($i / 100) * 100)) -eq $i ]; then echo "$i..." >&2 fi diff -q <(dd if=test.1.udf bs=2K skip=$i count=1 2>/dev/null) \ <(dd if=test.2.udf bs=2K skip=$i count=1 2>/dev/null) >/dev/null || echo $i done | wc -l) echo "number of blocks different: $n_blocks_different / $n_blocks_with_ecc ($(echo "scale=6; $n_blocks_different / $n_blocks_with_ecc * 100" | bc)%)" 

Выход:

number of blocks different: 145 / 10895 (1.330800%) 
4
Другое возможное решение - хранить данные полезной нагрузки в линейном виртуальном массиве md, разделенном на несколько файлов (например, 4). Тогда я мог бы записать эти файлы в разных порядках на 2 DVD. Проблема в том, что для монтирования массива мне нужно петлевое устройство для каждого блока, и они ограничены. Кроме того, я мог бы смонтировать это, только если моя система запускает md (в отличие от искусственно фрагментированного файла в UDF, который должен понимать каждая система). Matei David 11 лет назад 1
Я не понимаю команду: "dd if = test.1.udf bs = 2K skip = $ last_block count = $ (($ n_blocks - $ last_block)) >> test.2.udf 2> / dev / null" , Для чего это? предыдущие два сначала создали test.2.udf, похожий на test.1.udf, всего на один блок меньше, а затем вы добавили блок с нулями. FarO 9 лет назад 0
Кроме того, мне кажется (если я правильно понял), что вы должны 1) сгенерировать test.1.udf 2) добавить ECC к этому 3) повредить его 4) восстановить его с помощью dvddisaster 5) проверить количество неисправимых секторов. Или я неправильно понял цель вашего теста? FarO 9 лет назад 0

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

3
David

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

Это возможно, поскольку декодер RS не различает пользовательские данные и данные для исправления ошибок. По мнению декодера RS, каждый блок представляет собой последовательность из 100 байтов, из которой может быть восстановлено произвольное подмножество из 20 байтов.

Хотя некоторые части диска могут с большей вероятностью потерять данные, потеря данных все же может происходить в любом месте. В описанном двухдисковом методе вы потеряете данные, если два сбойных сектора будут перекрываться . На более высоких уровнях потери данных это будет довольно распространенным явлением. Для сравнения, коррекция ошибок Рида-Соломона позволяет восстановить без потерь 14,3% (нормальный режим) или 33,5% (высокий режим) диска.

DVDisaster предназначен именно для этого и способен удовлетворить ваши потребности здесь. Если вы чувствуете себя особенно параноиком, вы можете установить избыточность на Высокий (или пользовательский) и при этом использовать меньше места и иметь более высокую надежность, чем с двумя дисками.

Счастливые резервные копии!

enter image description here

Также упомяните `par2`;) 0xC0000022L 11 лет назад 0
Я думал об этом, но я не был уверен, как это будет хорошо работать, если у вас есть файлы, которые находятся на нескольких компакт-дисках. Кроме того, я хотел уменьшить длину. David 11 лет назад 0
Спасибо за ответ, но с моей схемой я не хотел заменить DVDisaster, только чтобы дополнить его. Matei David 11 лет назад 0
Некоторые проблемы с тем, что вы сказали: 1. DVDisaster не вставляет четность в «случайных» точках, а только в конце - я протестировал его. Если вы `diff -qb <(dd if = orig.iso bs = 2K count = $ x) <(dd if = parity.iso bs = 2K count = $ x)` с `x` равно числу секторов в` orig.iso`, будет равным. Matei David 11 лет назад 0
2. Я уверен на 90%, что указанная вами гарантия избыточности (например, 15%) означает: «при наилучших обстоятельствах, если возникают ошибки 14,99%, вы можете восстановить их все; также, если возникают ошибки 15,01%, вы, безусловно, можете не вернуть их всех. Это отличается от того, что вы, похоже, предлагаете: «для всех возможных ошибок в 14,99% вы можете восстановить их все». Может быть, `par2` делает это, но я держу пари (как я уже сказал, это обоснованное предположение), что для эффективности DVDisaster разделяет входные данные на кластеры и защищает кластеры независимо друг от друга. Чтобы потерять данные, вам нужно всего лишь потерять 15,01% от 1 кластера и его четности. Matei David 11 лет назад 1
Поэтому я считаю DVDisaster очень полезным и вполне достаточным, если ошибки на каждом DVD являются «случайными». Но IRL это не так. Из моего опыта работы с 5+ летними DVD-дисками, которые я пытался сделать из резервных копий, из тех, у которых вообще была какая-либо ошибка, 90% имели эти ошибки только во второй половине (внешние слои). Matei David 11 лет назад 0
Вы правы относительно местоположения данных, но это не влияет на скорость восстановления, поскольку декодер Рида-Соломана не делает различий между пользовательскими данными и данными для исправления ошибок, так как вы можете потерять до 15% данных из любого места без потери данных (но если это 15,01%, вы потеряете все это). Я обновлю ответ, чтобы отразить это. http://dvdisaster.net/en/qa.html#eccpos David 11 лет назад 0
Я добавил пример, демонстрирующий, что утверждение о восстановлении после «любых 15% коррупции» неверно. Matei David 11 лет назад 0
Я имел в виду тип повреждения, которое происходит при обычном использовании, а не то, что происходит, когда вы намеренно помещаете все сбои в один и тот же блок ECC. Этот тест мало похож на то, как диск деградирует в реальной жизни. Попытка поместить некоторые данные на диск и затем поцарапать их, если вы хотите более реалистичный тест. http://dvdisaster.net/en/qa31.html David 11 лет назад 0
Мой вопрос был не о DVDisaster. Независимо от того, насколько хорошо он защищает каждый отдельный DVD, 2 DVD, использующие мою схему (перестановка + DVDisaster), обеспечивают лучшую защиту, чем 2 идентичных DVD только с DVDisaster. Причина: шаблоны ошибок на двух DVD не зависят друг от друга. Если на DVD1 развивается шаблон ошибок, который приводит к потере данных, у DVD2 есть высокий шанс развить тот же шаблон ошибок. Если DVD2 идентичен DVD1, вы потеряете оба. Если DVD2 использует перестановку, вы можете потерять некоторые сектора на DVD1 и другие на DVD2, но все же сможете восстановить все данные, комбинируя их. Matei David 11 лет назад 0
Если вы считаете, что отсутствие избыточности приведет к потере данных, решение состоит в том, чтобы увеличить настройку избыточности, а не изобретать совершенно новый метод хранения данных. David 11 лет назад 1
Как объяснено в моем рассуждении «Независимо от…» выше, я могу также увеличить избыточность в моей схеме и снова победить только DVDisaster. Кроме того, мой оригинальный вопрос не был «Как сделать резервную копию данных?» или «Как работает DVDisaster?». На данный момент это единственные вопросы, на которые даны ответы. Matei David 11 лет назад 0
Reed-Solomon ECC более эффективен в расчете на байт при обеспечении избыточности, чем наивное дублирование данных. Вы хотели, чтобы ваши данные были в безопасности, и я сказал вам. Если вы хотите избежать использования хорошо протестированного решения в пользу системы, которую никто не использует (и может не существовать), потому что она не так хороша, вы сами по себе. David 11 лет назад 0
Вы, кажется, действительно не понимаете этого ... Уже в третий раз: я хочу дополнить RS ECC, а не просто дублировать данные. Как указано во втором предложении моего первоначального вопроса, я не спрашиваю подробности о DVDisaster. Matei David 11 лет назад 0
«Я на 90% уверен, что упомянутая вами гарантия избыточности (например, 15%) означает:« при наилучших обстоятельствах, если возникает ошибка 14,99%, вы можете восстановить их все; Кроме того, если возникают ошибки 15,01%, вы, безусловно, не сможете восстановить их все "-> читайте здесь, сноску: http://dvdisaster.net/en/qa31.html в нем говорится одно и то же: каждый блок независим, и если у вас слишком много ошибок в одной, вы теряете все это, но они равномерно распределяются на диске, и это заставляет меня задуматься, как ваш пример (см. первый пост), только с искусственными повреждениями в конце изображения, может привести к потере данные. FarO 9 лет назад 0
Кроме того, я думаю, что par2 может на самом деле (учитывая не поврежденные файлы ecc par2) восстанавливать ЛЮБОЕ повреждение во всем архиве, при условии, что общее количество поврежденных секторов меньше, чем данные о четности. FarO 9 лет назад 0

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