Erro de segunda-feira de manhã: sudo rm -rf --no-preserve-root /

146

Observação: as respostas e os comentários a esta pergunta contêm conteúdo de outra pergunta semelhante que recebeu muita atenção da mídia externa, mas acabou sendo uma pergunta fraudulenta em algum tipo de esquema de marketing viral. Como não permitimos que o ServerFault seja abusado dessa maneira, a pergunta original foi excluída e as respostas foram mescladas com essa pergunta.


Aqui está uma tragédia divertida. Esta manhã eu estava fazendo um pouco de manutenção no meu servidor de produção, quando executei por engano o seguinte comando:

sudo rm -rf --no-preserve-root /mnt/hetznerbackup /

Não localizei o último espaço antes /e alguns segundos depois, quando os avisos inundavam minha linha de comando, percebi que havia acabado de apertar o botão de autodestruição. Aqui está um pouco do que queimou nos meus olhos:

rm: cannot remove `/mnt/hetznerbackup': Is a directory
rm: cannot remove `/sys/fs/ecryptfs/version': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/inode_readahead_blks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_max_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/delayed_allocation_blocks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/max_writeback_mb_bump': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stream_req': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_min_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stats': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/trigger_fs_error': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/session_write_kbytes': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/lifetime_write_kbytes': Operation not permitted
# and so on..

Parei a tarefa e fiquei aliviado quando descobri que o serviço de produção ainda estava em execução. Infelizmente, o servidor não aceita mais minha chave pública ou senha de qualquer usuário via SSH.

Como você avançaria daqui? Nado em um oceano de arame farpado para recuperar o acesso SSH.

O servidor está executando o Ubuntu-12.04 e hospedado no Hetzner.

Jonas Nielsen
fonte
48
Restaurar a partir de backups. Honestamente, esse é um daqueles cenários que não são fáceis de voltar.
21914 MadHatter
310
Como você digita --no-preserve-rootacidentalmente ?! : -o
ThatGraemeGuy
144
Greame, as teclas são como um ao lado do outro.
21714 MadHatter
38
Trabalho de terça-feira: procure um novo emprego;) Faça uma lição sobre por que são necessários backups.
TomTom
43
Isso com certeza parece trollar para mim. Você não pode digitar acidentalmente --i-realmente-significa-excluir-minha-raiz-inteira.
psusi

Respostas:

95

Inicialize no sistema de resgate fornecido pela Hetzner e verifique o dano que você causou.
Transfira os arquivos para um local seguro e reimplemente o servidor posteriormente.

Receio que seja a melhor solução no seu caso.

falsificador
fonte
102
olhe pelo lado positivo, pelo menos ele não tem problemas com heartbleed!
Metacom
222

Fato é? Neste ponto, não há uma correção automática simples / fácil para isso. A recuperação de dados é uma ciência e mesmo as ferramentas básicas e comuns precisam de alguém para se sentar e garantir que os dados estejam lá. Se você espera se recuperar disso sem grandes quantidades de tempo de inatividade, ficará desapontado.

Eu sugiro usar testdisk ou alguma ferramenta de recuperação específica do sistema de arquivos. Tente um sistema, veja se funciona e assim por diante. Não existe uma maneira real de automatizar o processo, mas você provavelmente pode fazê-lo com cuidado em lotes.

Dito isto, há algumas coisas muito assustadoras nas perguntas e comentários que devem fazer parte dos seus relatórios após a ação.

Primeiro, você executou o comando em qualquer lugar sem verificar primeiro. Execute um comando em uma caixa. Depois alguns, depois mais. Basicamente, se algo der errado, é melhor que isso afete alguns e não todos os seus sistemas.

Em segundo lugar

@ Tim como fazer um backup sem montar uma unidade remota no servidor?

Me assusta. Os backups unidirecionais em nível de arquivo são um problema resolvido . O Rsync pode ser usado para preservar permissões e copiar arquivos em um caminho para um site de backup. Acidentalmente alguma coisa? Reinstale (de preferência automaticamente) o rsync de volta, e tudo funcionará. No futuro, você poderá usar instantâneos no nível do sistema de arquivos com instantâneos btrfs ou zfs e enviá-los para backups no nível do sistema. Na verdade, eu brincava com a separação de servidores de aplicativos, bancos de dados e armazenamento e introduzia o princípio do menor privilégio para que você dividisse o risco de algo assim.

