Não é possível excluir um diretório como 'root', mesmo depois de um 'chattr -i'

3

Eu estou tentando excluir um diretório, foo , e estou totalmente fora das coisas para tentar.

Observação: eu sei, não devo excluir contêineres LxD com rm , mas atrapalhei o conteúdo desse diretório mais cedo, e estou bem usando rm agora.

Observe abaixo que o pai de foo (ou seja, o diretório containers ) tem permissões de gravação.

[root@box /var/lib/lxd]$ ls -l
drwx--x--x 1 root root    74 Dec 24 09:09 containers
    <snip>

[root@box /var/lib/lxd]$ cd containers/
[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

[root@box /var/lib/lxd/containers]$ ls -l foo
total 0

[root@box /var/lib/lxd/containers]$ lsattr 
    <snip>
---------------- ./foo

[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ chattr -R -ia foo
[root@box /var/lib/lxd/containers]$ lsattr -d foo
---------------- foo

[root@box /var/lib/lxd/containers]$ /bin/rm -rf foo
/bin/rm: cannot remove 'foo': Operation not permitted

[root@box /var/lib/lxd/containers]$ ls -l
    <snip>
drwxr-xr-x+ 1 231072 231072     0 Dec 24 09:13 foo

Mesmo um chown -R root.root foo não ajuda!

O que surpreende é que lsattr não exiba nenhum atributo adicional definido em foo , tanto para começar como para o comando chattr . Então, por que ls -l foo estava mostrando - e continua a mostrar - a + ao lado da listagem foo ?

Estou usando o Ubuntu 16.04 com o ext4fs, com as atualizações mais recentes a partir de hoje.

EDIT : O sistema de arquivos é btrfs e NÃO é ext4fs. Este é um disco rígido USB externo que estou montando no /var/lib/lxd do meu host.

    
por Harry 24.12.2016 / 05:24

1 resposta

4

Minha aposta é que seu diretório é, na verdade, um subvolume btrfs. Eu fiz um teste. Quando tento rm meu subvolume de teste, recebo "Operação não permitida".

Se eu estiver certo, o seguinte deve funcionar no seu caso:

sudo btrfs subvolume delete foo

Eu entendo que seu diretório já está vazio, mas em geral você pode ter que esvaziá-lo de antemão.

Explicação adicional conforme solicitado:

A subvolume is a part of filesystem with it’s own and independent file/directory hierarchy. Subvolumes can share file extents.

Você pode aprender mais com wiki do btrfs . As principais razões pelas quais alguém pode querer criar um subvolume em vez de um diretório regular são:

  • um subvolume pode ser montado como se fosse um sistema de arquivos separado com suas próprias opções (compare: embora você possa montar um diretório regular com bind mount, ele deve existir dentro do sistema de arquivos já montado; o subvolume btrfs pode ser facilmente montado como root sistema de arquivos / );
  • um pode criar um instantâneo de subvolume que é um subvolume separado que inicialmente compartilha todas as extensões de arquivo com o subvolume de origem.

Exemplo prático:

Meu sistema de arquivos btrfs tem a seguinte estrutura interna (lembre-se de que essa estrutura é diferente da estrutura de diretórios vista pelo sistema; os pontos de montagem pertencem ao último):

/                        # btrfs root filesystem mounted as /mnt/ssd/
  @                      # a subvolume I use as the root filesystem (mounted as /)
  @backups
    @-20161215-1-working # a snapshot of @ just in case

Vamos supor que quero mexer no meu sistema. Como precaução, crio primeiro um instantâneo:

cd /mnt/ssd/@backups
sudo btrfs subvolume snapshot ../@ @-20161224-1-just_in_case

Eu faço isso dentro do meu sistema de trabalho e não leva tempo. Inicialmente também não ocupa nenhum espaço em disco. O espaço adicional será alocado posteriormente, quando os arquivos e as árvores de diretórios correspondentes começarem a diferir.

Em seguida, posso até quebrar meu sistema que reside dentro do @ subvolume. Contanto que o @backups/@-20161224-1-just_in_case subvolume esteja intacto, posso substituir @ por esse backup, como se nada tivesse acontecido. Na pior das hipóteses eu preciso arrancar de uma distro ao vivo para fazer isso. Mas se meu gerenciador de inicialização (GRUB2) ainda funcionar, posso editar sua entrada no boottime e usar temporariamente @backups/@-20161224-1-just_in_case em vez de @ subvolume como meu sistema de arquivos raiz. Então, dentro do novo sistema de trabalho que eu faço:

cd /mnt/ssd/
sudo btrfs subvolume delete @  # I may have to empty it first
sudo btrfs subvolume snapshot @backups/20161224-1-just_in_case @

Depois disso, eu reinicio. O sistema é restaurado.

    
por 24.12.2016 / 11:16