Existe um cenário em que é necessário rm -rf -no-preserve-root?


27

Eu já vi algumas perguntas aqui onde as pessoas acidentalmente fazem rm -rf --no-preserve-rootou rm -rf *eliminam a maioria ou todo o sistema de arquivos antes que possam reagir.

Existe alguma razão para usar --no-preserve-root, seja em uso normal, como desenvolvedor ou administrador?


4
Não consigo imaginar nenhum caso útil ... Acho que essa opção existe apenas para obter a ortogonalidade do princípio UNIX (em termos de manter as mesmas coisas sem exceções). Você provavelmente deseja a exceção no caso de /, mas o »caso geral« ainda está representado. Em outras palavras: »Não é o trabalho do meu computador me dizer o que fazer.« E não deveria ser.
Andreas Wiese

Está lá como uma possível arma a ser usada quando o SkyNet assumir o controle.
Mitch Dart

Respostas:


26

IMPORTANTE: Os modernos sistemas UEFI montam o firmware no /sysdiretório e o tornam disponível para o sistema operacional. NÃO execute este comando em um sistema moderno, pois ele removerá esse firmware, bloqueando sua máquina.


O cenário mais simples em que consigo pensar é em alguém que deseja excluir todos os dados da unidade. Pode haver razões perfeitamente legítimas para fazer isso, e a maneira mais simples de pensar é

rm -rf --no-preserve-root /

Acontece que este é realmente dado como um exemplo em info rm:

`--no-preserve-root'
    Do not treat `/' specially when removing recursively.  This option
    is not recommended unless you really want to remove all the files
    on your computer. 

Outro motivo perfeitamente bom é que você deseja excluir um sistema de arquivos montado no qual chrootinseriu. Nesse caso, rm -rf --no-preserve-root /excluirá o sistema no chrootambiente, mas deixará o seu intacto.

Estou certo de que existem mais motivos possíveis, mas, em geral, parece uma abordagem bastante razoável que meu sistema permita que eu faça o que eu quiser com ele. É meu trabalho ter cuidado, o sistema só deve me permitir fazer o que quero que seja feito. Se o que eu quero é estúpido, esse é o meu problema e não os SOs.

De qualquer forma, essa é uma restrição relativamente nova, foi adicionada na 7ª versão da especificação POSIX (a anterior está aqui), antes que esse rm -rf /fosse um comando perfeitamente válido. Em uma nota histórica, os diretórios .e ..sempre foram protegidos rm, desde 1979, quando rmadquiriram a capacidade de excluir diretórios. Mais sobre isso aqui .


21
Não use este apagar todos os dados Se o sistema estiver UEFI (novos computadores) .Doing Isso exclui todas as variáveis de firmware e faz com que a placa-mãe para ser tão inútil como um tijolo
Suici Doga

5
@SuiciDoga: Fonte, ou mais explicações? O firmware da placa-mãe não deve ser armazenado no disco rígido, caso contrário, eles serão perdidos se você puxar a unidade.
Tarka #

15
@ Tarka: / sys / firmware / efi / efivars / pode ser montado e a exclusão recursiva pode remover esses vars. Realmente não deveria bloquear um sistema, mas sim. Veja thenextweb.com/insider/2016/02/01/...
cianídrico

4
@ Tarka eles não estão armazenados no disco rígido e puxar a unidade não os afetaria. No entanto, por razões que ainda não entendi, elas são montadas e, na verdade, são acessíveis abaixo /.
terdon

20
A maneira correta de apagar uma unidade é reformatar suas partições (ou reparticioná-la completamente). Nem todos os sistemas de arquivos são discos rígidos; portanto, rm -rf /você pode colocar uma máquina remota em branco sobre a montagem NFS / CIFS / SSHFS de alguém, por exemplo.
Score_Under

12

A existência do --no-preserve-rootinterruptor não é para adicionar funcionalidades adicionais, mas para substituir uma redução muito sã em termos de funcionalidade. Essa opção provavelmente se baseia na filosofia de que o computador deve fazer o que foi solicitado e que os comandos devem estar disponíveis para expressar qualquer ação desejada. Essa opção é anterior à UEFI e, com base na minha experiência, digo que agora está obsoleta.

Na prática moderna, sem essa opção, o rmcomando evita a exclusão acidental do diretório raiz ao usar uma variável não inicializada ou um espaço disperso.

rm -rf /${my_directory}
rm -rf / var/log/httpd/*

Nota de rodapé divertida: A proteção não era sua intenção. Em um blog da Sun Microsystems, a remoção do /diretório removerá implicitamente o diretório de trabalho atual, uma violação da consideração especial já feita para os diretórios .e ... É por isso que o comitê de padrões permitiu essa exceção especial - não para prevenir um acidente. Esta alteração foi introduzida pela primeira vez com o Solaris 10 build 36.

http://archive.is/5lmc9


Obrigado pelo link! Estava esperando que um pouco histórico fosse citado, já que eu estava imaginando qual seria o motivo da mudança.
Cameron Gagnon

Informações adicionais interessantes - obrigado #
318

1

Talvez essa não seja uma resposta que o solicitante original deseja, mas existe um caso de uso que precisa excluir todos os arquivos recursivamente do diretório raiz. Embora não seja através do rmcomando, ele faz parte do processo switch_root (8) durante a inicialização do seu sistema Linux (não incorporado).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.