terça-feira, 3 de fevereiro de 2009

rm -rf /: Ele MORREU !!! Ele MORREU !!!

Lendo algumas noticias do mundo linux, me deparei com uma que fiquei pensando:

"Mas será que tinha tanto idiota assim que executava o "rm -rf /""

Eu sempre brinquei com o pessoal quando me perguntavam qual era o comando para fazer 'tal' coisa e eu sempre falava: "rm -rf /" e sempre ouvia "dããããããã". Mas vamos a noticia me fez pensar tal frase acima...

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: http://blogs.sun.com/jbeck/date/20041001#rm_rf_protection

Não sei se isso é novo, mas para mim é. E ainda continuo me perguntando:

"Mas será que tinha tanto idiota assim que executava o "rm -rf / sem querer para fazerem um patch ?!?!""

UPDATE: Como é do conhecimento de todos os que visitam o blog, sempre cito as fontes dos posts quando eu pego de algum lugar e por uma falha gigantesca minha, esqueci de colocar a fonte de onde eu peguei o "miolo" desse post. A fonte dessa informação veio do blog do Jorge <http://blog.jorgepereira.com.br/2009/01/18/o-fim-do-rm-rf>

Um comentário:

Felipe - Rasputin disse...

Ainda bem que pelo menos sobrou o mkfs /dev/hda ou /dev/sda.

huauhauhaha