
Supongamos que tengo una unidad que tiene un superbloque (o bloque) defectuoso en alguna ubicación aleatoria. Es una unidad enorme, de 1 a 8 TB. No se formateará en ext3, así que lo escribiré lleno de ceros para poder formatearlo correctamente. lsblk -f
muestra su FSTYPE como una cadena vacía.
¿Hay alguna razón para no ejecutar el siguiente comando?
sudo dd if=/dev/zero bs=10G status=progress of=/dev/bad_disk
Respuesta1
Sospecho que no puedes interrumpir el programa mientras escribe un bloque y escribir 10 GB lleva mucho tiempo. En mi experiencia, la mejora del rendimiento con el tamaño de bloque se estabiliza con bastante rapidez, por lo que me apegaría a tamaños más razonables (4 MB...).
Respuesta2
Mi respuesta aborda exactamente el título:
¿Existe algún argumento en contra del uso
dd
withbs=10G
?
Pero en tu caso es un pocoproblema xy. El problema subyacente (bloques defectuosos) debe abordarse con smartctl
y badblocks
, no con dd
.
Uso de memoria
esta otra respuestamenciona "mejora del rendimiento con el tamaño del bloque":
Mejora del rendimiento con mesetas en el tamaño de los bloques con bastante rapidez
Es cierto, pero es sólo una bs
parte "casi cero" de la historia. En el contexto de la pregunta, deberíamos decir la bs
parte "va al infinito".
En el mundo real, la meseta en realidad se derrumba durante algunos años bs
. Con bs=10G
la herramienta intentaremos asignar 10 GiB de memoria. Puede que tenga éxito o no (memoria agotada). Incluso si tiene éxito, todavía hay problemas:
- Es posible que otros procesos cambien su memoria asignada al disco.
- El búfer de
dd
puede intercambiarse al disco. La herramienta lo usa constantemente, por lo que el sistema operativo probablemente intercambiaría primero otros datos (a los que no se haya accedido recientemente). Aún así, si tiene 8 GiB de RAM y 16 GiB de intercambio, no hay forma de incluirbs=10G
RAM. - Si se necesita memoria más tarde,El asesino OOM puede entrar en acción. Tu
dd
puede ser el primer proceso en matar.
Por supuesto, todo esto depende de cuánta RAM tenga y de cuánto espacio de intercambio tenga, y de lo que hagan otros procesos.
Consejos
Mi preferencia personal es utilizar bs
un tamaño que se transfiera en 0,1-1 segundo; o menor bs
si el uso de RAM puede ser un problema. De esta manera puedo interrumpir dd
casi instantáneamente (esta es la esencia delrespuesta ya mencionada). Si las limitaciones del hardware permitieran dd
superar los 10 GiB/s y tuviera más de 40 GiB de RAM libre, lo consideraría bs=10G
. En casa casi nunca subo arriba bs=64M
.
Un caso de uso que bs=10G
puede resultar útil es cuando desea procesarexactamentela misma cantidad de datos que utilizas count=1
(o, por ejemplo, 5 veces más: count=5
).Sin embargoen la práctica con grandes bs
puedes obtenermenos, a menos que utilice iflag=fullblock
(veresta respuesta). Debido al uso de la memoria, de todos modos volvería a calcular a un tamaño más pequeño bs
.