Considere un dispositivo de bloque sin procesar de 100 MB como un ejemplo simple. Es decir, 204800 bloques de 512 bytes cada uno para un total de 102760448 bytes.
El desafío es cambiar los primeros 98 MB (bloques 200704) para que haya un espacio de 2 MB (4096 bloques) delante. Hacer esto en el lugar requiere que no se escriba nada en un sector que no se haya leído. Una forma de lograr esto es introducir un búfer:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
La expectativa es que mbuffer
almacenará 4096 bloques antes de pasar cualquier cosa al escritor, asegurando así que no se escriba nada en un área que no se haya leído y que el escritor retrase al lector por el tamaño del búfer. El búfer debe permitir que el lector y el escritor operen lo más rápido posible dentro de esos constriantes.
Sin embargo, no parece funcionar de manera confiable. Intenté usar dispositivos reales pero nunca funciona en ellos, mientras que los experimentos con un archivo funcionaron en mi caja de 64 bits pero no en mi caja de 32 bits.
Primero, algo de preparación:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Esto no funciona:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
Esto funciona en el sistema de 64 bits pero no en el sistema de 32 bits:
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
¿Cómo se puede hacer esto de manera confiable?
notas
He leído otras preguntas acerca de búfer y mirado pv
, buffer
y mbuffer
. Solo pude hacer que este último funcione con el tamaño de búfer requerido.
El uso del almacenamiento intermedio es una solución obvia para el problema que siempre funciona, pero no es práctico cuando no hay suficiente capacidad disponible.
Pruebe las plataformas que ejecutan Arch Linux con la mbuffer
versión 20140302.
mbuffer
realidad, debería forzar al segundo dd
a retrasarse por el primero y solo necesita suficiente RAM para amortiguar el tamaño del turno. Lástima dd
que no admite bloques de lectura y escritura en orden inverso ya que eso eliminaría el problema
-H
argumento habilita esta función).
mbuffer
? ¿Por qué no hacerdd
leer todo el contenido del dispositivo de bloque de una vezdd bs=102760448
? Por supuesto, de una forma u otra está almacenado en la RAM.