¿Cómo obtener el uso del disco físico (sincronizado) ignorando el caché del sistema?

¿Cómo obtener el uso del disco físico (sincronizado) ignorando el caché del sistema?

Estoy usando dupara monitorear continuamente la cantidad de datos escritos en unidades USB que estoy duplicando.

Comparo el uso del disco de las unidades de origen y de destino y muestro el progreso de la copia al usuario.

El problema es que duinforma el 100% de los datos presentes en la unidad de destino, aunque veo que todavía hay muchos datos en la memoria caché del sistema, el LED de la unidad parpadea y las unidades no están listas para ser extraídas.

Ejecuto rsyncy syncen umountsecuencia para asegurarme de que los datos estén realmente allí antes de permitir que el usuario elimine la unidad de destino. Sin embargo , no puedo monitorear el syncprogreso. Por lo tanto, el usuario verá el 100% mucho antes de que las unidades estén realmente sincronizadas.

Me encantaría poder monitorear el progreso de la copia "real", ya que es lo que realmente importa: no sirve de nada ver rsyncla copia completa de un archivo de 1 GB en 25 segundos, mientras que tendré que esperar otros 5 minutos mientras synclo descargo. conducir (estoy exagerando, pero ya entiendes la idea).

Así es como superviso rsyncel progreso en un bucle para cada unidad:

PROGRESS="$(echo "$(du -s "/MEDIA/TARGET" 2>/dev/null  | cut -f 1) / $(du -s "/MEDIA/SOURCE" 2>/dev/null | cut -f 1) " | bc -l)"

$PROGRESSes un valor flotante entre 0 y 1, que indica la relación entre el uso de la unidad de origen y el uso de la unidad de destino.

¿Cómo puedo modificar esto para que considere solo los datos que ya están sincronizados con la unidad y no solo los que están esperando en la memoria caché del sistema?

Editar:

Descubrí que ddpuedo realizar escrituras omitiendo el caché del sistema. Hice una prueba y, de hecho, al copiar un archivo de esta manera se duinforman los valores reales y mis indicaciones de progreso finalmente serían precisas:

dd if=/media/SOURCE/file of=/media/TARGET/file bs=4M oflag=direct

Esto utiliza el caché de lectura, pero deshabilita el caché de escritura, lo que hace que el progreso sea más fácil de rastrear, sin realizar lecturas excesivas. El problema es que para usarlo dden lugar de rsyncnecesito recrear manualmente la estructura del directorio. No necesito ocuparme de los atributos del archivo ni de las fechas de modificación.

Supongo que podría usar una combinación de y findpara recrear primero el árbol de directorios y luego copiar los archivos uno por uno. Me pregunto: ¿hay algún inconveniente en este enfoque?mkdirdd

Respuesta1

Parece que la mejor manera de manejar esto es usarsalida directa de archivos. De esta forma dulas lecturas serán mucho más precisas.

Lamentablemente, solo ddpermite eso, por lo que debemos solucionar dos problemas:

  1. ddno sabe qué hacer con los directorios
  2. ddsolo se puede copiar un archivo a la vez

Primero definamos los directorios de entrada y salida:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Ahora entremos cden el directorio fuente para findinformar los directorios relativos que podemos manipular fácilmente:

cd "$SOURCE"

Duplicar el árbol de directorios de $SOURCEa$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Duplicar archivos desde $SOURCEomitiendo $TARGETel caché de escritura (¡pero utilizando el caché de lectura!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Esto no preservará los tiempos de modificación de los archivos, la propiedad y otros atributos, pero para mí está bien.

información relacionada