¿Cómo es 'rm -rf /' capaz de eliminar todos los archivos en el sistema?

81

No he probado este comando en Ubuntu (por razones obvias), así que no estoy seguro de si Ubuntu permitirá su ejecución. Pero es famoso por eliminar todo. Solo por curiosidad, ¿qué sucede cuando /binse eliminan el kernel y ? ¿Cómo se rmmantiene una pila de tiempo de ejecución? ¿Cómo rmlogra comunicarse con el sistema de archivos y completar la eliminación? ¿Cómo se comunica con el hardware?

Muye
fuente
18
rm -rf /no se elimina nada sin --no-preserve-root.
muru
47
Mi primera experiencia con Linux fue hacer un Ubuntu vm para poder "rm -rf /". Te recomiendo que pruebes esto. Es bastante rápido de configurar, mantiene a tu host seguro y es muy entretenido ver las diferentes partes del sistema operativo desmoronarse ante tus ojos. Muy satisfactorio.
DJMcMayhem
22
Me recuerda mi informe de error discreto favorito: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Resultados esperados: Squid se reinicia. Resultados reales: Todos los archivos se eliminan en la máquina".
99
Deberías leer Unix Recovery Legend . Mientras sigas conectado a un shell, ¡el sistema no está completamente muerto!
200_success
2
@gerrit lo hice . :)
muru

Respuestas:

79

No importa que /bin/rmse elimine. Solo se ejecuta una vez y en ese momento todo está cargado en la memoria, al igual que todo lo demás necesario para seguir enviando eliminaciones al sistema de archivos y al disco.


Barra lateral / Actualización: Por la respuesta de David Hoelzer (y mencionado en los comentarios), el nodo-i del vínculo físico /bin/rmutilizado para apuntar a permanecería justo hasta rmterminada (ya que Linux mantiene en un estado abierto) , pero este hecho es irrelevante; el estado del disco no importa en absoluto.

El binario se carga en la memoria antes de ejecutarse. Incluso si pudiera destruir manualmente los rmdatos del disco, no afectaría ni detendría que se completara la eliminación (suponiendo que de otro modo no haga que el disco no esté disponible).

¿No tienes idea de qué son un inodo o un enlace duro? Esta es la respuesta donde lo resolví.


De todos modos, esta es también la razón por la que puede eliminar el paquete para el núcleo actual sin que la computadora implosione. Siempre que instale una versión diferente, podrá arrancar.

Nuevamente, esto funciona porque rmsolo se llama una vez. El siguiente sería fallar después de /bin/rmmuerto, ya que lo llama una vez para cada nombre de archivo:

find / -exec rm {} \;

Dicho esto, find / -exec rm -rf {} +y find / -print0 | xargs -0 rm -rfprobablemente ambos fallarían porque ambos tienen límites de argumento, lo que significa que solo eliminarían una cantidad de archivos antes de volver a llamarlos. En algún momento a lo largo del viaje, /bin/rmpodría caducar ( y ser liberado) antes de que el resto de los archivos fueran eliminados. Sin embargo, no está garantizado. Si /bin/se ingresara el último directorio, estos métodos podrían funcionar.

