Desreferencia de enlaces duros

22

En la página de tarcomando manual , se enumera una opción para seguir los enlaces duros.

-h, --dereference
      follow symlinks; archive and dump the files they point to

--hard-dereference
      follow hard links; archive and dump the files they refer to

¿Cómo tarsabe que un archivo es un enlace duro? ¿Cómo lo sigue ?

¿Qué pasa si no elijo esta opción? ¿Cómo lo hace no difíciles de eliminar la referencia?

musa
fuente

Respuestas:

24

De manera predeterminada, si le indica tarque archive un archivo con enlaces duros, y más de uno de esos enlaces se incluye entre los archivos a archivar, archiva el archivo solo una vez y registra el segundo (y cualquier nombre adicional) como enlaces duros. Esto significa que cuando extrae ese archivo, se restaurarán los enlaces duros.

Si utiliza la --hard-dereferenceopción, entonces tarno no preservar los enlaces duros. En cambio, los trata como archivos independientes que simplemente tienen los mismos contenidos y metadatos. Cuando extraiga el archivo, los archivos serán independientes.

Nota: Reconoce los enlaces duros al verificar primero el recuento de enlaces del archivo. Registra el número de dispositivo y el inodo de cada archivo con más de un enlace, y lo usa para detectar cuándo se archiva el mismo archivo nuevamente. (Cuando lo usa --hard-dereference, no hace esto).

cjm
fuente
7

Puede distinguir un archivo con enlace (s) rígido (s) de un archivo no enlazado con el "conteo de enlaces". Veo dos formas de obtener esto desde la línea de comando:

% stat original
  File: ‘original’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 932815      Links: 2
Access: (0644/-rw-r--r--)  Uid: (  500/ bediger)   Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
 Birth: -

O

1010 % ls -li 
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary

Ese solitario '2' antes de "bediger" es el recuento de enlaces. Tenga en cuenta que ambos nombres de archivo tienen el mismo número de inodo, 932815.

Estoy seguro de que ambos comandos obtienen el recuento de enlaces del campo st_nlink de struct stat, que se completa con una stat()llamada al sistema.

Por lo que puedo decir, ejecutar tarcon --hard-dereferencesignifica que en lugar de obtener un solo archivo con dos nombres de archivo distintos (como en el ejemplo anterior), obtienes dos archivos, cada uno con un solo nombre de archivo. tarprobablemente verifica el recuento de enlaces en cada archivo y, de manera predeterminada, cuando extrae, crea un enlace duro en el segundo nombre de archivo que tiene para los datos del archivo enlazado. Cuando se llama con la --hard-dereferencecreación del archivo, parece crear un archivo completamente nuevo para el segundo nombre de archivo cuando se tarejecuta la invocación de extracción .

Bruce Ediger
fuente
Ahora entiendo que 'seguir enlaces duros' es una redacción incorrecta. Gracias. Pero, ¿qué pasa si uno de los dos archivos idénticos no está archivado? El recuento de enlaces es engañoso en tales casos.
musa
2
No son "dos archivos idénticos", es un archivo con dos nombres. No importa qué archivo tar no se archive, ya que son idénticos. De forma predeterminada, tar probablemente simplemente mantiene algún tipo de "puntero" del segundo nombre de archivo al primero de todos modos, al igual que el sistema de archivos.
Bruce Ediger