Bienvenidos al blog del Capitán Malaspina y sus secuaces donde encontrarás reflexiones sobre ciencia, tecnologia, informática y otras cosas de pensar.

10 marzo 2011

ENLACES SIMBÓLICOS (JUNCTIONS) EN NTFS. USO CON DROPBOX



QUÉ ES UNA JUNCTION

Una Junction (punto de unión) es en Windows lo mismo que un enlace simbólico en Linux. Un enlace simbólico es un atajo a un archivo o directorio. Es un nombre, una cadena de texto que apunta a otro directorio o archivo. En sí mismo no contiene ningún dato, sino que contiene la ruta del directorio hacia el que apunta. De alguna manera se parecen a los “Enlaces Directos” del escritorio de Windows, sólo que las “juntiones” están disponibles en todo el sistema de archivos y no solamente en la carpeta donde han sido creadas. Si "c:\mi_directorio" es un enlace simbólico hacia el directorio real "c:\Documents and Settings\Users\PepePaco", al pinchar en la carpeta "mi_directorio" del disco C: se obtendrá el mismo resultado que si se hiciera click en la carpeta "c:\Documents and Settings\Users\PepePaco", pero sin necesidad de tener que ir navegando por la estructura de directorios hasta dar con ella y hacerle doble click. Lo mismo ocurre si desde la consola hacemos:
dir c:\mi_directorio
dir c:\Documents and Settings\Users\PepePaco
En ambos casos obtendremos un listado de los archivos y directorios contenidos en "c:\Documents and Settings\Users\PepePaco". Si edito el fichero "c:\mi_directorio\mifichero.txt", en realidad estoy editando "c:\Documents and Settings\Users\PepePaco\mifichero.txt"
La utilidad de las juntions salta a la vista cuando el camino hacia un determinado documento es muy largo y tenemos que acceder a él con bastante frecuencia. Es demasiado laborioso tener que teclear o buscar en el navegador a cada instante la ruta del archivo, además de que es una fuente constante de errores tipográficos.
DE DONDE PROVIENE LA IDEA
La idea de los enlaces simbólicos proviene del mundo Linux, donde hay una estructura de directorios de sistema y de usuario más compleja y elaborada que el sencillo “C:\” de Windows. Los enlaces en Linux pueden ser simbólicos o duros (simbolic links o hard links), y cada uno tiene su utilidad. Sin entrar en materia, los hard links hacen referencia a un archivo y permiten manejar ese archivo con distintos grados de permisos según el nombre que se utilice. Puedo tener un hard link llamado “doc_user.txt” que señale a un documento con el que solo tenga permiso de lectura de ese archivo y otro enlace duro llamado “doc_prop.txt” que otorgue permisos de escritura al mismo. Ambos nombres se refieren al mismo archivo, pero dependiendo del nombre que utilice para referirme a él podré modificarlo o no.
Los enlaces simbólicos apuntan a una ruta o un archivo en el sistema de directorios. Pueden referenciar cualquiera de las particiones y volúmenes del sistema. En este caso no intervienen los permisos, pues los que prevalecen son los del archivo y directorio originales a los que apunta.
COMO SE IMPLEMENTA
En Unix / Linux, existe la orden ln (link) para crear enlaces. Su uso es:
ln [-s] nombre destino
El paliativo -s sirve para indicar que queremos crear un enlace simbólico. Si no lo expresamos, el enlace será duro.
En Windows hubo en principio una tímida implementación de lo que se dio en llamar "junctions" en Windows NT y 2000. El esqueleto para implementarlos estaba construido dentro del propio sistema de archivos NTFS a partir de su versión 3.0, y Explorer era capaz de manejarlos adecuadamente, pero la herramienta para usarlos no era de dominio público, sino que formaba parte de los "Resource Kit" de estos sistemas operativos. Al cabo de un tiempo(*), pudimos utilizar el comando "junction" desde la consola (aka "Símbolo del Sistema") para estos menesteres, consiguiendo que Windows se pareciera algo más a Linux. Su sintaxis es distinta a "ln":
junction [-s] [-d] nombre destino
-s : muestra recursivamente las junctions de un directorio
-d : elimina una junction
USO CON DROPBOX
DropBox es una utilidad de sincronización de archivos en la nube. Cualquier cosa que vaya a parar al directorio de DropBox es automáticamente enviada a sus servidores y sincronizada. Como podemos tener instalados en varios ordenadores DropBox bajo la misma cuenta de usuario, podemos tener accesible la misma información desde todos ellos. El problema viene cuando se tiene una estructura de archivos estructurada pero compleja y la queremos tener sincronizada con DropBox.
Por ejemplo: somos una administración de fincas y hemos creado un sistema documental para guardar las actas de las diversas comunidades de vecinos. Si quiero acceder a la segunda acta de 2011 de la comunidad nº 30029, llamada "Edificio Edificado", mi diseño del sistema de archivos me dice que la ruta de ese archivo es la siguiente:
C:\Administracion General\Archivo Documental\Clientes\30029 Edificio Edificado\2011\Actas\
Y allí buscar el documento “ActaSegunda.txt
Toda esta base documental quiero que esté accesible para el ordenador de casa, y así poder trabajar con estos documentos fuera del horario laboral de trabajo, pero de manera que los cambios que haga en casa queden reflejados en el ordenador del trabajo y viceversa. Claro que podría usar un pendrive, pero no tengo ganas de estar haciendo copias de seguridad y restauraciones de copias todos los días para llevarme el trabajo a casa y después recuperar en el trabajo lo que hice en casa.
Es un ambiente ideal para el uso de DropBox, pues esta aplicación se encarga de vigilar los archivos que le hemos encargado que vigile y de sincronizar sus contenidos en la nube. Al modificar un archivo en el ordenador de mi trabajo, DropBox lo sincronizará en sus servidores. Al arrancar el ordenador de casa, DropBox sincronizará su disco duro con lo que exista en la nube, descargando la última versión de “ActaSegunda.txt” que guardé en mi trabajo en el pc de casa.
La complicación viene de la mano de la metodología de DropBox, que solamente vigila los archivos que estén en el directorio "MyDropBox". Una vez que haya terminado de trabajar con el archivo “ActaSegunda.txt” lo guardaré en el lugar que tiene asignado en mi estructura de directorios, pero para sincronizarlo debo copiarlo después en el directorio "MyDropBox". Como adivinarán ustedes, cuando tengo que hacer esta operación muchas veces al día, es posible que alguna vez me equivoque de nombre, o peor aún, que olvide hacerlo. Es una labor tediosa, no exenta de olvidos y errores. Claro está que podría trabajar directamente en el directorio "MyDropBox", pero entonces mi estructura lógica de directorios perdería su sentido. Además, quizás no quiera tenerla toda sincronizada, sino solo parte de ella.
La solución, como siempre, es la más fácil y sencilla: seguir trabajando desde mi estructura de directorios, y, en lugar de copiar los archivos modificados a "MyDropBox", crear en este directorio una "junction" -a la que podríamos llamar, "Sistema Documental"-, que apunte a mi estructura de directorios. Abrimos la consola, nos cambiamos al directorio “MyDropBox” y desde allí damos la siguiente orden:
junction “Sistema Documental" "c:\Documents and Settings\Administracion General\Archivo Documental"
(Recordemos que es necesario usar comillas si en la ruta de los directorios hay espacios en blanco)
Con ello, DropBox sincronizará mi estructura de directorios sin necesidad de copiarla en "MyDropBox" cada vez que cambie algo en ella. Tan sólo he de preocuparme de mi trabajo como administrador de fincas. DropBox en combinación con “junction” se encarga de hacer copias de seguridad y mantenerlas sincronizadas al instante, tan pronto como se haya hecho algún cambio en el sistema de archivo.
FINAL
Actualmente, con los sistemas Windows Vista y Windows 7, las "junctiones" han pasado a ser integradas en el entorno operativo y han cambiado de nombre. Ahora la utilidad se llama "mklink", de "make link". Su funcionamiento es el siguiente:
MKLINK [[/D] | [/H] | [/J]] nombre destino
/D Crea un enlace simbólico a un directorio
/H Crea un enlace duro en lugar de simbólico
/J Crea una "Directory Junction".
nombre Nombre del enlace
destino Ruta del enlace a la que se refiere éste
MKLINK
Por defecto, si no se indica nada, el vínculo se establece entre archivos:
mklink bloc.exe notepad.exe
MKLINK /D
Si usamos /D estamos diciendo que el enlace simbólico se refiere a un directorio, no a un fichero:
mklink /D c:\MiDirectorio c:\Documents and Settings\Yo\Mis Documentos
Al pinchar en c:\MiDirectorio, el sistema operativo nos lleva automáticamente a c:\Documents and Settings\Yo\Mis Documentos
MKLINK /H
Al usar /H le indicamos que el enlace es duro, no simbólico. Creamos así otro nombre para el mismo archivo:
mklink /H bloc.exe notepad.exe
Lo que hacemos con ello es que "block.exe" apunte directamente a la zona del disco donde está almacenado el archivo "notepad.exe": es como si un mismo archivo tuviera dos nombres, de forma que al borrar "notepad.exe " sólo borramos la entrada en la tabla de archivos del disco, los datos siguen ahí, y pueden ser recuperados mediante "block.exe"
MKLINK /J
Finalmente, al usar /J indicamos que se trata de una unión de directorios o punto de unión de directorios. Este comando solamente es válido para directorios. En lugar de funcionar como un acceso directo, la unión trabaja como si fuera en sí misma un directorio:
mklink /J c:\UNO c:\DOS\TRES\CUATRO
Puedo ir al directorio UNO, y trabajar con sus archivos pero realmente estoy trabajando con los archivos de CUATRO
Nota: Para eliminar un enlace no hay que dar una orden específica, simplemente se borra igual que si borráramos una archivo o un directorio
Si queremos ver las junctions que tiene un directorio, no podremos hacerlo desde el explorador y tendremos que recurrir a la consola. Desde allí, con una simple orden "DIR", nos aparecerán las uniones que existan en ese archivo marcadas con la palabra <"JUNCTION">

