Por que é muito mais rápido chamar rm em um diretório do que excluir uma pasta da GUI (Linux) sobre SSH?

3

Por curiosidade, por que é muito mais rápido excluir uma pasta / pastas no Linux (estou usando o Ubuntu) por SSH chamando rm -rf somefolder do que excluir a pasta da GUI (clique com o botão direito do mouse em "Mover para Lixeira)? As pastas que estou excluindo contêm cerca de 100 arquivos de imagem cada, e provavelmente leva alguns minutos para excluir as pastas na GUI, enquanto que rm -rf é executado instantaneamente. As duas ações realmente alcançam o mesmo efeito, ou rm -rf apenas remove o link para os arquivos?

    
por Raymond 06.08.2012 / 07:36

2 respostas

4

Você não especificou isso na sua pergunta, mas eu suspeito que sua GUI é baseada em algum tipo de recurso de sistema de arquivos sobre o ssh. Isso pode estar diminuindo a velocidade, já que toda operação de baixo nível (diretório aberto, diretório read, arquivo unlink1, unlink file2, ... diretório close) é passada pelo canal ssh como um comando separado.

Quando você executa rm -rf x do prompt do shell na máquina remota, a única coisa que está sendo passada pela rede são os pressionamentos de tecla usados para inserir rm -rf x e Enter . (Esses ficam um pouco inchados com os cabeçalhos dos protocolos de rede, mas ainda são razoavelmente pequenos.) As operações de baixo nível são conduzidas pelo programa rm no final remoto, conversando diretamente com o kernel no final remoto, então naturalmente é mais rápido.

O ssh foi projetado para fornecer uma interface de shell (o nome deve ser uma pista). As outras coisas que foram aparafusadas são menos eficientes.

Seria possível para uma implementação do filemanager-over-ssh otimizar o caso de remoção recursiva e simplesmente pedir ao servidor para executar um rm -rf . Eu não sei se algum deles fez isso.

    
por 06.08.2012 / 08:38
3

Você está se conectando a um sistema remoto com o gerenciador de arquivos "nautilus" ou similar, usando uma URL ssh: //, com o protocolo sftp.

Minha versão do nautilus se recusa a mover um diretório remoto para o lixo local. Mover uma árvore de diretórios remotos para o lixo local seria lento, teria que baixar todos os arquivos antes de excluí-los.

Meu nautilus é apenas excluir os arquivos. O protocolo sftp não possuía nenhuma função 'delete recursiva' até o começo do ano (2012 R1). Você não está usando este sistema sftp mais novo, e o nautilus provavelmente ainda não o conhece. Portanto, o gerenciador de arquivos deve listar todos os arquivos e excluí-los um de cada vez. Ele recebe uma mensagem de confirmação para cada arquivo que a exclusão foi feita, antes de passar para o próximo arquivo. Portanto, o tempo mínimo para excluir um arquivo é como o seu tempo normal de ping para o servidor (ou pior).

Essa exclusão remota de uma vez por vez é muito mais lenta do que a execução de rm -rf /whatever ou mesmo rm -vrf /whatever em uma conexão ssh normal. Estou excluindo o código-fonte do gcc como um caso de teste e ele estima 40 minutos para esses 28300 arquivos. O nautilus está usando apenas 2% da CPU, então claramente não está ligado à CPU, desenhando a GUI.

O problema não tem nada a ver com a GUI, é devido a uma fraqueza no protocolo (antigo) sftp: não há nenhuma função de exclusão recursiva. Mas é por isso que uso a linha de comando! Nenhum hacker que se preze iria esperar 40 minutos por isso !!

Um gerenciador de arquivos pode excluir arquivos razoavelmente rápido enquanto mostra quais arquivos estão sendo excluídos, se estiver usando algo como rm -vrf /whatever . Alguns servidores fornecem acesso sftp, mas não acesso ssh completo. O Nautilus parece estar assumindo o pior, e usando apenas o sftp.

    
por 06.08.2012 / 08:59