Tutoriales

Fundamentos del administrador del sistema: creación de enlaces físicos en Linux

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.

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. ]

LEER  Cómo convertir páginas Man a HTML en Linux y Unix

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba