En informática , un enlace simbólico (también symlink o soft link ) es un archivo cuyo propósito es apuntar a un archivo o directorio (llamado el "objetivo") especificando una ruta al mismo. [1]
Los enlaces simbólicos son compatibles con POSIX y con la mayoría de los sistemas operativos similares a Unix , como FreeBSD , Linux y macOS . También existe un soporte limitado en Windows 7 y Windows Vista , y en cierto grado en Windows 2000 y Windows XP en forma de archivos de acceso directo. CTSS en IBM 7090 tenía archivos vinculados por nombre en 1963. [2] [3] [4] En 1978, los sistemas operativos de minicomputadoras de DEC y RDOS de Data General incluyeron enlaces simbólicos.
Un enlace simbólico contiene una cadena de texto que el sistema operativo interpreta y sigue automáticamente como una ruta a otro archivo o directorio. Este otro archivo o directorio se denomina "objetivo". El enlace simbólico es un segundo archivo que existe independientemente de su destino. Si se elimina un enlace simbólico, su destino no se ve afectado. Si un enlace simbólico apunta a un destino y, en algún momento posterior, ese destino se mueve, se le cambia el nombre o se elimina, el enlace simbólico no se actualiza ni se elimina automáticamente, sino que continúa existiendo y sigue apuntando al destino anterior, que ahora es una ubicación o archivo inexistente. Los enlaces simbólicos que apuntan a destinos movidos o inexistentes a veces se denominan rotos , huérfanos , muertos o colgantes .
Los enlaces simbólicos son diferentes de los enlaces físicos . Los enlaces físicos no vinculan rutas en diferentes volúmenes o sistemas de archivos , mientras que los enlaces simbólicos pueden apuntar a cualquier archivo o directorio independientemente de los volúmenes en los que residan el enlace y el destino. Los enlaces físicos siempre hacen referencia a un archivo existente, mientras que los enlaces simbólicos pueden contener una ruta arbitraria que no apunta a nada.
Los enlaces simbólicos funcionan de forma transparente para muchas operaciones: los programas que leen o escriben en archivos nombrados por un enlace simbólico se comportarán como si estuvieran operando directamente en el archivo de destino. Sin embargo, tienen el efecto de cambiar un sistema de archivos que de otro modo sería jerárquico de un árbol a un gráfico dirigido, lo que puede tener consecuencias para operaciones tan simples como determinar el directorio actual de un proceso. Incluso el estándar Unix para navegar al directorio padre de un directorio ya no funciona de forma fiable frente a los enlaces simbólicos. Algunos shells intentan mantener heurísticamente la ilusión de una jerarquía en forma de árbol, pero cuando lo hacen, esto hace que produzcan resultados diferentes a los de otros programas que manipulan nombres de rutas sin dicha heurística, confiando en el sistema operativo en su lugar. [5] Los programas que necesitan manejar enlaces simbólicos de forma especial (por ejemplo, shells y utilidades de copia de seguridad) necesitan identificarlos y manipularlos directamente.
Algunas distribuciones de Unix y Linux utilizan enlaces simbólicos de forma extensiva en un intento de reordenar la jerarquía del sistema de archivos. Esto se logra con varios mecanismos, como enlaces simbólicos variantes y dependientes del contexto. Esto ofrece la oportunidad de crear un árbol de directorios más intuitivo o específico para la aplicación y de reorganizar el sistema sin tener que rediseñar el conjunto básico de funciones y utilidades del sistema.
En los sistemas operativos compatibles con POSIX , los enlaces simbólicos se crean con la llamada al sistema symlink
[6] . El ln
comando de shell normalmente utiliza la llamada al sistema link
[7] , que crea un enlace duro . Cuando se especifica el indicador, se utiliza en su lugar la llamada al sistema symlink(), que crea un enlace simbólico. Los enlaces simbólicos se introdujeron en 1982 en 4.1a BSD Unix de UC Berkeley . [8]ln -s
El siguiente comando crea un enlace simbólico en la interfaz de línea de comandos (shell):
ln -s ruta_destino ruta_enlace
target_path es la ruta relativa o absoluta a la que debe apuntar el enlace simbólico. Normalmente, el destino existe, aunque se pueden crear enlaces simbólicos a destinos inexistentes. link_path es la ruta del enlace simbólico.
Después de crear el enlace simbólico, se pueden utilizar algunas operaciones para tratarlo como un alias para el destino. Sin embargo, las operaciones lstat
, [9] lchown
[10] y readlink
[11] son exclusivas de los enlaces simbólicos y no se aplican al destino; al utilizar esas llamadas del sistema, los programas que examinan el sistema de archivos (por ejemplo, ls
, find
) pueden informar sobre los enlaces simbólicos (en lugar de sus destinos, si los hay). Debido a que las llamadas del sistema rename
y unlink
están codificadas para operar directamente sobre enlaces simbólicos, los comandos de administración del sistema de archivos (por ejemplo, rm
, mv
) afectan al enlace simbólico en sí (en lugar de aplicarse al destino del enlace simbólico, si lo hay). El rm
comando (eliminar archivo) elimina el enlace en sí, no el archivo de destino. Del mismo modo, el mv
comando mueve o cambia el nombre del enlace, no del destino. El cp
comando tiene opciones que permiten copiar el enlace simbólico o el destino. Los comandos que leen o escriben contenidos de archivos accederán al contenido del archivo de destino.
La aplicación de listado de directorios POSIX, ls
, denota enlaces simbólicos con una flecha después del nombre, que apunta al nombre del archivo de destino (ver el siguiente ejemplo), cuando se solicita la lista larga de directorios ( -l
opción). Cuando se solicita un listado de directorios de un enlace simbólico que apunta a un directorio, solo se mostrará el enlace en sí. Para obtener un listado del directorio vinculado, la ruta debe incluir un carácter separador de directorio final ('/', barra).
Nota: En el siguiente ejemplo, no cree el directorio "tres" antes de crear el enlace en el directorio /tmp.
$ mkdir -p /tmp/one/two $ echo "test_a" >/tmp/one/two/a $ echo "test_b" >/tmp/one/two/b $ cd /tmp/one/two $ ls -l -rw-r--r-- 1 grupo de usuarios 7 ene. 01 10:01 a -rw-r--r-- 1 grupo de usuarios 7 ene. 01 10:01 b $ cd /tmp $ ln -s /tmp/one/two three $ ls -l three lrwxrwxrwx 1 grupo de usuarios 12 Jul 22 10:02 /tmp/three -> /tmp/one/two $ ls -l three/ -rw-r--r-- 1 grupo de usuarios 7 Ene 01 10:01 a -rw-r--r-- 1 grupo de usuarios 7 Ene 01 10:01 b$ cd tres $ ls -l -rw-r--r-- 1 grupo de usuarios 7 ene. 01 10:01 a -rw-r--r-- 1 grupo de usuarios 7 ene. 01 10:01 b $ cat a prueba_a $ cat /tmp/one/two/a prueba_a $ echo "prueba_c" >/tmp/one/two/a $ cat /tmp/one/two/a prueba_c $ cat a prueba_c
Las primeras implementaciones de enlaces simbólicos almacenaban la información del enlace simbólico como datos en archivos normales. El archivo contenía la referencia textual al destino del enlace y los bits de modo de archivo indicaban que el tipo de archivo era un enlace simbólico.
Este método era lento y suponía un uso ineficiente del espacio en disco en sistemas pequeños. Una mejora, llamada enlaces simbólicos rápidos , permitió el almacenamiento de la ruta de destino dentro de las estructuras de datos utilizadas para almacenar información de archivos en el disco ( inodos ). Este espacio normalmente almacena una lista de direcciones de bloques de disco asignadas a un archivo. Por lo tanto, se accede rápidamente a los enlaces simbólicos con rutas de destino cortas. Los sistemas con enlaces simbólicos rápidos a menudo vuelven a utilizar el método original si la ruta de destino excede el espacio disponible en inodos. El estilo original se denomina retroactivamente enlace simbólico lento . También se utiliza para la compatibilidad del disco con otras versiones o versiones anteriores de sistemas operativos.
Aunque almacenar el valor del enlace dentro del inodo ahorra un bloque de disco y una lectura de disco, el sistema operativo aún necesita analizar el nombre de la ruta en el enlace, lo que siempre requiere leer inodos adicionales y generalmente requiere leer otros directorios, y potencialmente muchos, y procesar tanto la lista de archivos como los inodos de cada uno de ellos hasta que encuentra una coincidencia con los componentes de la ruta del enlace. Solo cuando un enlace apunta a un archivo en el mismo directorio, los "enlaces simbólicos rápidos" brindan un rendimiento significativamente mejor que otros enlaces simbólicos.
La gran mayoría de las implementaciones compatibles con POSIX utilizan enlaces simbólicos rápidos. Sin embargo, el estándar POSIX no exige que se implemente todo el conjunto de información de estado de archivo común a los archivos normales para los enlaces simbólicos. Esto permite que las implementaciones utilicen otras soluciones, como almacenar datos de enlaces simbólicos en entradas de directorio.
Los permisos del sistema de archivos de un enlace simbólico no se utilizan; los modos de acceso del archivo de destino se controlan mediante los propios permisos del archivo de destino. Algunos sistemas operativos, como FreeBSD, ofrecen la posibilidad de modificar los permisos de archivo y los atributos del sistema de archivos de un enlace simbólico, mediante llamadas al sistema lchmod
[12] y lchflags
[13] respectivamente.
El tamaño informado de un enlace simbólico es la cantidad de caracteres en la ruta a la que apunta.
Un sistema de archivos Unix tradicional tiene una estructura de árbol, [14] sin embargo los enlaces simbólicos le permiten contener bucles. [5]
NTFS 3.1 introdujo soporte para enlaces simbólicos para cualquier tipo de archivo. Se incluyó con Windows XP , pero solo se habilitó de forma predeterminada para aplicaciones en modo kernel. Windows Vista y versiones posteriores de Windows habilitaron el soporte para enlaces simbólicos a aplicaciones en modo usuario. El mklink
comando interno del Símbolo del sistema de Windows puede crear enlaces simbólicos. Se requieren controladores de terceros para habilitar el soporte para enlaces simbólicos NTFS en Windows XP. [15] A diferencia de los puntos de unión , un enlace simbólico también puede apuntar a un archivo o una ruta de red del Bloque de mensajes del servidor (SMB) remoto. Además, la implementación del enlace simbólico NTFS proporciona soporte completo para enlaces entre sistemas de archivos. Sin embargo, la funcionalidad que habilita los enlaces simbólicos entre hosts requiere que el sistema remoto también los admita.
Los enlaces simbólicos están diseñados para ayudar en la migración y la compatibilidad de aplicaciones con sistemas operativos POSIX . Microsoft pretendía que los enlaces simbólicos de Windows Vista "funcionaran igual que los enlaces UNIX". [16] Sin embargo, la implementación difiere de los enlaces simbólicos de Unix en varias formas. Por ejemplo, los usuarios de Windows Vista deben indicar manualmente al crear un enlace simbólico si se trata de un archivo o un directorio. [17] Windows 7 y Vista admiten un máximo de 31 puntos de análisis (y por lo tanto enlaces simbólicos) para una ruta determinada (es decir, cualquier ruta determinada puede tener como máximo 31 indirecciones antes de que Windows se dé por vencido). [18] Solo los usuarios con el nuevo privilegio Crear enlace simbólico , que solo los administradores tienen de forma predeterminada, pueden crear enlaces simbólicos. [19] Si este no es el comportamiento deseado, debe cambiarse en la consola de administración de la Política de seguridad local. Además, los enlaces simbólicos NTFS a archivos son distintos de los enlaces simbólicos NTFS a directorios y, por lo tanto, no se pueden usar indistintamente, a diferencia de POSIX, donde el mismo enlace simbólico puede referirse a archivos o directorios.
En Windows Vista y versiones posteriores, cuando la ruta del directorio de trabajo termina con un enlace simbólico, la referencia de la ruta principal actual, ..
, hará referencia al directorio principal del enlace simbólico en lugar de al de su destino. Este comportamiento también se encuentra en el nivel de shell en al menos algunos sistemas POSIX, incluido Linux , pero nunca en el acceso a archivos y directorios a través de llamadas del sistema operativo. Por ejemplo, los comandos integrados de bash pwd
y cd
operan en el directorio lógico actual. pwd
se utiliza a menudo en scripts para determinar el directorio de trabajo actual real. Cuando se utiliza cualquier ruta con una llamada del sistema, cualquier uso de ..
utilizará el sistema de archivos principal real del directorio que contiene la ..
entrada del pseudodirectorio. Por lo tanto, cd ..; cat something
y cat ../something
pueden devolver resultados completamente diferentes.
Los siguientes ejemplos crean un enlace simbólico llamado "Descargas" en "E:\" que apunta a la carpeta Descargas en el perfil del usuario actual.
mklink
es un comando interno.mklink /D E:\Downloads %UserProfile%\Downloads
New-Item -Path 'E:\Downloads' -ItemType 'SymbolicLink' -Value "$Env:UserProfile\Downloads"
La versión de Windows 2000 de NTFS introdujo puntos de análisis , que permitieron, entre otras cosas, el uso de puntos de montaje de volumen y puntos de unión. Los puntos de unión son solo para directorios y, además, solo para directorios locales; los puntos de unión a recursos compartidos remotos no son compatibles. [20] Los kits de recursos de Windows 2000 y XP incluyen un programa llamado linkd para crear puntos de unión; Mark Russinovich de Sysinternals distribuyó uno más potente llamado Junction .
No todas las aplicaciones estándar admiten puntos de análisis. El problema más evidente es que Backup presenta este problema y emite un mensaje de error 0x80070003 [21] cuando las carpetas que se van a respaldar contienen un punto de análisis.
Los accesos directos , que son compatibles con los exploradores de archivos gráficos de algunos sistemas operativos, pueden parecerse a enlaces simbólicos, pero difieren en varios aspectos importantes. Una diferencia es qué tipo de software puede seguirlos:
Los mecanismos también tienen diferentes capacidades:
Casi como accesos directos, pero transparentes para el shell de Windows. [24] Se implementan como carpetas comunes (que deben tener el atributo de solo lectura y/o del sistema [25] ) que contienen un acceso directo llamado target.lnk que hace referencia al destino y un desktop.ini (oculto) con (al menos) el siguiente contenido:
[.ShellClassInfo] CLSID2 = {0AFACED1-E828-11D1-9187-B532F1E9575D}
Los accesos directos a carpetas se crean y utilizan desde el shell de Windows en el entorno de red , por ejemplo.
Los objetos de shell [26] o carpetas de shell se definen en el registro de Windows y también se pueden utilizar para implementar una especie de enlace simbólico. Al igual que los accesos directos a carpetas, son transparentes para el shell de Windows.
Una implementación mínima es (el CLSID {00000000-0000-0000-0000-000000000000} se usa como marcador de posición):
[ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}] @ = "nombre para mostrar" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\DefaultIcon] @ = "..." ; ruta al icono [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\InProcServer32] @ = "%SystemRoot%\\System32\\ShDocVw.Dll" "ThreadingModel" = "Apartamento" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\Instance] "CLSID" = "{0AFACED1-E828-11D1-9187-B532F1E9575D}" [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\Instance\InitPropertyBag] "Attributes" = hex : 15,00,00,00 "Target" = "..."; absoluto (SIN "TargetKnownFolder" o "TargetSpecialFolder" solamente) ; o ruta relativa al destino "TargetKnownFolder" = "{guidguid-guid-guid-guid-guidguidguid}"; GUID de la carpeta de destino, Windows Vista y versiones posteriores "TargetSpecialFolder" = "0x00xy"; CSIDL del destino [ HKEY_CLASSES_ROOT \CLSID\{00000000-0000-0000-0000-000000000000}\ShellFolder] "Atributos" = hexadecimal : 00,00,00,00
La carpeta Mis documentos en el Escritorio, así como las carpetas Fuentes y Herramientas administrativas en el Panel de control son ejemplos de objetos de shell redirigidos a carpetas del sistema de archivos.
Cygwin simula enlaces simbólicos compatibles con POSIX en el sistema de archivos de Microsoft Windows. Utiliza interfaces de programación y utilidades de usuario idénticas a las de Unix (ver arriba), pero crea accesos directos de Windows (archivos .lnk) con información adicional que utiliza Cygwin en el momento de la resolución del enlace simbólico. Los enlaces simbólicos de Cygwin cumplen con el estándar POSIX en cuanto a su resolución y con los estándares de Windows en cuanto a su representación en el disco.
Además, Cygwin se puede configurar para admitir enlaces simbólicos nativos de Windows que se pueden usar fuera de Cygwin sin restricciones. [27] Esto requiere:
Sin embargo, existen algunas diferencias. Cygwin no tiene forma de especificar información relacionada con los accesos directos (como el directorio de trabajo o el icono), ya que no hay lugar para dichos parámetros en ln -s
el comando. Para crear archivos .lnk estándar de Microsoft, Cygwin proporciona las utilidades mkshortcut
y . [28]readshortcut
La Guía del usuario de Cygwin tiene más información sobre este tema. [27] MSYS2 , que se basa en Cygwin, tiene un conjunto similar de configuraciones de winsymlinks pero por defecto copia los archivos. [29]
Implementaciones de características similares a los enlaces simbólicos.
Tanto el sistema de tiempo compartido compatible con el MIT de 1963 como el sistema de tiempo compartido incompatible tienen archivos vinculados en los que el nombre del archivo de destino se especifica en una entrada de directorio. [2] [3] [4]
El comando que crea enlaces simbólicos es makelink
, que también se utiliza para enlaces duros. Internamente, dos.library devuelve un código de error que indica que un destino es un enlace blando si intenta realizar acciones en él que solo son legales para un archivo, y las aplicaciones que desean seguir el enlace simbólico deben realizar una llamada explícita para seguir el enlace y volver a intentar la operación. El shell de AmigaDOS seguirá los enlaces automáticamente.
En Mac OS, las aplicaciones o los usuarios también pueden utilizar alias , que tienen la característica adicional de seguir al objetivo, incluso si se mueve a otra ubicación en el mismo volumen. Esto no debe confundirse con el comando de shell alias .
En el sistema operativo OS/2 , los enlaces simbólicos se parecen un poco a las sombras en el Workplace Shell gráfico . Sin embargo, las sombras, debido al Modelo de Objetos del Sistema totalmente orientado a objetos, son considerablemente más potentes y robustas que un enlace simple. Por ejemplo, las sombras no pierden sus capacidades cuando se les cambia el nombre o cuando se reubica el objeto o el sujeto del enlace. [31]
Los enlaces simbólicos se pueden implementar de manera variable o dependiente del contexto, de modo que el enlace apunte a distintos objetivos según un parámetro de configuración, un parámetro de tiempo de ejecución u otra condición instantánea.
Un enlace simbólico variable o variante es un enlace simbólico que tiene un nombre de variable incorporado. Esto permite cierta flexibilidad en el orden del sistema de archivos que no es posible con un enlace simbólico estándar. Las variables incorporadas en un enlace simbólico pueden incluir información específica del usuario y del entorno.
Los sistemas operativos que utilizan enlaces simbólicos variantes incluyen NetBSD , DragonFly BSD y Domain/OS . [32] [33] [5] Tru64 utiliza un enlace simbólico dependiente del contexto donde el contexto es el número de miembro del clúster.
El sistema operativo OSx de Pyramid Technology implementó enlaces simbólicos condicionales que apuntaban a diferentes ubicaciones según el universo en el que se ejecutaba un programa. Los universos admitidos eran SysV.3 de AT&T y Berkeley Software Distribution (BSD 4.3). Por ejemplo: si el comando ps se ejecutaba en el universo att , entonces el enlace simbólico para el directorio /bin apuntaría a /.attbin y se ejecutaría el programa /.attbin/ps . Mientras que si el comando ps se ejecutaba en el universo ucb , entonces /bin apuntaría a /.ucbbin y se ejecutaría /.ucbbin/ps . También se crearon enlaces simbólicos condicionales similares para otros directorios como /lib , /usr/lib , /usr/include . [34]
A medida que CTSS se desarrolló, proporcionamos formas para que los usuarios compartieran sus archivos en el disco, a través de "archivos comunes" y "enlaces".
Entradas UFD que apuntan a otras entradas UFD en lugar de al archivo en sí
Enlace: El formato es similar a Copiar. El archivo especificado no se copia
También incluye algunas otras características que pueden resultarle útiles, como
enlaces simbólicos
y un esquema de grupo mejorado.