rm -rf /

Algumas pessoas que me conhecem sabem que eu costumo brincar fazendo analogias ao comando rm -rf /, pois bem! Recentemente foi adicionado um patch ao pacote coreutils que por sua vez foi adotado por algumas distribuições Linux, entre elas o pessoal do Debian aderiu este patch na sua versão unstable assim como percebi também que no Ubuntu 8.10 já possui tal modificação no coreutils. Que por sua vez desabilita a possibilidade de você acidentalmente ou não execute um rm -rf /, veja exemplo abaixo.

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 5.0 (lenny)
Release: 5.0
Codename: lenny
# rm -rf /
rm: cannot remove root directory ‘/’
#

Pois se caso você queira realmente desestressar e mostrar que você e quem manda na sua máquina, não tem problema! basta adicionar a opção –no-preserve-root e dai você terá a liberdade de expressar seus sentimentos de fúria ou autoridade sobre o seu Linux! Mesmo assim fiquei ainda curioso e fui ver no código fonte sobre a veracidade deste feito, abaixo seguem os trechos para caso você queira também dar uma olhada tanto no funcionamento do comando rm como também tal “cuidado” adicionado recentemente.

1) Baixando o fonte via apt-get

$ lsb_release -c -r
Release: 8.10
Codename: intrepid
$
$ sudo apt-get source coreutils
$ cd coreutils-6.10/
$ sudo tar -xzf coreutils-6.10.tar.gz
$ find $PWD -iname “rm.c”
/tmp/coreutils-6.10/src/rm.c
$

2) Verificando tais trechos mais interessantes.

//$ cat -n coreutils-6.10/src/rm.c | sed '227,233!d'
227    int
228    main (int argc, char **argv)
229    {
230      bool preserve_root = true;
231      struct rm_options x;
232      bool prompt_once = false;
233      int c;
// $ cat -n coreutils-6.10/src/rm.c | sed '348,355!d'
348      if (x.recursive & preserve_root)
349        {
350          static struct dev_ino dev_ino_buf;
351          x.root_dev_ino = get_root_dev_ino (&dev_ino_buf);
352          if (x.root_dev_ino == NULL)
353            error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
354            quote ("/"));
355       }
// $

3) Conforme trecho do próprio man do comando rm, a opção vem habilitada por padrão para evitar tais “imprevistos”!

$ cat -n <(man rm) | sed ’45,51!d’
45
46 –no-preserve-root
47 do not treat ‘/’ specially
48
49 –preserve-root
50 do not remove ‘/’ (default)
51
$

Então concluímos que não e bem o fim do famoso “rm -rf /”, agora e preciso adicionar o parâmetro “–no-preserve-root” para que você consiga mostrar quem e que manda! e durante pesquisas descobri que tal cuidado já havia sido adotado pela Sun no Solaris conforme este link.

OBS: Eu não me responsabilizo por nada que você venha a testar ou fazer relacionado a leitura deste POST, seja cuidadoso! :P