Explicación detallada del principio de eliminación de archivos en Linux

1. Principio de lectura de archivos.

En primer lugar, debemos saber que en el sistema Linux, un archivo se identifica de forma única por el número de inodo. En otras palabras, el proceso de eliminar un archivo es en realidad el proceso de liberar el número de inodo.

Accedemos al contenido de un archivo a través del nombre del archivo ¿Cuál es el proceso por el que el sistema operativo accede al contenido de un archivo?

Aquí es necesario introducir un concepto del sistema de archivos, que se denomina "entrada de directorio". Las entradas del directorio contienen registros que mapean la relación entre los nombres de archivos y los números de inodo. Por lo tanto, el sistema operativo puede encontrar el nodo de inodo correspondiente de acuerdo con el nombre del archivo en la entrada del directorio, luego encontrar la dirección del bloque del archivo guardado en la estructura del inodo y luego leer los datos del bloque de archivos.

2. Principio de eliminación de archivos

Vayamos al grano, ¿cuándo se publicará el número de inodo del archivo en Linux?

¡Por supuesto, el número de inodo se libera cuando no se utiliza! Entonces, ¿cuándo se hará referencia al inodo?

1. Enlace físico del archivo

¿Qué es un vínculo físico? Si un nuevo nombre de archivo apunta al inodo del archivo original, entonces los dos nombres de archivo están vinculados entre sí y apuntan al mismo archivo, pero los nombres de archivo son diferentes. Entonces, cuando señalamos la operación rm, en realidad es solo una conexión eliminada.

2. Referencia del documento

Cuando el programa se está ejecutando, es posible que necesite leer los datos del archivo, por lo que en realidad encuentra el inodo a través del nombre del archivo y luego encuentra la ubicación del bloque de datos para leer los datos.

Entonces, siempre que el número de conexión física del inodo sea 0 y ningún programa haga referencia a este archivo, el inodo se liberará.

De hecho, en la estructura del inodo, se definen dos variables para registrar el número de referencias actuales al archivo y el número de conexiones duras. El número de inodo se liberará cuando ambos sean 0.

struct inode {
........
unsigned long    i_ino;   //inode编号
atomic_t         i_count; //程序引用文件数 
unsigned int     i_nlink; //硬链接数目
........
}

En este momento, puede encontrar que el espacio en disco ha aumentado y el espacio en disco ocupado por los archivos eliminados se ha liberado. Entonces, ¿se borraron los datos del archivo del disco?

De hecho, no lo es: el sistema Linux adopta el principio de "cobertura infinita". Cuando se libera el nodo de inodo, el sistema operativo marcará estos bloques de datos como disponibles (también puede usar el comando du para verificar que el disco esté liberado). Después de escribir nuevos datos en estos bloques de datos, los datos originales en el disco se sobrescribirá y desaparecerá. Imagínese, si no hacemos esto y eliminamos un archivo grande, será necesario borrar los bloques del disco, lo que llevará mucho tiempo.

3. ¿Qué hacer si rm borra archivos accidentalmente?

Si rm elimina accidentalmente un archivo, no se impaciente y trátelo con calma. Si el programa hace referencia al archivo, podemos restaurarlo nosotros mismos; si el programa no hace referencia al archivo, también debemos tomar las medidas correspondientes para minimizar la pérdida.

Utilice el comando lsof para ver los archivos y números de proceso que se han eliminado pero a los que el programa hace referencia:

lsof | grep '(deleted)'

Si no ve los archivos eliminados aquí, significa que el inodo ha sido liberado. Solo puede detener la operación de escritura en el disco inmediatamente y utilizar herramientas o empresas profesionales de recuperación de datos para recuperar los datos.

Si ve archivos eliminados aquí, si /root/a.sh fue eliminado por rm pero el programa aún hace referencia a él, vaya al directorio /proc/32372/fd/ y use el comando ls para verificar qué archivo fd apunta al Original archivo

Puedes ver que es el archivo original al que apunta 255. Solo necesitamos copiarlo usando el comando cp.

cp /proc/32372/fd/255 /root/a.sh

¡OK, recuperación completada!

Todas estas son opiniones personales, corríjanme si me equivoco.

Supongo que te gusta

Origin blog.csdn.net/qq_54381110/article/details/132889177
Recomendado
Clasificación