Eu sei que há qualquer coisa que eu possa fazer. Agora preciso pensar em como me proteger

Depois que algo aconteceu, é o pior momento para considerar isso.

O que podemos aprender com isso?

  1. Os backups salvam dados. Possivelmente carreiras.
  2. Se você tem uma ferramenta e não sabe se o que pode fazer, é perigoso. Um jedi pode fazer coisas incríveis com um sabre de luz. Uma sala cheia de chimpanzés com sabres de luz ... ficaria bagunçada.
  3. Nunca execute um comando em todos os lugares ao mesmo tempo. Separe as máquinas de teste e produção e, de preferência, faça as máquinas de produção em etapas. É melhor consertar 1 ou 10 máquinas em vez de 100 ou 1000.

  4. Comandos de verificação dupla e tripla. Não há vergonha em pedir a um colega para checar "ei, eu estou prestes a fazer uma unidade, você poderia verificar isso com prudência para não acabar limpando uma unidade?". Um invólucro pode ajudar também, mas nada supera um conjunto de olhos menos cansado.

o que você pode fazer agora? Receba um email para os clientes. Deixe que eles saibam que há tempo de inatividade e falhas catastróficas. Converse com seus superiores, legais, vendas e outros e veja como você pode mitigar os danos. Comece a planejar a recuperação e, se necessário, precisará contratar, na melhor das hipóteses, mãos extras. Na pior das hipóteses, planeje gastar muito dinheiro em recuperação. Nesta fase, você trabalhará para atenuar a queda e as correções técnicas.

