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 /bin
se eliminan el kernel y ? ¿Cómo se rm
mantiene una pila de tiempo de ejecución? ¿Cómo rm
logra comunicarse con el sistema de archivos y completar la eliminación? ¿Cómo se comunica con el hardware?
kernel
filesystem
rm
Muye
fuente
fuente
rm -rf /
no se elimina nada sin--no-preserve-root
.Respuestas:
No importa que
/bin/rm
se 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/rm
utilizado para apuntar a permanecería justo hastarm
terminada (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
rm
datos 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
rm
solo se llama una vez. El siguiente sería fallar después de/bin/rm
muerto, ya que lo llama una vez para cada nombre de archivo:Dicho esto,
find / -exec rm -rf {} +
yfind / -print0 | xargs -0 rm -rf
probablemente 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/rm
podrí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.fuente
/bin/rm
no 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.Yo hice.
rm -rf / --no-preserve-root
se estaba ejecutando en una sesión raíz abierta directamente en la máquina, mientras que también estaba conectadossh
desde otra máquina, usando la cuenta raíz también.Lo que sucede es que comienzas a recibir muchos mensajes como:
o:
Sorprendentemente, la
ssh
conexión permaneció abierta hasta el final de la operación. Solo cuando cerré la conexión e intenté volver a abrirla apareció un error: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). Puedecd
en diferentes directorios, y tambiénecho
cosas, pero los comandos como yacat
no están disponibles.No hay
sudo
tampoco.shutdown -h now
yreboot
desapareció 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
rm
podría haber hecho algo malo a su sistema.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
rm
protege 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?rm
solo 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.
fuente
rm
realmente 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, conextundelete
). 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á.rm
peroshred
, 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.ls
se va,for i in /*; do echo $i; done
debería funcionar. Y para reemplazarlocat
, puede usar un comando comowhile read i; do echo $i; done < /proc/self/maps
.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.
fuente
Las respuestas anteriores son buenas, pero quiero aclarar un detalle:
rm
No es solo un comando. Es un programa que se encuentra enPATH
.Por lo tanto, lo que sucede cuando ejecuta es lo siguiente:
rm -rf /
rm
se carga en la memoria con argumentos-rf
y/
rm
comienza sus operaciones (repasando todo en montado / partición y eliminando recursivamente referencias a él [perdón por tecnicismo;)])rm
programa se descargaSolo 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/proc
y no puede eliminar algunas cosas de los/dev
dispositivos 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
locked
en otro proceso en el momento del intento de eliminación.fuente
/proc
ya que es un sistema de archivos de solo lectura. Del mismo modo para/sys
. Creo que tampoco puedes eliminar los puntos de montaje.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"?/dev/pts
ya que es un punto de montaje. (Y un sistema de archivos de solo lectura, también.)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 ^^).
fuente
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.
fuente