Desde un file disperso a un dispositivo de bloque

Tengo un file disperso de image del sistema cuyo tamaño real es de solo unos pocos MB, pero el "tamaño aparente" es de aproximadamente 1 GB. Intento escribirlo en un dispositivo de bloque de manera eficiente (sin los agujeros). Aquí hay algunas soluciones que no funcionan que he intentado:

  • dd if=sparse_file of=/dev/some_dev procesa todo el file, incluidos los agujeros, por lo que al final 1007869952 bytes (1,0 GB) copied, 22,0301 s, 45,7 MB/s algo así como 1007869952 bytes (1,0 GB) copied, 22,0301 s, 45,7 MB/s
  • cp --sparse=always sparse_file /dev/some_dev parece que tampoco funciona, ya que toma mucho time para pocos MB (~ 13s)
  • ddrescue --sparse --force sparse_file /dev/some_dev falla con un post ddrescue: Only regular files can be sparse. (Nota: funciona en la dirección opuesta tal como se cubre aquí ).

Aquí hay otras dos forms , pero me gustaría utilizar solo las herramientas estándar que forman parte de la distribución de Linux.

Entonces, ¿hay alguna manera de escribir el file disperso en una image de bloque omitiendo los agujeros?

Esta herramienta escrita en C puede ser útil para usted. No es una herramienta estándar, pero es muy simple y fácil de comstackr.

Tiene razón en que cp no admite salidas dispersas para bloquear dispositivos (confirmado en la página de manual).