Enlaces simbólicos frente a enlaces físicos en Linux: lo que necesita saber
Conclusiones clave
- Los enlaces en Linux son como atajos: referencias a un archivo que no lo duplican.
- Un enlace simbólico hace referencia por nombre de archivo pero se rompe si su destino se mueve.
- Un enlace físico hace referencia al inodo de un archivo, que puede ser más robusto pero más difícil de entender.
En Linux, un enlace es como un acceso directo a un archivo, lo que le brinda un gran poder para decidir cómo organizar su sistema de archivos. Pero hay dos tipos de vínculo, y son muy diferentes.
¿Qué son los enlaces en Linux?
En Linux, un archivo tiene dos partes: su nombre y su contenido. Una estructura llamada "inodo" conecta un nombre de archivo con los datos que contiene. Este inodo también almacena metadatos sobre el archivo, como su propietario, permisos y fecha del último cambio.
Un nombre de archivo simplemente apunta o "enlaza" a esta estructura de inodo. Esto significa que más de un nombre de archivo puede hacer referencia a la misma estructura, es decir, al mismo archivo subyacente.
Crear un vínculo físico
El tipo de enlace predeterminado es un "enlace físico". Puede crear un vínculo físico a un archivo existente usando el comando ln de esta forma:
ln existing_file new_hard_link
Ahora tendrá dos nombres de archivos apuntando al mismo inodo. Es importante comprender que en realidad solo hay un archivo aquí, pero resulta que tiene dos nombres de archivo. Por lo tanto, puede utilizar cualquier nombre (o ruta) para hacer referencia al mismo archivo y todo permanecerá sincronizado.
Pruébelo y verá lo que está pasando. Comience copiando un archivo como lo haría normalmente, usando el comando cp:
echo "hello world" > foo
cp foo bar
ls -li
cat foo bar
Pasar la opción i a ls le indica que imprima el número de inodo de cada archivo al principio de la línea. Tenga en cuenta que el nuevo archivo tiene un inodo distinto, pero el mismo contenido que el original.
Ahora cree un enlace físico al archivo original y compárelo:
ln foo hum
ls -li
cat foo bar hum
Tenga en cuenta que el enlace físico tiene el mismo inodo que el archivo original: 43458473. Tanto foo como hum apuntan al mismo archivo subyacente. También tenga en cuenta el número en la tercera columna, justo a la derecha de los permisos. Para el archivo original (foo) y el enlace físico (hum), se lee "2", pero es "1" para la copia (barra). Este número representa el número total de enlaces físicos a ese archivo.
Al volver a dibujar el primer diagrama para representar el archivo original y su enlace físico se obtiene:
No existe ninguna diferencia significativa entre el archivo original y el enlace físico. De hecho, ambos son "enlaces" en el sentido de Linux, y es por eso que hay un comando de desvinculación que hace el mismo trabajo que rm para eliminar un archivo.
Al enumerar los números de inodo, puede confirmar que realmente solo hay un archivo real para los dos nombres de archivo. Si todavía tienes dudas, intenta cambiar el contenido de cualquiera de los archivos:
echo "some new contents" > hum
cat foo
Crear un enlace simbólico (suave)
Los enlaces simbólicos (enlaces simbólicos) también le permiten hacer referencia al mismo archivo en varias ubicaciones. La diferencia es que, mientras que los enlaces físicos hacen referencia a inodos, los enlaces suaves hacen referencia a otros archivos por nombre de archivo. Todavía usas el comando ln para crear un enlace simbólico, pero también pasas el indicador -s (simbólico):
ln -s existing_file new_soft_link
Un enlace simbólico es un archivo por derecho propio; tiene un inodo con su propio contenido. Pero el contenido de un enlace simbólico no es más que un nombre de archivo, una referencia a un archivo separado para el cual el enlace simbólico debería actuar como proxy. Los metadatos almacenados en el inodo del enlace simbólico lo marcan explícitamente como un enlace simbólico, por lo que cualquier programa que lo utilice sabrá que debe buscar el nombre de archivo al que apunta.
He aquí un ejemplo:
ln -s foo baz
cat baz
ls -li
Tenga en cuenta que esto se parece bastante al caso del enlace físico, pero el resultado de ls es bastante diferente. Primero, el enlace simbólico está marcado con una "l" (enlace) al comienzo de los permisos. Pero, lo que es aún más útil, el nombre del archivo del enlace simbólico está coloreado en rosa y va seguido de una flecha y el nombre del archivo original.
La relación entre el enlace simbólico y el archivo original es algo como esto:
Cuando creas un enlace simbólico, puedes elegir exactamente cómo hacer referencia al archivo al que apunta. El ejemplo anterior simplemente usa un nombre de archivo simple que es una referencia relativa a un archivo en el mismo directorio. Pero puedes usar cualquier ruta válida, relativa o absoluta, por ejemplo:
ln -s foo sub/dir/baz
ln -s foo ../../baz
ln -s foo /tmp/baz
Es posible que ya hayas detectado un error aquí: ¿qué pasa si el archivo original cambia de nombre o de ubicación? De hecho, ¿qué pasa si el archivo de enlace simbólico cambia de ubicación? Bueno, dependiendo del tipo de ruta que estés usando (relativa o absoluta) y dependiendo de si se mueven ambos archivos o solo uno, es posible que estés bien. Pero tendrás que tener cuidado.
¿Cuándo debería utilizar enlaces duros o blandos?
Un uso común de los enlaces simbólicos es administrar el software instalado. Por ejemplo, en mi sistema tengo vim (el editor de texto) y vi, el editor más antiguo a partir del cual evolucionó. Se instalan así:
Con esta configuración, cualquier script que use vi usará silenciosamente vim en su lugar.
Ambos tipos de enlaces son buenos para la gestión del sistema de archivos. Puede utilizar enlaces para organizar sus archivos y directorios, haciéndolos más accesibles sin desperdiciar espacio en disco. Por ejemplo:
# Create a hard link to the apache log file in home directory
~ $ ln /var/log/apache2/access_log apache-log
# Create a soft link to a deeply-nested directory
~ $ ln -s ./work/acme/2024/10 current-work
Los enlaces pueden resultar muy útiles como forma de cambiar entre diferentes archivos sin tener que modificarlos. Por ejemplo, imagine que tiene un archivo de configuración, conf, que utiliza algún software. Puede crear múltiples configuraciones, almacenarlas en archivos separados y luego alternar entre ellas usando enlaces:
# Create two config files
config $ mv conf dark.conf
config $ cp dark.conf light.conf
# Use the dark config
config $ ln -s dark.conf conf
# Switch to the light config. Note -f to force overwrite of existing link.
config $ ln -fs light.conf conf
Un vínculo suave funciona hasta que el archivo al que apunta se mueve o se le cambia el nombre, luego se convierte en un vínculo roto:
Por esta razón, los enlaces blandos suelen funcionar mejor en un ámbito limitado, cuando un archivo y su enlace están en el mismo directorio, por ejemplo.
Los enlaces físicos no sufren este problema; puedes moverlos de forma segura a cualquier lugar dentro del mismo sistema de archivos. Sin embargo, sufren de un problema diferente. Algunos editores (y otros programas que actúan sobre un archivo) crean una copia de un archivo y le cambian el nombre al guardarlo, con fines de copia de seguridad. Este comportamiento puede romper los enlaces físicos, lo que hace que no estén sincronizados y ocupen el doble de espacio en el disco. Debe verificar cuidadosamente los programas con los que edita enlaces físicos para asegurarse de que no hagan esto.
Si está enlazando a un directorio, un enlace suave es su única opción. Los enlaces físicos simplemente no tienen mucho sentido cuando se trata de directorios y crearían más problemas de los que resolverían. Los enlaces físicos tampoco se pueden almacenar en un repositorio de git.
En la línea de comando, un enlace físico es el predeterminado, pero las GUI, como Nautilus, por ejemplo, generalmente solo admiten enlaces suaves. Incluso entonces, tendrás que habilitar la opción a través de Preferencias:
El concepto de enlace suave es un poco más fácil de entender y, potencialmente, más seguro. Los enlaces blandos son más visibles, más populares y, en general, más fáciles de entender.
Cualquiera que sea el tipo de enlace que utilice, comprender el concepto puede requerir algo de tiempo y práctica. Pero los enlaces son muy poderosos y populares, por lo que sentirás sus beneficios. ¡Asegúrate de usar ls para realizar un seguimiento de los enlaces y trata de no exagerar!