Journeyman Geek
fonte
9
@MarcoMarsala Se você montou alguma coisa antes de usar o rsync, não estava fazendo isso corretamente. Você deve usar o rsync sobre ssh.
Michael Hampton
67
Eu acrescentaria a esta excelente resposta: Afaste-se do computador. Não tente consertar nada até se acalmar. Você já está observando algum tempo de inatividade grave; dedicar algum tempo para refletir sobre as coisas, em vez de destruir ainda mais seus sistemas (como no ddproblema acima), não vai piorar as coisas.
Jenny D
22
Alguma idéia de por que o comando realmente foi executado? Se $fooe $barforam ambos indefinidos, rm -rf /deveriam ter errado com a --no-preserve-rootmensagem. A única maneira de pensar que isso realmente funcionaria em uma máquina CentOS7 é se $baravaliado *, então o que foi executado foi rm -rf /*.
terdon
9
Eu amo o estilo em "acidentalmente alguma coisa?". Isso deve significar que a palavra "removido" foi "excluída" ou "descartada" acidentalmente.
sehe
20
@MarcoMarsala bem, pelo menos você é famoso agora independent.co.uk/life-style/gadgets-and-tech/news/...
Martin Smith
92

Quando você exclui itens com rm -rf --no-preserve-root, é quase impossível recuperar. É muito provável que você tenha perdido todos os arquivos importantes.

Como o @faker disse em sua resposta, o melhor curso de ação é transferir os arquivos para um local seguro e reimplementar o servidor posteriormente.

Para evitar situações semelhantes no futuro, sugiro que você:

  • Faça backups semanalmente ou pelo menos quinzenalmente. Isso ajudaria você a recuperar o serviço afetado com o menor MTTR possível.

  • Não trabalhe como root quando não for necessário . E sempre pense duas vezes antes de fazer qualquer coisa. Eu sugiro que você também instale o safe-rm .

  • Não digite as opções que não pretende chamar , como --no-preserve-rootou --permission-to-kill-kittens-explicitly-granted, nesse caso.

Amal Murali
fonte
18
Da mesma forma, a menos que você realmente quer dizer isso, não adicione o --please-destroy-my-driveparâmetro para hdparm.
MikeyB
3
Eu gostaria de adicionar; "Verifique três vezes seus argumentos (e opções) ao trabalhar como root", "Verifique seu CurrentWorkingDirectory (antes de executar algo como rm -rf *)" e "Use caminhos completos para comandos (não use o $ PATH).
Baard Kopperud
47

Eu tive o mesmo problema, mas apenas testando com um disco rígido, perdi tudo. Não sei se será útil, mas não instale nada , não substitua seus dados , você precisa montar seus discos rígidos e lançar algumas ferramentas forenses, como autópsia, photorec, Testdisk.

Eu recomendo fortemente o Testdisk, com alguns comandos básicos, você pode recuperar seus dados se não os substituir.

Octo
fonte
8
Definitivamente, recomendo que você faça o armazenamento off-line, se possível, e reinstale como 'somente leitura', se puder. Seja com um livedisk ou outra instância do servidor.
precisa saber é o seguinte
2
Eu até consideraria fazer uma cópia de bit dd do disco original em um novo disco a partir de uma montagem somente leitura do disco original, apenas por segurança.
Jim
3
«Essas ferramentas não recuperam o nome e o caminho do arquivo» Sim, eles recuperam. Das três ferramentas mencionadas, apenas uma (Photorec) realiza a escultura.
Andrea Lazzarotto
34

A melhor maneira de corrigir um problema como esse é não tê-lo em primeiro lugar.

Não insira manualmente um comando "rm -rf" que tenha uma barra na lista de argumentos. (Colocar esses comandos em um shell script com boas rotinas de validação / sanidade para protegê-lo de fazer algo estúpido é diferente.)

Apenas não faça isso.
Sempre. Se você acha que precisa fazer isso, não está pensando o suficiente.

Em vez disso, altere seu diretório de trabalho para o pai do diretório a partir do qual você pretende iniciar a remoção, para que o destino do comando rm não exija uma barra:

cd / mnt

sudo rm -rf hetznerbackup

Monty Harder
fonte
31
Eu sempre coloco -rf no final da lista de argumentos, então rm /bla/foo/bar -rf. Pelo menos dessa maneira, não tenho muitos problemas quando pressiono retorno após digitar a rm /parte.
perfil completo de Jens Timmerman
5
Da mesma forma, ao remover arquivos "* ~", digito primeiro o til e adiciono o asterisco.
precisa saber é o seguinte
4
Então, você prefere excluir sua casa do que tudo no diretório atual?!?
greg0ire
@ greg0ire Não, acho que ele queria dizer que, por dentro /mnt/hetznerbackup, ele tinha que usar "/" para marcar tudo dentro dessa pasta .. mas pelo pai, apenas hetznerbackupé suficiente, sem barras.
T.Todua 16/05
11
@tazotodua: Eu estava me referindo de tekknolagi comentário
greg0ire
16

Eu tentaria recuperar a máquina de backup, onde todas as cópias foram armazenadas:

  • 1º passo - Faça um backup dessas unidades de "máquina de backup" apagadas com ddcomando.
  • 2º passo - Use testdiskpara recuperar arquivos.

Digamos que você queira recuperar 1 TB, você precisará de 2 TB extras, 1 TB para backup (1º passo) e 1 TB para recuperação (2º passo).

Cometi um erro semelhante com o apelido rm -fr [telefone tocou] e cd no diretório precioso. Agora eu sempre penso duas vezes e verifique novamente algumas vezes antes de usar o comando rm ou dd.

Abc Xyz
fonte
6
Zerou seu disco praticamente fazendo isso. Isso seriamente torna muito mais difícil a recuperação. Há um bom motivo para o OP sugerir que você tentou usar o testdisk e se recuperar primeiro, e embora a sintaxe do dd possa ser um pouco estranha, esse é um bom motivo para verificar duas vezes e três vezes antes de executar o comando. Você limpou apenas um servidor, certo?
Journeyman Geek
11
Você ainda pode se recuperar, depende de quanto tempo você ddconseguiu apagar sua última chance.
precisa saber é o seguinte
129
Lamento dizer isso, mas eu sinto enorme troll esta pergunta ...
tymik
3
Esperamos u sentir pequeno troll a resposta :)
Abc Xyz
5
Para ser honesto. Não sei se você é real. Se você for, você provavelmente está no emprego errado ...
leftcase
7

Como mencionado em outra resposta, Hetzner possui um sistema de resgate. Inclui uma opção netboot com acesso ssh, bem como um applet java para fornecer a tela e o teclado no seu vserver.

Se você deseja recuperar o máximo possível, reinicie o servidor no sistema netboot e, em seguida, efetue login e faça o download de uma imagem do sistema de arquivos lendo o inode apropriado do dispositivo.

Eu acho que algo assim deve funcionar:

ssh root@host cat /dev/sda > server.img

É claro que o redirecionamento é feito pelo shell antes que o comando ssh seja chamado, portanto server.img é um arquivo local. Se você quiser apenas o sistema de arquivos raiz e não o disco cheio, substitua sdapor sda3supondo que você está usando a mesma imagem que eu.

Kasperd
fonte
poderia talvez ser: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz(a gzip on-the-fly vai ou não vai ajudar, dependendo do que o conteúdo do sistema de arquivos é ...)
Olivier Dulac
@OlivierDulac Usar o gzip dessa maneira enviaria os dados não compactados pela rede e depois os compactaria no lado de recebimento. Suponho que o resultado que você pretendia alcançar foi compactar os dados enquanto estava sendo transferido. A imagem local pode ser armazenada compactada ou não, mas as ferramentas que você deseja aplicar a essa imagem posteriormente não funcionarão com a versão compactada. Se tudo o que você deseja alcançar é a compactação de dados em trânsito, você pode usar o recurso de compactação no ssh. Ele pode ser ativado -Cse ainda não estiver ativado na sua configuração.
precisa saber é o seguinte
2
Eu estava tentando reduzir o tamanho do arquivo. Mas se você deseja economizar largura de banda (boa ideia): basta adicionar aspas: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz(a opção -c do ssh também costuma ser boa, mas você ainda precisa compactar no final, pois o ssh só comprime na entrada do túnel e descomprimir antes de enviar para stdout)
Olivier Dulac
2

Como você avançaria daqui?

Eu juraria usar rmo resto da minha vida e pensaria que é loucura que o lixo-cli não seja o comando de remoção padrão nos sistemas nix.

https://github.com/andreafrancia/trash-cli

Eu me certificaria de que é a primeira coisa que instalo em um sistema totalmente novo e alias rmalgo que diz às pessoas para usar trash-cli. Também incluiria uma observação sobre outro alias que realmente é executado, /bin/rmmas diz a eles para evitar usá-lo na maioria dos casos.

:( História real

Gerry
fonte
2
Na minha experiência, esse tipo de ferramenta é mais um incômodo do que uma ajuda real - mais cedo ou mais tarde, e depois de alguns palavrões, você o removerá. Pode ser bom para uma estação de trabalho, mas em muitas, senão na maioria das situações, quando você está executando um trabalho administrativo em um servidor, você realmente precisa excluir os dados, não apenas movê-los para outro lugar (e, se for esse o caso, basta usar mv em vez de). Além disso, a movimentação automática de dados para uma pasta do lixo pode levar a problemas sérios por si só (por exemplo, lixo que não está no mesmo sistema de arquivos, segurança).
maetthu
@maetthu Ah, é claro que as coisas são removidas depois de ficarem no lixo por um certo número de dias. A área de trabalho do Ubuntu faz isso com itens que estão no lixo há mais de 30 dias. Em um servidor, você pode querer algo mais curto, por exemplo. trash-empty 5em um cron. O objetivo é permitir um período de carência, porque os humanos cometem erros.
Gerry
Não é melhor ter um plano de recuperação de desastres funcionando em vez de proibir ferramentas essenciais do sistema?
user292812
@ user292812 Não sugeri banir / bin / rm, apenas que não deve ser a primeira opção na maioria dos casos (observe o alias / bin / rm). Sua pergunta também sugere uma falsa escolha entre recuperação de desastre e uma opção de exclusão amigável para humanos. Você deveria ter os dois.
Gerry
11
Um processo de remoção em duas etapas pode economizar muitos problemas: 1. mova para o lixo (verbalmente), 2. esvazie o lixo. Alias ​​esse script para "rm" e ele me salvou de excluir acidentalmente coisas importantes muitas vezes.
Sam Watkins
1

Eu aconselho, nesse caso, é desmontar e usar debugfs , e com a ajuda do lsdel você pode listar todos os arquivos removidos recentemente, que não foram limpos dos diários e depois despejaram os arquivos necessários. Link de pesquisa rápida para o mesmo: http://www.linuxvoodoo.com/resources/howtos/debugfs

espero que ajude alguém. ;)

E sim, uma das sugestões é fazer o script, que moveu ream rm para real.rm e symlinc mv para rm ;)

BiG_NoBoDy
fonte
-2

Interrompa todo o processo do servidor e tudo o que possa causar a E / S do disco ... e execute o testdisk, ele deve estar na sua pilha de software. Se você tiver acesso físico, use um livecd com testdisk.

Saint Crusty
fonte
11
Não entendi bem por que você acha que três respostas que fornecem exatamente a mesma sugestão não foram suficientes?
precisa saber é o seguinte