Oli
fuente
77
Como explica @DavidHoelzer, los archivos no vinculados no necesitan estar ya en la memoria para seguir funcionando. El núcleo sabe que hay un identificador de archivo abierto, por lo que mantiene los datos del archivo para satisfacer cualquier solicitud (incluidas las entradas de página) hasta que se cierre el último identificador.
Andrew Medico
44
@Desty, no, eso no tendría éxito, siempre y cuando /bin/rmno esté lo suficientemente cerca como para ser el final del último lote; -exec ... {} +(el escape de la barra invertida es innecesario) aún da como resultado múltiples ejecuciones; no uno por archivo, sino uno por lote basado en el número de argumentos que pueden caber en ARG_MAX.
Charles Duffy el
66
@Oli, no se trata de paginación; los contadores de referencia están vinculados al inodo, no a la entrada del directorio, y un identificador de archivo abierto cuenta como referencia (igual que un enlace rígido), evitando que el inodo se desasigne. El tamaño del archivo no es un factor en absoluto, y esto sucede incluso si no hay espacio de intercambio (por lo tanto, no hay paginación) en absoluto.
Charles Duffy el
2
@CharlesDuffy Independientemente de si tiene espacio de intercambio o no, la paginación se utilizará para todos los archivos asignados a la memoria. Eso incluye todos los ejecutables y bibliotecas. De hecho, la falta de espacio de intercambio puede significar más paginación para archivos mapeados en memoria.
kasperd
2
@CharlesDuffy Sí, el tamaño es irrelevante. La asignación de memoria de un archivo no hace que ninguno de los contenidos del archivo se cargue hasta que se acceda a él. Y la memoria utilizada para cargar las partes del archivo a las que se accede puede volver a liberarse si es necesario, después de lo cual se cargará desde el archivo si se vuelve a acceder. Por lo tanto, el archivo debe permanecer en el sistema de archivos siempre que esté asignado, y esto se comporta de la misma manera para un archivo de una página que para un archivo lo suficientemente grande como para abarcar todo el espacio de direcciones. (Los detalles son un poco más complicados para las asignaciones de copia en escritura que son necesarias para la vinculación dinámica)
Kasperd
57

No he probado este comando en Ubuntu (por razones obvias), así que no estoy seguro de si Ubuntu permitirá su ejecución.

Yo hice. rm -rf / --no-preserve-rootse estaba ejecutando en una sesión raíz abierta directamente en la máquina, mientras que también estaba conectado sshdesde otra máquina, usando la cuenta raíz también.

Lo que sucede es que comienzas a recibir muchos mensajes como:

rm: no se puede eliminar '/ ...': Operación no permitida

o:

rm: no se puede eliminar '/ ...': dispositivo o recurso ocupado

ingrese la descripción de la imagen aquí

Sorprendentemente, la sshconexión permaneció abierta hasta el final de la operación. Solo cuando cerré la conexión e intenté volver a abrirla apareció un error:

Lectura del socket fallida: restablecimiento de la conexión por parte

En la máquina, quedan cuatro directorios:

  • /dev. Aquí es donde se almacenan los archivos del dispositivo.
  • /proc: Sistema de archivos en memoria creado por el núcleo.
  • /run, una ubicación estandarizada del sistema de archivos para demonios.
  • /sys. Esto le permite obtener información sobre el sistema y sus componentes.

Esto significa que no queda mucho, y no hay mucho que hacer allí. No puede ls(aunque cuando se usa Tab, los nombres de directorios y archivos todavía se muestran). Puede cden diferentes directorios, y también echocosas, pero los comandos como ya catno están disponibles.

No hay sudotampoco.

shutdown -h nowy rebootdesapareció también, por lo que su única opción parece apagar la máquina manualmente. Cerrar sesión ( exit) no funciona, incluso si muestra un buen texto "cerrar sesión".

Una vez que intente reiniciar la máquina, se le presentará un buen error GRUB 15, y luego, no pasa nada, en ese momento puede comenzar a pensar que rmpodría haber hecho algo malo a su sistema.

ingrese la descripción de la imagen aquí

Usted puede hacerlo también

No, espera, ¡no lo hagas en tu máquina!

