GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo desvincular (eliminar) el enlace duro especial. creado para una carpeta?

Es técnicamente posible eliminar . , al menos en sistemas de archivos EXT4. Si crea una imagen de sistema de archivos en test.img , móntelo y cree un test carpeta, luego desmóntelo nuevamente, puede editarlo usando debugfs :

debugfs -w test.img
cd test
unlink .

debugfs no se queja y borra obedientemente el . entrada de directorio en el sistema de archivos. El test El directorio todavía se puede usar, con una sorpresa:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

muestra solo

..

entonces . realmente se ha ido. Sin embargo, cd . , ls . , pwd ¡Sigue comportándote como siempre!

Previamente había hecho esta prueba usando rmdir . , pero eso elimina el inodo del directorio (enorme gracias a BowlOfRed por señalar esto), lo que deja test una entrada de directorio colgante y es la verdadera razón de los problemas encontrados. En este escenario, el test entonces la carpeta se vuelve inutilizable; después de montar la imagen, ejecuta ls produce

ls: cannot access '/mnt/test': Structure needs cleaning

y el registro del kernel muestra

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

Ejecutando e2fsck en esta situación en la imagen borra el test directorio por completo (el inodo del directorio se ha ido, por lo que no hay nada que restaurar).

Todo esto demuestra que . existe como una entidad específica en el sistema de archivos EXT4. Me dio la impresión del código del sistema de archivos en el kernel que espera . y .. existir, y advierte si no lo hacen (ver namei.c ), pero con el unlink . -basado en la prueba No vi esa advertencia. e2fsck no le gusta el . faltante entrada de directorio y ofrece arreglarlo:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

Esto vuelve a crear el . entrada de directorio.


No hay forma de eliminar esta entrada de directorio. El . entrada significa "este directorio", el .. entrada significa "directorio principal de este directorio". En realidad, no son enlaces duros, así es como se crea/representa la estructura del directorio.


Como se describe en Notas de Lion sobre el código fuente de Unix 6 Los primeros Unix tenían un archivo de disco donde tanto los archivos como los directorios estaban representados en el disco por estructuras de inodos. Había un bit especial que indicaba que el contenido del archivo era un directorio. Cada inodo tenía un enlace a su inodo propietario que permitía que un archivo supiera en qué directorio estaba. La excepción era el directorio '/' que se poseía a sí mismo. También había un enlace a los contenidos. Si un inodo no tuviera contenido, podría devolverse a la lista libre. Dado que un directorio era solo un archivo bendito, incluso un directorio vacío tenía que tener contenido para evitar que se recolectara como basura. Por lo tanto, el .. era el enlace del inodo al inodo principal y el . estaba allí para indicar que el directorio aún era utilizable. rmdir (llamando a unlink) podría eliminar el archivo . directorio si no hubiera otros contenidos y el inodo se movería a la lista libre cuando no hubiera más referencias a él.


Linux
  1. ¿Cómo hago para que find excluya la carpeta en la que busca?

  2. ¿Cómo desvincular todos los enlaces simbólicos del directorio?

  3. ¿Cómo puedo probar la memoria RAM para detectar daños en los datos en un sistema basado en ARM?

  4. ¿Cómo agrego el subdirectorio bin del primer directorio en GOPATH a PATH?

  5. ¿Cómo eliminar archivos ._ en un directorio? ubuntu

Cómo quitar (eliminar) un archivo o directorio en Linux

Cómo usar el comando cd de Linux para cambiar de directorio

Cómo eliminar un directorio en Linux

Cómo obtener el tamaño de un directorio en Linux

Cómo quitar (eliminar) directorio en Linux

Eliminar directorio en Linux:cómo eliminar una carpeta desde la línea de comandos