Eu tenho um problema ao remover o diretório vazio, o strace mostra o erro:
rmdir("empty_dir") = -1 ENOTEMPTY (Directory not empty)
E ls -la empty_dir
não mostra nada. Então eu conectei ao fs (ext4) com debugfs e vi o arquivo escondido dentro deste diretório:
# ls -lia empty_dir/
total 8
44574010 drwxr-xr-x 2 2686 2681 4096 Jan 13 17:59 .
44573990 drwxr-xr-x 3 2686 2681 4096 Jan 13 18:36 ..
debugfs: ls empty_dir
44574010 (12) . 44573990 (316) ..
26808797 (3768) _-----------------------------------------------------------.jpg
Por que isso poderia acontecer? E alguma chance de resolver esse problema sem desmontar e verificar totalmente o fs?
Informação adicional:
O arquivo "oculto" é apenas um arquivo jpg normal e pode ser aberto pelo visualizador de imagens:
debugfs: dump empty_dir/_-----------------------------------------------------------.jpg /root/hidden_file
# file /root/hidden_file
/root/hidden_file: JPEG image data, JFIF standard 1.02
rm -rf empty_dir
não está funcionando com o mesmo erro:
unlinkat(AT_FDCWD, "empty_dir", AT_REMOVEDIR) = -1 ENOTEMPTY (Directory not empty)
find empty_dir/ -inum 26808797
não mostra nada.
Eu rastreei
ls
e obtive mais informações para cavar (remoção de syscalls não importantes):Hmm, vemos que o syscall
getdents
funciona corretamente e retornou todas as 3 entradas ('.','..' e '_---*'), masls
escreveu apenas '.' e '..'. Isso significa que temos algum problema com o wrapper em tornogetdents
do qual é usado pelo coreutils. E os coreutils usamreaddir
o wrapper glibc para arquivosgetdents
. Também para provar que não há problemas com eu testei o pequeno prog da seção de exemplo da página de manualgetdents
do getdents . Este programa mostrou todos os arquivos.Talvez tenhamos encontrado um bug no glibc? Então, atualizei o pacote glibc para a última versão da minha distro, mas não obtive nenhum bom resultado. Também não encontrei nenhuma informação correlata no bugzilla.
Então vamos aprofundar:
Espere o que? libncom.so.4.0.1? Não é um libc? Sim, vemos apenas uma biblioteca compartilhada maliciosa com funções libc para ocultar atividades maliciosas:
Remoção de arquivos de rootkit, verificação de todos os arquivos de pacotes (
rpm -Va
no meu caso), scripts de inicialização automática, configurações de pré-carregamento/pré-link, arquivos de sistema (find /
+rpm -qf
no meu caso), alteração de senhas afetadas, localização e eliminação de processos de rootkit:No final, atualização completa do sistema, reinicialização e problema resolvido. Motivo do hacking bem-sucedido: interface ipmi com firmware muito antigo que de repente estava disponível na rede pública.
Dentro
debugfs
de você pode deletar o arquivo. Você nem precisa do nome do arquivo (o que pode ser relevante se houver problemas com caracteres especiais como francois P adivinhou nos comentários):No meu caso, foi porque o sistema de arquivos foi montado como um compartilhamento cifs smb/samba com estas opções globais:
Isso fornece compatibilidade com computadores Apple e seu desejo de criar fluxos de metadados secundários para todos os tipos de mídia (por exemplo, mp4).
Mas a maneira como funciona é que ele cria dotfiles invisíveis (por exemplo ,
.apple.mp4
paraapple.mp4
, que não podem ser removidos por um sistema remoto e que podem ficar fora de sincronia se o sistema local excluir,apple.mp4
mas não o dotfile.A solução é voltar ao sistema local, onde os dotfiles são visíveis e podem ser
rm
'd.