¿Cómo desvincular (eliminar) el enlace especial "." Creado para una carpeta?

29

En Linux, cuando crea una carpeta, crea automáticamente dos enlaces duros al inodo correspondiente. Una que es la carpeta que solicitó crear, la otra es la .carpeta especial de esta carpeta.

Ejemplo:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

Como puede ver, ambos foldery .dentro foldertienen el mismo número de inodo (se muestra con la -iopción).

¿Hay alguna forma de eliminar este .enlace especial ?

Es solo por experimentación y curiosidad. También supongo que la respuesta podría aplicarse también a ..un archivo especial.

Traté de mirar al rmhombre pero no pude encontrar ninguna manera de hacerlo. Cuando intento eliminar .todo lo que obtengo es:

rm: "." y ".." no puede eliminarse

Tengo mucha curiosidad sobre la forma en que funcionan estas cosas, así que no te abstengas de ser muy detallado sobre el tema.

EDITAR: Tal vez no estaba claro con mi publicación, pero quiero entender el mecanismo subyacente responsable de los .archivos y las razones por las que no se pueden eliminar.

Sé que el estándar POSIX no permite una carpeta con menos de 2 enlaces duros, pero realmente no entiendo por qué. Quiero saber si podría ser posible hacerlo de todos modos.

Fantattitude
fuente
11
Posible duplicado de ¿Por qué no puedo eliminar el '.' ¿directorio?
Stephen Kitt
@StephenKitt Por favor, vea mi edición.
Fantattitude
1
He retractado mi voto, veamos cómo se desarrolla la votación ...
Stephen Kitt
2
Ambos son necesarios para caminos relativos. ¿por qué querrías eliminarlos (aparte de la simple curiosidad)?
HalosGhost
@HalosGhost Estoy siendo muy curioso jaja, explorando las limitaciones del sistema y cómo y por qué fue diseñado de esta manera.
Fantattitude

Respuestas:

46

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

debugfs -w test.img
cd test
unlink .

debugfsno se queja y borra debidamente la .entrada del directorio en el sistema de archivos. El testdirectorio todavía es utilizable, con una sorpresa:

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

muestra solo

..

así que .realmente se fue. Sin embargo cd ., ls ., pwdtodavía se comportan como de costumbre!

Me había hecho previamente esta prueba utilizando rmdir ., pero que elimina i-nodo del directorio ( enormes gracias a BowlOfRed para señalar esto ), lo que deja testuna entrada de directorio colgando y es la verdadera razón de los problemas encontrados. En este escenario, la testcarpeta queda inutilizable; después de montar la imagen, la ejecución lsproduce

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

Al ejecutarse e2fscken esta situación en la imagen, se elimina el testdirectorio por completo (el inodo del directorio desaparece, por lo que no hay nada que restaurar).

Todo esto muestra 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 núcleo que espera .y ..existe, y advierte si no lo hacen (ver namei.c), pero con la unlink .prueba basada en no vi esa advertencia. e2fsckno le gusta la .entrada del directorio que falta y se ofrece a solucionarlo:

$ /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 la .entrada del directorio.

Stephen Kitt
fuente
¡Muy interesante! ¡Gracias! Por lo tanto, la .carpeta realmente existe dentro del FS y las herramientas esperan que funcione correctamente.
Fantattitude
Muy amable de su parte, no conozco Linux y su FS lo suficiente como para encontrar este tipo de información yo mismo, así que estoy muy agradecido de que se tome el tiempo para responderme :)
Fantattitude
3
¿Puede intentar cambiar "rmdir" (que en realidad elimina el inodo) a "desvincular" (que solo elimina la entrada del directorio)? Parece dejar un directorio que funciona principalmente (sin errores mounto ls). No he visto si surgen otros problemas.
BowlOfRed
@BowlOfRed muchas gracias, ese es un muy buen punto, por rmdir .lo que realmente estaba destruyendo testy dejando eso como una entrada de directorio colgante, lo que esperarías causar problemas. ¡Consultaré unlinky actualizaré mi respuesta!
Stephen Kitt
1
@GiacomoCatenazzi no directamente, los permisos y la propiedad se almacenan en el inodo, no en la entrada del directorio.
Stephen Kitt
5

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

John
fuente
Sé sobre eso, solo tengo curiosidad si es posible ya que parecen ser enlaces duros. Si no lo son, ¿por qué se sumarían al recuento de enlaces duros del inodo?
Fantattitude
3
> En realidad no son enlaces duros, así es como se crea / representa la estructura de directorios. Además, duplicar. unix.stackexchange.com/questions/289385/…
Xalorous
@Xalorous ¿Y qué representa exactamente estos archivos especiales, si no son enlaces duros, qué son? Existen, por lo que deben estar en algún lugar, excepto si solo se muestran lsu otras herramientas automáticamente, lo que no me parece realista.
Fantattitude
@Fantattitude son la forma en que la carpeta se representa a sí misma para implementar el requisito POSIX de que rmdir no pueda eliminar el PWD.
Xalorous
1
En los sistemas de archivos tradicionales de Unix son enlaces duros reales. El conductor los sintetiza sobre la marcha para otros sistemas de archivos.
Barmar
2

Como se describe en las Notas de Lion sobre el código fuente de Unix 6Unix temprano tenía un archivo de disco donde ambos archivos y directorios estaban representados en el disco por estructuras de inodo. 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 a un archivo saber en qué directorio estaba. La excepción era el directorio '/' que era el propietario. También había un enlace a los contenidos. Si un inodo no tenía contenido, podría ser devuelto a la lista libre. Dado que un directorio era solo un archivo bendecido, incluso un directorio vacío tenía que tener contenido para evitar que se recolectara basura. Así, el .. era el enlace del inodo al inodo padre y al. estaba allí para indicar que el directorio todavía era utilizable. rmdir (llamando a unlink) podría eliminar el.

verisimilidude
fuente
0

Como dice la respuesta 'posible duplicado de' post ', el estándar POSIX especifica que si rmdir intenta eliminar el directorio actual, fallará.

Con todo lo que construyas tienes que tener una base. Es difícil definir rutas relativas sin una forma de decir 'aquí'. Entonces el '.' se define como 'aquí'.

Además, puede eliminar 'punto' y 'punto punto'. Escriba su propio sistema operativo que no los defina. Aunque Unix (y, por extensión, Mac OSX), Linux e incluso MS DOS y Windows usan dot y dotdot.

TL; DR - 'punto' está en la definición del sistema operativo.

Xalorous
fuente
Esta respuesta es buena principalmente para el TL; DR.
Joshua