En artículos anteriores, discutí cómo crear y eliminar archivos y directorios y cómo copiarlos, moverlos y renombrarlos. Estas son las tareas diarias de un administrador de sistemas, y saber cómo hacerlas lo acercará un paso más a convertirse en un profesional de Linux empresarial que comprende los conceptos detrás de cada operación del sistema. Esto le da una ventaja a la hora de desarrollar tareas operativas eficientes. Continuando con esta idea, este artículo analiza los enlaces duros en Linux a modo de ejemplo. Mi próximo artículo describe cómo crear enlaces simbólicos (suaves).
[ Keep your most commonly used commands handy with the Linux commands cheat sheet. ]
¿Qué son los enlaces duros y cómo los usan los administradores del sistema? Antes de presentar los enlaces, proporcionaré algunos conceptos básicos sobre su uso.
Tabla de Contenidos
Más información sobre los inodos
Mi amigo Tyler Carrigan escribió un excelente trabajo sobre la indexación de anotaciones (inodos) que ampliará su comprensión de lo que estoy cubriendo aquí. Comprender los inodos es importante debido a la naturaleza inherente de los enlaces de archivos y directorios en el sistema de archivos de Linux.
Un inodo es una estructura de datos que describe un objeto del sistema de archivos (como un archivo o directorio) y almacena todos los metadatos relacionados con el archivo o directorio (como marcas de tiempo, asignaciones de bloques o atributos extendidos).puedes documentación del núcleoCada inodo tiene su propia dirección en el sistema. Al manipular enlaces duros y blandos, también se procesan los inodos de los archivos y directorios originales.
Considere la siguiente información de mi disco único de máquina virtual (VM):
$ sudo fdisk -l | head -10
Disk /dev/vda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7a1c2d8b
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 2099199 2097152 1G 83 Linux
/dev/vda2 2099200 41943039 39843840 19G 8e Linux LVM
El tamaño del disco de mi máquina virtual es de 20 GiB. Este espacio libre se divide en 41.943.040 sectores de 512B cada uno, con un tamaño de bloque de disco de 4KiB. Esto significa que cada archivo que creo, ya sea más pequeño o más grande que 4KiB, consume al menos ocho sectores por cada tamaño de bloque de disco de 4KiB correspondiente que consume mi archivo. La dirección de sector utilizada por el archivo será indexada y referenciada por la dirección de inodo correspondiente que el archivo recibe del sistema de archivos. Esto facilita la búsqueda de archivos y sus metadatos en mi sistema.
[ Learn how to manage your Linux environment for success. ]
Lo demostraré creando un directorio simple y mostrando su información de inodo y tamaño:
$ mkdir dir
$ ls -li
total 0
25606589 drwxrwxr-x. 2 localuser localuser 6 set 19 15:21 dir
$ stat dir
File: dir
Size: 6 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 25606589 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:21:27.616000000 -0300
Modify: 2022-09-19 15:21:27.616000000 -0300
Change: 2022-09-19 15:21:27.616000000 -0300
Birth: 2022-09-19 15:21:27.616000000 -0300
usar ls
comando con -i
Opción para mostrar información de inodo.Arriba, puede ver la dirección de inodo dada dir
El directorio es 25606589.Puedo confirmar y verificar otra información de metadatos stat
Ordenar. Crearé un archivo en este directorio y verificaré la información:
$ touch dir/file
$ stat dir
File: dir
Size: 18 Blocks: 0 IO Block: 4096 directory
Device: fd00h/64768d Inode: 25606589 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:29:37.495000000 -0300
Modify: 2022-09-19 15:29:40.276000000 -0300
Change: 2022-09-19 15:29:40.276000000 -0300
Birth: 2022-09-19 15:21:27.616000000 -0300
$ ls -li dir/file
25606591 -rw-rw-r--. 1 localuser localuser 0 set 19 15:29 dir/file
$ stat dir/file
File: dir/file
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 25606591 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:29:40.276000000 -0300
Modify: 2022-09-19 15:29:40.276000000 -0300
Change: 2022-09-19 15:29:40.276000000 -0300
Birth: 2022-09-19 15:29:40.276000000 -0300
El archivo tiene su propia dirección de inodo 25606591. Tiene un tamaño de 0 porque aún no tiene contenido. Agregaré un byte de datos y veré qué sucede:
$ echo 1 > dir/file
$ stat dir/file
File: dir/file
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 25606591 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:29:40.276000000 -0300
Modify: 2022-09-19 15:36:18.812000000 -0300
Change: 2022-09-19 15:36:18.812000000 -0300
Birth: 2022-09-19 15:29:40.276000000 -0300
El archivo ahora ocupa 8 sectores, aunque solo agregué 1B de datos. Eso es porque estoy usando el tamaño de disco de bloque predeterminado de 4KiB y el tamaño de sector de 512B. Pero la dirección de inodo sigue siendo la misma, lo cual es importante porque, independientemente del tamaño del archivo, siempre se hace referencia a ella por su dirección de inodo, no por cada sector individual que consume.
Además, si copio este archivo, la copia tendrá su propia dirección de inodo y consumirá ocho sectores adicionales:
$ cp dir/file dir/copy
$ stat dir/file
File: dir/file
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 25606591 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:42:17.328000000 -0300
Modify: 2022-09-19 15:36:18.812000000 -0300
Change: 2022-09-19 15:36:18.812000000 -0300
Birth: 2022-09-19 15:29:40.276000000 -0300
$ stat dir/copy
File: dir/copy
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 25811328 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:42:17.328000000 -0300
Modify: 2022-09-19 15:42:17.328000000 -0300
Change: 2022-09-19 15:42:17.328000000 -0300
Birth: 2022-09-19 15:42:17.328000000 -0300
Ahora que comprende el concepto, ¿qué sucede si solo desea hacer referencia a un archivo con un nombre diferente o una ubicación diferente sin cambiar la dirección de inodo original o cualquier otra información de metadatos? ¿O tal vez desea cambiar la dirección del inodo, pero desea acceder a la misma información que proporcionó el archivo o directorio original?
¡Aquí es donde entra en juego la función de creación de enlaces! Hay dos formas diferentes de crear un enlace a un archivo o directorio en el sistema: enlace duro y enlace simbólico. Este artículo cubre los enlaces duros.
Crear enlaces duros
Cuando crea un vínculo físico, está creando otro archivo (con un nombre diferente) que apunta exactamente a los mismos datos que el original. Esto significa que actúa como el archivo original y no puede notar la diferencia entre el nuevo vínculo físico y el nombre original del archivo.
Es básicamente una copia reflejada del archivo original. Todos tienen el mismo contenido, permisos y dirección de inodo. Tenga en cuenta que cualquier cambio realizado en un archivo afectará al otro de la misma manera, con la excepción de las eliminaciones, que no afectan a los datos originales. Cuando elimina el archivo original y al menos un enlace duro está activo, aún puede acceder a los datos originales hasta que se eliminen todos los enlaces duros.
Sin embargo, los enlaces duros tienen limitaciones. No puede crear vínculos físicos a directorios ni crear vínculos físicos en un sistema de archivos diferente al del archivo original.
[ Get the guide to installing applications on Linux. ]
Este ln
Comando para crear un enlace.usar -h
opción para ver sus parámetros disponibles.
Para crear un enlace duro, escriba ln {source} {target}
como esto:
$ ls /tmp/
$ ln dir/file /tmp/hard
$ ls -l /tmp/
total 4
-rw-rw-r--. 2 localuser localuser 2 set 19 15:36 hard
Para probar que el enlace físico es un espejo del archivo original, verifique su información de metadatos, contenido y dirección de inodo:
$ ls -i dir/file
25606591 dir/file
$ ls -i /tmp/hard
25606591 /tmp/hard
$ stat dir/file
File: dir/file
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 25606591 Links: 2
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:42:17.328000000 -0300
Modify: 2022-09-19 15:36:18.812000000 -0300
Change: 2022-09-19 16:49:20.216000000 -0300
Birth: 2022-09-19 15:29:40.276000000 -0300
$ stat /tmp/hard
File: /tmp/hard
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 25606591 Links: 2
Access: (0664/-rw-rw-r--) Uid: ( 1000/localuser) Gid: ( 1000/localuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-19 15:42:17.328000000 -0300
Modify: 2022-09-19 15:36:18.812000000 -0300
Change: 2022-09-19 16:49:20.216000000 -0300
Birth: 2022-09-19 15:29:40.276000000 -0300
Ambos resultados tienen la misma información. Agregar cualquier dato al enlace duro también cambia el archivo original:
$ cat dir/file
1
$ cat /tmp/hard
1
$ echo 0 > /tmp/hard
$ cat /tmp/hard
0
$ cat dir/file
0
Si elimina el archivo original, el enlace duro mantendrá los datos originales y podrá seguir usándolo:
$ rm dir/file
$ ls dir/
$ cat /tmp/hard
0
Lo mismo sucede si elimina el enlace duro y conserva el archivo original.
envolver
En algunos casos es mejor usar enlaces duros en lugar de copiar los datos originales, lo que duplica el contenido en el sistema y consume sectores. Lea mi artículo de seguimiento para saber cómo funcionan los enlaces simbólicos y cómo se comparan con los enlaces físicos.
[ Cheat sheet: Get a list of Linux utilities and commands for managing servers and networks. ]