Paco Zarabozo

Junctions para carpetas de red

Muchísima gente, incluyendo expertos en IT, desconoce lo que son los Junction points en Windows (NTFS). Quienes están familiarizados con Linux/Unix, saben lo que es un Symlink, pero muchísimos creen que es una funcionalidad que en Windows no existe, lo cuál es un error.

Para aquellos que no saben lo que es, es similar a un acceso directo. La diferencia radica en que el sistema no lo trata como un accceso directo, sino somo si se tratara de el archivo o la carpeta real en sí. Por ejemplo, si yo tengo la siguiente ruta:

C:\Documents and settings\Paco\Mis documentos\Proyectos\112343\Tareas

…pero quiero acceder a esa ruta desde D:\Tareas, podría crear un acceso directo a dicha carpeta en D:\Tareas. Sin embargo, hay un sinnúmero de motivos por los cuáles yo podría necesitar que el sistema crea que D:\Tareas es una carpeta real. Por ejemplo, algún programa que forzosamente busca esa carpeta, pero yo por cuestiones de espacio, necesito conservarla en su ruta original. Entonces crearía un Junction point para que D:\Tareas sea a la vista de cualquier aplicación una carpeta real. Y si algo se modifica dentro de D:\Tareas, es automáticamente modificado en C:\Documents  and Settings\Paco\Mis documentos\Proyectos\112343\Tareas, ya que en realidad es el mismo punto y ocupa el mismo espacio en el disco duro.

Lo mismo puedo hacer para crear hardlinks a archivos (tal como lo hace el comando ln en Linux). También es necesario utilizar herramientas de terceros o provistas por Microsoft en toolkits de administración. Una vez que creas un link de este tipo, puedos tener el archivo original C:\Documents  and Settings\Paco\Mis documentos\Proyectos\112343\Tareas\Notas.txt y un hardlink a ese archivo en la ruta C:\Notas.txt. Son el mismo archivo. Si modifico uno de ellos el otro se modifica también.

Ciertamente ha existido en el sistema de archivos NTFS desde antes de Windows 2000, pero Microsoft nunca creó documentación al respecto. Existen actualmente herramientas de terceros e incluso algunas provistas por Microsoft para la manipulación de este tipo de links (por ejemplo, junction.exe de SysInternals – ahora de Microsoft).

Todo esto es de gran utilidad para muchísimos fines (mover la ubicación de carpetas de sistema para distribuir el espacio en otros discos, carpetas que un servidor web puede leer, simple comodidad de acceso, etc). Pero te encuentras con un problema cuando lo que intentas hacer es un Junction hacia una carpeta de red o una unidad de red.

Esta es una limitación directa de NTFS. Sin importar la herramienta que se utilice, un Junction hacia una ubicación que no es un disco duro local (como una unidad de red o una carpeta de red) simplemente no funciona. O al menos no funcionaba, hasta la aparición de la nueva versión de NTFS que introdujo Microsoft con Windows Vista y ahora Windows 7.

Desde Windows Vista, existe una herramienta (de línea de comandos/Símbolo del sistema) llamada mklink.exe. Con esta herramienta se pueden crear symlinks, hardlinks, softlinks y junction points. Pero la verdadera novedad es que es posible crear un symlink a una carpeta de red. ¿Por qué querrías hacer esto? Bueno, hay miles de razones diferentes para cada usuario. Pero supongamos lo siguiente:

  • Tengo un equipo de programadores en mi oficina
  • Tengo un servidor de desarrollo en el que se encuentran ciertos archivos que necesito que sean los mismos siempre para todos
  • Necesito cambios en tiempo real antes de pensar en control de versiones
  • El servidor tiene los archivos en la carpeta D:\Archivos
  • Necesito que cada programador, desde su propia máquina, vea/modifique esos archivos en tiempo real como si los tuviera en su propia carpeta local C:\Archivos_del_servidor.

Al crear un symlink en cada máquina hacia esa carpeta del servidor, cada máquina podrá utilizar esos archivos como si se tratara de archivos locales. Esto es invisible para las aplicaciones en general. Cualquier programa podrá abrir esos archivos creyendo que son archivos locales. Si yo un día modifico archivos en el servidor, no tengo que avisarle nada a nadie, todos tendrán los cambios automáticamente.

El uso de la herramienta mklink es muy sencillo. Basta con escribir ese comando en el Símbolo del sistema para que aparezcan instrucciones de uso. Para hacer, por ejemplo, un symlink como el que puse de ejemplo, utilizaría el siguiente comando en cada estación de trabajo:

mklink /d C:\Archivos_del_servidor \\SERVIDOR\d$\Archivos

La respuesta del comando sería la siguiente:

vínculo simbólico creado para C:\Archivos_del_servidor <<===>> \\DEV\d$\Archivos

