Как 'dd' может привыкнуть к блокам данных сдвига вправо?

См. также: Расширенный Globbing Bash, хотя в этом случае расширенный шарик не важен.

 shopt -s extglob; url=http://www.foo.bar/file.ext; echo ${url##+(*/)}

Вывод: file.ext

10
13.11.2014, 14:30
3 ответа

Без буфера можно идти назад, по одному блоку за раз.

for i in $(seq 100 -1 0)
do
    dd if=/dev/thing of=/dev/thing \
       bs=1M skip=$i seek=$(($i+2)) count=1
done

Пожалуйста, обратите внимание, что этот пример опасен из-за отсутствия проверки на ошибки.

Он также медленен из-за количества вызовов dd. Если у вас есть свободная память, можно использовать больший размер блока.

С буфером остерегайтесь подводных камней . Достаточно не, чтобы гарантировать 100% предзаполнение. Нужно минимальное заполнение на протяжении всего процесса. Буфер никогда не должен опускаться ниже 2M, т.к. в противном случае Вы снова перезапишите еще не прочитанные данные.

И хотя теоретически можно обойтись без любого буфера и только цепочкой dd:

dd if=/dev/thing bs=1M | \
dd bs=1M iflag=fullblock | \
dd bs=1M iflag=fullblock | \
dd of=/dev/thing bs=1M seek=2

На практике это работает не надежно, т.к. нет никакой гарантии, что первый dd сможет продолжать чтение данных, в то время как последний dd2M "буфер" между ними) уже записывается.

Вы можете значительно увеличить свои шансы, сделав промежуточный буфер значительно больше, но даже в этом случае он не является надежным.

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

2
27.01.2020, 20:03

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

Вы не упомянули, какая это файловая система. Если это Ext [234], и у вас есть недавняя версия E2FSPROG, то вы можете использовать E2Image -ra -O 512 / dev / sdj2 . Это также имеет дополнительное преимущество, чтобы быть достаточно умным, чтобы пропустить свободное место в объеме.

1
27.01.2020, 20:03

Надежное решение требует, чтобы вы убедили, что ничто не пишет в область, которая, возможно, не была прочитана, и единственным реальным способом достижения этого является выполнение копии в обратном направлении.

Инструмент DDRESCUE может работать в обратном направлении, но он отказывается работать с входом и выходом одинакового. Однако можно обмануть его путем дублирования узла устройства.

Я выполнил несколько быстрых экспериментов, и он, кажется, работает. Строка командной строки:

$ ddrescue -f -R -s 200704s -o 4096s /dev/sdj11 /dev/sdj11_copy

аргументы

  • -F требуется для того, чтобы заставить его записывать на существующее выходное устройство
  • -R , позволяет ему работать в обратном направлении
  • -S говорит о том, сколько входных данных копирует (я использовал суффикс S для указания количества секторов)
  • -O , говорит ему искать вперед на выходе Устройство перед записью (уточняется в секторах снова с помощью суффикса
  • / dev / sdj11 - это блок-устройство для чтения
  • / dev / sdj11_copy - это блок-устройство для Напишите

I создали / dev / sdj11_copy с mknod , чтобы соответствовать параметрам / dev / sdj11 .

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

Это не отвечает на мой оригинальный вопрос, который спросил, как это достичь с DD , но я думаю, что , прочитав другие ответы, ответ на то, что DD не может этого сделать.

1
27.01.2020, 20:03

Теги

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