¡ADVERTENCIA!:
Las junctions son muy útiles pero hay que llevar cuidado con ellas, sobre todo si se trabaja en sistemas Windows XP o Windows 2000 desde el Explorer. El administrador de archivos de estos dos sistemas operativos no distingue entre una carpeta real y un punto de unión del tipo junction, de forma que si borra la junction usando el explorador o la envía a la papelera de reciclaje, con ella se borra también la carpeta a la que señala y todos los archivos que contuviera, igual que si hubiera borrado directamente la carpeta señalada. Para borrar únicamente el punto de unión deberá usar el comando "del " desde la consola del símbolo de sistema.

Pulsar Informaticks 2011


(*) El sitio web "NT Internals" pertenecía a la empresa "Winternals Software LP", de Austin, Texas. Fue creado en 1996 por Mark Russinovich y Bryce Cogswell para alojar sus utilidades de sistema avanzadas, de uso totalmente gratuíto, junto con información técnica sobre Windows. Entre ellas estaba el comando "junction" y otras utilidades para la recuperación de datos en discos duros. En julio de 2006, Microsoft adquirió Winternals y lo convirtió en Sysinternals, manteniendo la gratuidad de las aplicaciones. Hoy podemos encontrarlas en http://technet.microsoft.com/es-es/sysinternals/default
Más sobre Winternals en la wikipedia: http://en.wikipedia.org/wiki/Winternals