Lo que puedes hacer es ejecutar una máquina virtual . Las máquinas virtuales tienen el beneficio de hacer que la experimentación sea realmente fácil. Como está usando Ubuntu, vmbuilder puede interesarle . Esta es una herramienta que le permite implementar máquinas virtuales en cuestión de minutos (la documentación oficial afirma que se puede hacer "en aproximadamente un minuto", pero el tiempo real, incluso en hardware rápido, es más de dos o tres minutos .

Una vez que finaliza la implementación, tienes un entorno con el que puedes jugar. Si termina destruyéndolo, no importa: despliega la máquina nuevamente, y dos minutos después puede continuar.

Si usa software como VMWare, también puede estar interesado en las instantáneas (tenga en cuenta que el VMWare Player gratuito no tiene esta característica; debe comprar VMware Workstation). Tenga en cuenta que Hyper-V es gratuito y admite instantáneas (pero debe ejecutar Windows).

El beneficio de las instantáneas es que puede tomar una en cuestión de milisegundos. Volver a una instantánea lleva más tiempo, pero a menudo es cuestión de segundos. Esto hace que la experimentación sea aún más fácil y rápida.

Esta experimentación no se limita al sistema operativo en sí. Puede hacer todo tipo de cosas relacionadas con el software. ¿Tienes una aplicación sospechosa? Pruébelo en una máquina virtual: si es un virus, no causará ningún daño. ¿Quiere probar una operación en una base de datos, dado que podría afectar el medio ambiente? Pruébelo en una máquina virtual.

¿Qué pasa si hiciste eso en una máquina real sin prueba?

Suceden cosas malas. Tenga en cuenta que lo rmprotege de usted mismo: rm -rf /no funcionará: debe usarlo --no-preserve-root. Aún así, ¿qué pasa si en realidad lograste, por error, eliminar todo?

rmsolo desvincula los archivos , pero los datos aún están allí, en su disco duro. Esto hace posible recuperarlo más tarde (por lo que no debería simplemente tirar sus discos duros con datos confidenciales cuando ya no funcionan).

Esto significa que solo tiene que tener una PC de repuesto con una caja de disco duro para recuperar casi todos los archivos. Lo importante es evitar escribir algo en el disco duro para recuperarlo: los datos que escriba sobrescribirán los archivos no vinculados.

Como se señala en el artículo en el comentario de 200_success , si actúa de manera inteligente, puede recuperar la máquina incluso sin una PC de repuesto. Si solo le importan los datos, no me molestaría: recuperarlos con una PC de repuesto es mucho más fácil.

Arseni Mourzenko
fuente
VirtualBox admite instantáneas de disco.
Nathan Osman
1
Tenga en cuenta que los virus a menudo están diseñados para detectar máquinas virtuales, por lo que no recomendaría este proceso de detección de virus. Una pequeña pregunta: esos cuatro directorios restantes no son directorios "reales", ¿verdad? ¿No están realmente en el disco duro? ¿Qué queda en el disco duro después de ejecutar este comando?
raptortech97
2
@ raptortech97 rmrealmente no borra cosas del disco duro, simplemente "desvincula" (disocia) los datos reales en el disco del árbol del sistema de archivos, dejándolos libres (para que eventualmente se sobrescriban a través del uso normal de la computadora). Entonces, si, por ejemplo, rm -rf ~no todo está perdido, siempre y cuando actúe rápidamente (por ejemplo, con extundelete). Puede considerarlo como una versión aún más poco confiable de la carpeta "eliminada" en su buzón, puede recuperar las cosas si no espera demasiado, pero eventualmente se eliminará.
Thomas
@ raptortech97 Por otro lado, si por alguna razón no lo usaste rmpero shred, se acabó el juego, aunque probablemente tengas tiempo para darte cuenta de tu error y abortar, ya que la trituración lleva más tiempo.
Thomas
55
Los directorios que se mantienen son probablemente puntos de montaje de una forma u otra. Y los comandos que continúan funcionando son comandos internos bash, no binarios separados. Entonces, mientras lsse va, for i in /*; do echo $i; donedebería funcionar. Y para reemplazarlo cat, puede usar un comando como while read i; do echo $i; done < /proc/self/maps.
MvG
25

La razón es que la capa de nomenclatura de archivos (con lo que ves ls) es realmente solo para tu conveniencia. El controlador del sistema de archivos y el núcleo solo se preocupan por el inodo. Cuando se hace referencia a un archivo por su nombre, se traduce inmediatamente al inodo que contiene todos los metadatos, incluidos los permisos, los bloques de datos en el disco, la identificación del propietario, la identificación del grupo y el recuento de enlaces.

El recuento de enlaces es lo que realmente importa aquí. Cuando elimina un archivo en un sistema UNIX, la llamada real del sistema es un unlink. Lo que sucede debajo del capó es que el recuento de enlaces (el número de nombres de archivos en la capa de nombres de archivos) que apunta a ese inodo disminuye. El sistema de archivos sabe que un archivo se elimina cuando el recuento de enlaces llega a cero.

Cuando un archivo se elimina rm, también editará el archivo de directorio (sí, es solo un archivo que contiene el nombre del archivo y el inodo además de algunos otros bits que no son importantes para esta respuesta). Sin embargo, es la desvinculación la que realmente libera los recursos del disco.

Esto lleva a otros efectos interesantes. Primero, es posible tener un archivo abierto cuyo conteo de enlaces es cero. Esto sucede cuando rm -rf /elimina la entrada para /bin/rm. El archivo está abierto (hay un identificador de archivo) pero el inodo está marcado como eliminado (número de enlaces = 0). Los recursos del disco no se liberarán ni se reutilizarán hasta que se cierre el identificador del archivo.

Otro efecto interesante es lo que sucede cuando tiene un inodo con un recuento de enlaces mayor que cero pero nada en la capa de nomenclatura del archivo que apunta a él. Este es, en cierto sentido, un archivo muy bien oculto :). Para obtener acceso a él, debería usar algo de bajo nivel para referenciarlo por número de inodo en lugar de por nombre (porque no hay uno) o editar una entrada de directorio para apuntar al inodo usando un editor hexadecimal.

Un tercer efecto interesante es lo que sucede si reduce el recuento de enlaces a cero pero de todos modos apunta una entrada de directorio al inodo. Te lo dejaré para que experimentes si quieres. Claramente, sin embargo, estos dos últimos conducen al sistema de archivos a estar en un estado inconsistente.

David Hoelzer
fuente
Mirando de otra manera, el recuento de enlaces no es cero, porque abrir un archivo agrega un enlace dentro de / proc.
OrangeDog
@OrangeDog, este comportamiento aún existe incluso si procfs está desmontado.
Charles Duffy el
1
@OrangeDog Charles Duffy está en lo correcto. El archivo maneja en / proc no modifica los inodos, ajustando el conteo de enlaces.
David Hoelzer el
/ proc y / sys son reflejos del estado actual del sistema (kernel). Solo seleccionar acciones para archivos y directorios allí realmente cambia el estado del sistema.
un CVn
18

Las respuestas anteriores son buenas, pero quiero aclarar un detalle:

rmNo es solo un comando. Es un programa que se encuentra en PATH.

Por lo tanto, lo que sucede cuando ejecuta es lo siguiente:

  • llamas (como root) rm -rf /
  • instancia del programa rmse carga en la memoria con argumentos -rfy/
  • basado en estos argumentos, el programa rmcomienza sus operaciones (repasando todo en montado / partición y eliminando recursivamente referencias a él [perdón por tecnicismo;)])
  • Una vez finalizado, la instancia del rmprograma se descarga
  • en este punto, lo único que hay en la memoria son los programas que se cargaron allí anteriormente (por ejemplo, bash si tienes un terminal abierto en Ubuntu, entorno de escritorio, kernel, controladores, etc.)
  • si intenta llamar a cualquier otro comando (que en el caso de Linux lo convierte en un programa independiente), fallará porque no se encuentra dicho programa en las ubicaciones de RUTA (y las ubicaciones de RUTA ya no existen). Sin embargo, todo lo que una vez cargado todavía se ejecutará

Solo por el simple hecho de comprender cómo funciona, intente instalar LAMP en ubuntu (en Virtualbox), algunos scripts y caché de código de operación PHP, luego llame a este malvado comando. Sorprendentemente (si tiene la suerte y su caché de código de operación no notará la eliminación del archivo php), ¡aún puede acceder a los scripts php desde el exterior a través del servidor web apache!

PD: este comando malvado incluso se ejecutó ya que la raíz no eliminará everything, no puede eliminar algunos procesos privilegiados del núcleo /procy no puede eliminar algunas cosas de los /devdispositivos que aparecen en su sistema como archivos. De hecho, la raíz no es tan poderosa como pensamos, el núcleo, por otro lado, lo es.

PPS: también como un segundo pensamiento, también tendrá archivos que estaban lockeden otro proceso en el momento del intento de eliminación.

Alexey Kamenskiy
fuente
En Linux, ciertamente puede eliminar los nodos del dispositivo cuando se ejecuta como root. Pero sí, no puede eliminar nada /procya que es un sistema de archivos de solo lectura. Del mismo modo para /sys. Creo que tampoco puedes eliminar los puntos de montaje.
Brian
@AlexKey Sugiero editar para aclarar lo que quiere decir con "comando incrustado sin núcleo" (o para evitar esa frase por completo). Parece que estás diciendo que hay comandos que puedes ejecutar a través de un shell que se implementan directamente en el kernel para que siempre funcionen sin importar qué. (Lo cual, como probablemente sepa, pero muchos lectores pueden no serlo, no es el caso: cuando ejecuta un comando como cd, esto llama al shell integrado por ese nombre: ese comando está integrado en el shell, no en el núcleo). significa Alt + SysRq "comandos"?
Eliah Kagan
@Brian, ¿depende de la distribución? Trabajé en varias distribuciones y, por extraño que parezca, cometí este error varias veces. Como recordé después de inspeccionar los restos de / todavía había algo en / dev, pero podría ser cosas como cdrom o disquete ...
Alexey Kamenskiy
@EliahKagan Como intenté mantener la distribución independiente, usé este término. Significa que no en todos los sistemas, el comando cli significa programa externo. Pero gracias, por señalarlo, aclararé el punto.
Alexey Kamenskiy
@AlexKey Creo que no podrá eliminarlo /dev/ptsya que es un punto de montaje. (Y un sistema de archivos de solo lectura, también.)
Brian
1

Una vez que todo está borrado de los discos duros, el kernel sigue funcionando pero atascado, ya que no quedan dispositivos y programas, comandos, etc.

El sistema operativo ya no funcionará.

Y es cierto lo que dice Oli, el comando se carga / ejecuta en la memoria y nada lo detendrá a menos que elimine este proceso (por supuesto, si el comando kill todavía está presente ^^).

s1mmel
fuente
44
¿Por qué se atascaría el núcleo? La respuesta de MainMa sugiere lo contrario, y respalda lo que hubiera esperado.
MvG
44
Los programas se ejecutan desde la memoria, no desde el disco duro. El kernel no sabría que algo está mal hasta que se reinicie.
phyrfox
Bueno, tal vez necesito cambiar las palabras que usé, el kernel está más o menos "atascado" sin dispositivos, programas, etc. y si no estás frente a la consola raíz no puedes hacer cosas malas, diablos incluso en eso consola no puedes hacer cosas malas. Pero voy a cambiar mi redacción en mi respuesta, ya que es engañoso, estoy de acuerdo.
s1mmel
0

Tenga en cuenta que si el sistema tiene selinux y selinux está en modo obligatorio, y las políticas de selinux están configuradas correctamente; entonces no pasará mucho.

Selinux es un control de acceso obligatorio, lo que significa, entre muchas cosas, que el usuario root realmente no tiene mucho más poder para destruir el sistema que cualquier otro usuario en el sistema.

Selinux se impone en el núcleo; tendrías que comprometer el núcleo para evitarlo.

En un sistema bien diseñado con buenas políticas de Selinux, root no podría hacer mucho en el sistema.

Las revisiones posteriores de Android hacen que Selinux aplique solo por esta razón.

Mark Allyn
fuente