Acelerar la copia de toda una rama de directorios… y ahorrar espacio en el proceso


Esto es una chorrada, pero poca gente lo sabe y funciona muy bien. Sobre todo para aquellos disfrutan compilando kernels y por lo tanto pierden mucho tiempo y espacio copiando el árbol completo para aplicar un parche o modificar sólo unos pocos ficheros. Eso se acabó, que esto es Unix, collons! 🙂

¿Cansado de esperar que se ejecute el cp -a linux-2.6.4 linux-2.6.5 y que además se desperdicie tanto espacio por tener sólo unos pocos ficheros disponibles?

Nunca te has preguntado si hay una opción que haga la copia física de los ficheros sólo cuando se modifican?

Si es así, claro que se puede, y es estándar del Unix desde casi el principio: los hard links o “enlaces tradicionales” que se hacen con el comando link o con el ln (pero sin el -s. Lo único que hay que asegurar es que el editor o programa que modifique los ficheros no los grabe sobre el mismo inodo, sino que escriba en un inodo (fichero) nuevo.

Por suerte el vi, emacs y hasta el patch hacen exactamente eso. Así que la receta es fácil, la próxima vez que quieras tener una nueva rama del kernel (por supusto es válido para todas las ramas de directorios), haz lo siguiente:

cp -rl original copia

De esta forma se hacen los enlaces en vez de copiar físicamente los ficheros. Alucinarés desde el principio con la velocidad de copia y lo poco que consumís de espacio de disco adicional.

Ala!, ya hice mi buena acción del día, me voy a dormir más tranquilo 🙂

PS: Si medís los tiempos y queréis publicarlos aquí estaremos contentos, pero alerta con el tema de cache que depende cómo lo hagáis puede falsear mucho los datos. Tened en cuenta que en el caso de los enlaces no se lee nada de los ficheros, mientras que en la copia tradicional hay que leer todo. Lo más justo sería desmontar y volver a montar la partición para “invalidar” la cache.

Último momento: Pruebas con ReiserFS

A raíz de esta respuesta a uno de los comentarios, decidí probar los tiempos en una partición libre que tenía en mi portátil. Así que creé el sistema de ficheros ReiserFS, copié allí las fuentes del kernel 2.6.5 e hice las pruebas de copiar con ambos métodos. Para asegurarme de limpiar la cache de ese sistema de ficheros, lo monté y desmonté antes de cada prueba.

Estos son los resultados:

La manera tradicional

minime:/# time cp -a /mnt/linux-2.6.5/ /mnt/copia1

real 1m28.853s
user 0m0.566s
sys 0m7.868s

Con enlaces

minime:/# time cp -rl /mnt/linux-2.6.5/ /mnt/copia2

real 0m12.581s
user 0m0.094s
sys 0m1.109s

Ya véis, no sólo que funciona también con ReiserFS, sino que también es mucho más rápido.

PS: ya, ya, y ahora me pediréis que haga lo mismo con ext2, ext3, XFS, JFS… hacedlo vosotros mamones[*] que es muy fácil ;-):

minime:/# history | tail -10
516 mount /dev/hda2 /mnt/
517 time cp -a /mnt/linux-2.6.5/ /mnt/copia1
518 umount /mnt/
519 mount /dev/hda2 /mnt/
520 time cp -rl /mnt/linux-2.6.5/ /mnt/copia2

[*] Manteniendo la tradición de los padres fundadores de Bulma.

Este post ha sido traido de forma automatica desde https://web.archive.org/web/20140625063149/http:/bulma.net/body.phtml?nIdNoticia=2012 por un robot nigromante, si crees que puede mejorarse, por favor, contactanos.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.