Los entornos gráficos y de escritorio modernos proporcionan una carpeta de basura. Esta ubicación permite recuperar los archivos «eliminados» antes de un borrado irreversible. Cuando usa la terminal, el comando basura enviará archivos a la carpeta basura como área de preparación.Pero, ¿qué sucede cuando le dices a tu computadora Linux que elimine un archivo? rm
¿Ordenar? ¿Eliminará archivos?
[ Keep your most commonly used commands handy with the Linux commands cheat sheet. ]
Tabla de Contenidos
eliminación de archivos
Se producen diferentes interacciones cuando se eliminan archivos, principalmente según el sistema de archivos (EXT4, XFS, BtrFS, etc.) uso del sistema.Las llamadas siempre se pueden monitorear con precisión sin entrar en los detalles del sistema de archivos rm
Ordenar.
Primero, crea un archivo llamado example.txt
:
$ echo "This is a test file" > example.txt
Obtener información adicional sobre el archivo stat
Ordenar:
$ stat example.txt
File: example.txt
Size: 26 Blocks: 8
IO Block: 4096 regular file
Device: fd00h/64768d
Inode: 17198515 Links: 1
Access: (0664/-rw-rw-r--)
Uid: ( 1001/testuser)
Gid: ( 1001/testuser)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2022-09-14 17:22:51.492026903 +0200
Modify: 2022-09-14 17:24:21.667609795 +0200
Change: 2022-09-14 17:24:21.667609795 +0200
Birth: 2022-09-14 17:22:51.492026903 +0200
Este stat
La salida del comando muestra el tamaño de bloque del sistema de archivos, la cantidad de bloques utilizados por el archivo, etc. (¡No se preocupe, este artículo no requiere matemáticas!)
La información más importante en este ejemplo es el número de inodo. En este ejemplo, eso es:
Inode: 17198515
¿Qué es un inodo?
Los inodos contienen metadatos sobre archivos. Incluye el tamaño del archivo, dónde encontrar los bloques que contienen el contenido del archivo, el modo de archivo, etc. Cada archivo tiene un inodo de referencia.
Hay herramientas para encontrar información de bloque sobre archivos. Estos comandos son específicos del sistema de archivos.Por ejemplo, en XFS es xfs_bmap
Ordenar.
$ xfs_bmap example.txt
example.txt:
0: [0..7]: 9343608..9343615
Recuerda esos números. ¡Los necesitarás si sigues borrando!
comando de seguimiento
Una llamada al sistema («syscall» para abreviar) es una forma de programación para que un programa solicite servicios del núcleo. pista es una poderosa herramienta que le permite rastrear la delgada capa entre los procesos de usuario y el kernel de Linux.Comprender la interacción entre los archivos y las llamadas al sistema que utiliza rm
puede monitorear el proceso de eliminación con strace
:
$ strace --follow-forks \
--absolute-timestamps \
--syscall-times \
--no-abbrev \
--decode-fds -o /tmp/rm_log.txt \
--string-limit 1024 \
rm example.txt
usar /tmp/rm_log.txt
Para el registro, se puede ver acerca de rm
Ejecución de procesos. Primero, tenga en cuenta el ID del proceso (PID):
1727 [...] execve("/usr/bin/rm", ["rm", "example.txt"],
También puede ver las estadísticas del sistema usando syscall para verificar el archivo newfstatat
:
1727 17:26:04.489674 newfstatat(AT_FDCWD, "example.txt", {st_dev=makedev(0xfd, 0), st_ino=17198515, st_mode=S_IFREG|0664, st_nlink=1, st_uid=1001, st_gid=1001, st_blksize=4096, st_blocks=8, st_size=26, st_atime=1663168971 /* 2022-09-14T17:22:51.492026903+0200 */, st_atime_nsec=492026903, st_mtime=1663169061 /* 2022-09-14T17:24:21.667609795+0200 */, st_mtime_nsec=667609795, st_ctime=1663169061 /* 2022-09-14T17:24:21.667609795+0200 */, st_ctime_nsec=667609795}, AT_SYMLINK_NOFOLLOW) = 0 <0.000004>
es misterioso Esto es lo que significa:
st_ino=17198515
: número de inodo que contiene todos los metadatos del archivost_uid=1001, st_gid=1001
: ID de usuario (UID) y ID de grupo (GID) propietario del archivost_blksize=4096
: dimensión del tamaño del bloquest_atime=1663168971
: última hora de accesost_mtime=1663169061
: Última modificaciónst_ctime=1663169061
: hora del último cambio de estado
Archivo ejecutable rm
Se ha accedido con éxito al archivo como en W_OK
Marcos:
1727 17:26:04.489705 faccessat(AT_FDCWD, "example.txt", W_OK) = 0 <0.000005>
A continuación, el proceso hace unlinkat
Llamada al sistema:
1727 17:26:04.489724 unlinkat(AT_FDCWD, "example.txt", 0) = 0 <0.000062>
y el archivo se elimina de la carpeta:
$ ls -la
total 16
drwx------. 2 [...] 83 Sep 14 17:08 .
drwxr-xr-x. 4 [...] 35 Sep 13 16:46 ..
-rw-------. 1 [...] 508 Sep 13 18:22 .bash_history
-rw-r--r--. 1 [...] 18 Jun 20 13:31 .bash_logout
-rw-r--r--. 1 [...] 141 Jun 20 13:31 .bash_profile
-rw-r--r--. 1 [...] 376 Jun 20 13:31 .bashrc
El archivo ya no existe. ¿O es eso?
desvincular llamada al sistema
Este unlink
syscall ha eliminado un nombre del sistema de archivos, posiblemente el archivo al que se refiere.
Lo siguiente es de unlink
Página man:
unlink() deletes a name from the filesystem.
If that name was the last link to a file and no processes have
the file open, the file is deleted and the space it was using
is made available for reuse.
Recuperar archivos borrados
Anteriormente en el artículo, usé xfs_bmap
Herramienta para obtener los bloques utilizados por los archivos en el sistema de archivos. Esto será muy útil ya que es hora de recuperar archivos eliminados.
Primer uso dd
Leer bloques anteriores del disco y redirigir la salida al archivo recover.txt
:
$ sudo dd if=/dev/mapper/rhel-root of=recover.txt count=8 skip=9343512
8+0 records in
8+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.00012141 s, 33.7 MB/s
Acaba de crear un flujo de datos de 4096 bytes desde su disco duro, pero ¿qué hay dentro de este archivo?
$ cat recover.txt
This is a test file......
¡El archivo ha sido restaurado!
eliminar con cuidado
Sus archivos eliminados pueden ser reconfortantes o perturbadores rm
En realidad no desapareció. La recuperación depende del conocimiento previo de las ubicaciones de inodos de archivos o de la búsqueda y recuperación de fuerza bruta utilizando herramientas especializadas.
comprender rm
Las llamadas del sistema en las que se basa son conocimientos importantes. Con él, puede tomar decisiones informadas sobre cómo descartar, eliminar o triturar archivos.