Utilizando el modificador /J en lugar de /D, se crean Junction points normales, accesibles en versiones anteriores a Windows Vista. Con el modificador /H se crea un hardlink. Si el link que se quiere crear es de un archivo y no de una carpeta, entonces no se aplica ningún modificador en el comando, sólo la ruta del link a crear seguida de la ruta real al archivo.

Si no tienes experiencia con este tipo de cosas, te recomiendo fuertemente que investigues sobre el problema al eliminar Junction points desde el explorador de Windows. Puedes perder la carpeta original al vaciar tu papelera de reciclaje. Para eliminar Junctions hay que tener cuidado. Herramientas como junction.exe de SysInternals permiten la eliminación correcta. Hay muchas herramientas de terceros que lo hacen correctamente también.

Espero les sea de utilidad. 🙂

Desactivar y eliminar archivo de hibernación en Windows 7 y Windows Vista

Es común que la gente desee eliminar el archivo de hibernación en Windows. Es un archivo que llega a medir varios gigas y no es muy útil para quienes realmente no utilizan la función de hibernación. Este archivo normalmente está ligado en tamaño a la cantidad de memoria RAM del equipo. En mi caso, tengo 24 GB de memoria en mi PC de escritorio y tengo deshabilitado el uso de archivo de paginación. La hibernación por lo tanto, aunque me encanta utilizarla en mi laptop, en mi máquina de escritorio resulta muy lenta (el sistema manda a dicho archivo todo lo que se encuentre en memoria en ese momento). Tengo además muy buen equipo UPS (no-break) y puedo entrar en suspensión sin problemas por muy largo tiempo si llego a tener fallas de energía. Tengo además el sistema operativo en un SSD (disco duro de estado sólido) que no es muy grande y el resto de mis archivos en un Velociraptor de 600 GB a 10,000 RPM y el espacio que ocupaba en el SSD era simplemente un desperdicio de espacio.

En el caso de Windows XP, eliminar este archivo era tan simple como abrir la herramienta “Librador de espacio” y seleccionar entre sus opciones la eliminación de dicho archivo. Pero en Windows Vista y Windows 7 esa opción no aparece más en dicha herramienta. Pero no hay que temer, la solución es muy sencilla.

  1. Abre una ventana de Símbolo de sistema como administrador (dando click derecho en el ícono del programa puedes elegir esa opción).
  2. Ejecuta el siguiente comando: powercfg -h off

Hecho esto, la hibernación queda deshabilitada y el archivo se elimina automáticamente. Si en cualquier momento deseas activarla de nuevo y que el archivo aparezca nuevamente, sigue los mismos pasos, pero cambiando la palabra off por la palabra on.

Espero sea de ayuda a muchos. 🙂

Habilitar recursos compartidos (shares) administrativos en Windows 7

Esta es una de las situaciónes que más me frustró por un buen rato sobre Windows 7. Mucha gente está acostumbrada a compartir carpetas en red, compartiendo sólo la carpeta que desean compartir. Esto sigue siendo una fuincionalidad normal en Windows 7.

Pero para quienes no quieren compartir carpetas específicamente, o para los adminsitradores de red/equipos que necesitan acceder a cualquier punto de los discos duros sin importar si el usuario ha compartido o no una carpeta, están los recursos administrativos compartidos.

El problema con el que yo y muchos más se han encontrado, es el poder acceder a recursos administrativos compartidos. Esto es algo que hasta Windows Vista podía hacer sin mayor problema, pero que en Wiondows 7 parece estar limitado (gracias Microsoft) sólo para equipos que se encuentren dentro de un dominio de red. Para quienes no saben qué es esto, es la forma en la que un administrador de red puede acceder a todos los archivos de cualquier PC en la red. El formato es muy simple: \\NOMBRE_EQUIPO_O_IP\RECURSO$. Por ejemplo, si el equipo al que quiero entrar se llama “recepcion” y el disco que quiero leer es la unidad C, entonces lo hago con la siguiente ruta desde mi equipo: \\recepcion\c$. Esto me da acceso (siendo administrador y teniendo la contraseña de administrador) a todo lo que hay en el disco C de ese equipo.

Como siempre, hay trucos en el sistema que nos permiten habilitar funcionalidades bloqueadas. Lo que tuve que hacer después de investigar más al respecto, fue editar el registro. Es necesario ir a la siguiente ruta:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System

Ahí, hay que crear una nueva llave  de tipo DWORD (de 32 bits, aún cuando tu sistema sea de 64 bits) con el nombre LocalAccountTokenFilterPolicy y el valor hexadecimal 1.

Hecho esto, sin necesidad de reiniciar, te permite acceder a este tipo de recursos tal como lo puedes hacer en Windows XP o Windows Vista.

A esto habría que agregar el revisar que “Compartir archivos e impresoras” esté habilitado en el Firewall de Windows.

Espero sea de ayuda a más de uno. 🙂