En los sistemas operativos de la familia Unix, el comando sync
permite sincronizar los datos de archivos en cache (memoria volátil) a disco (almacenamiento persistente) forzando la ejecución inmediata de todas las escrituras pendientes.
Todos los sistemas operativos utilizan algún mecanismo de cache y/o buffer de disco para mejorar el rendimiento y los tiempos de acceso a los mismos. Todo mecanismo de cache se basa en el concepto de localidad temporal, espacial y secuencial en los patrones de acceso a los datos. Mediante un mecanismo de cache en memoria volátil (de menor capacidad pero mayor velocidad de acceso) es posible mejorar los tiempos de acceso a discos. Esto conlleva a que a veces los datos en disco (almacenamiento persistente) se encuentren desactualizados respecto a las copias en cache. Si hubiera un fallo o corte de energía en uno de esos momentos, pueden perderse cambios en disco o incluso quedar inconsistentes. Es aquí cuando se puede recurrir a sync
para forzar una sincronización de discos y que todas las escrituras pendientes (aún en cache) sean ejecutadas inmediatamente.
Por defecto el kernel Linux escribe los datos a disco de forma asincrónica. Las escrituras se hacen mediante un buffer o cache en memoria principal (RAM) y se envían a disco cuando sea oportuno. sync
precisamente permite forzar todas estas escrituras a disco de forma inmediata.
Puede haber diferentes casos de uso de sync
, no sólo para reflejar cambios importantes en disco y evitar eventuales fallos. Por ejemplo, es conveniente ejecutar sync
: antes de clonar una máquina o disco virtual en uso; antes de suspender el sistema; antes de crear un backup de disco a bajo nivel; antes y después de correr una tarea crítica; antes de crear un snapshot; cuando se utilizan sistemas de archivos montados de forma remota (por ejemplo NFS); etc.
En los sistemas GNU/Linux o GNU+Linux, sync
es provisto por el paquete coreutils. Cuando se corre sin parámetros, sincroniza todas las escrituras en cache de todos los discos:
# sync
La opción -d
permite sincronizar sólo datos (excluyendo metadatos). A su vez, sync admite una ruta a un archivo como parámetro. Esto permite sincronizar sólo ese archivo o el sistema de archivos que lo contiene (agregando la opción -f
.
Sin dudas otro de los comandos básicos que todo SysAdmin debe conocer.