4 comentarios:

  1. Hola, muchas gracias por el artículo.
    Tengo un problema, cuando ejecuto mklink /j "c:\A" "f:\B" me da el mensaje "No se puede crear un archivo que ya existe".
    ¿Cómo lo puedo resolver?
    Saludos.
    Paco

    ResponderEliminar
    Respuestas
    1. No crees el enlace a A antes de lanzarlo ya que lo crea el en cuanto se lo digas, ese aviso te lo pone porque has creado la carpeta y logo has lanzado la orden de mklink.

      Eliminar
  2. Desde luego, es cierto lo que dices al principio. Este artículo, aunque pequeñito, es un auténtico tesoro, de esos que guardas en un rincón para usar una y otra vez.
    Estoy convencido de que tus palabras habrán puesto a girar los engranajes de más de una cabeza pensante (o no tan pensante, en cuyo caso es posible que les chirríen los engranajes :-) ), y empiecen a ver el potencial que tiene.
    De momento, en mi trabajo le voy a ahorrar un montón de trabajo al encargado de mantenimiento de los ordenadores (y para mí personalmente, ya iré sacándole jugo, je, je...)
    Muchísimas gracias, has hecho engordar mi carpeta de favoritos, pues tu blog ha ido a parar ahí, posiblemente para no salir. Sigue así

    ResponderEliminar
  3. Excelente aporte. Muchas gracias. Sin embargo, no me queda clara la diferencia entre mklink /D y mklink /J. He realizado varias pruebas y se comportan exactamente igual.

    ResponderEliminar