Por que você não pode renomear (ou mover) um ponto de montagem?

2

Eu posso mover o diretório pai de um ponto de montagem da seguinte forma:

$ mkdir -p f/mnt
$ bindfs --no-allow-other f/mnt f/mnt
$ mv f g
$

Mas não consigo renomear o próprio ponto de montagem:

$ mv g/mnt g/m
mv: cannot move 'g/mnt' to 'g/m': Device or resource busy

Existe uma razão de segurança, compatibilidade ou implementação para essa distinção?

A versão do meu kernel é 4.17.19-200.fc28.x86_64.

    
por sourcejedi 11.09.2018 / 19:08

3 respostas

0

Sim: motivos de compatibilidade que afetam a segurança.

Esta restrição foi deliberadamente não removida, por uma razão relatada fielmente pelo LWN.net. Remover a restrição criaria uma falha de segurança em algumas versões de fusermount . fusermount foi melhorado mais cedo adicionando UMOUNT_NOFOLLOW , e isso o tornou seguro. No entanto, as versões antigas do fusermount ainda eram bastante difundidas para serem uma preocupação.

Veja Remoção e renomeação do ponto de montagem , LWN.net 2016.

Tanto quanto eu posso dizer a partir do segmento ligado, os patches 1-3 teriam permitido mover um ponto de montagem. E então o patch 4 foi adicionado para proibi-lo: -).

Esta não é uma prova completa. No entanto, sugere que a restrição no patch 4 não foi devida a razões internas de implementação . Eu também acredito que os desenvolvedores do kernel teriam mencionado, se tivessem alguma idéia de que as expectativas do usuário teriam sido quebradas, permitindo que pontos de montagem fossem movidos.

@schily, no entanto, aponta que é algo estranho sobre permitir que os pontos de montagem sejam movidos (ou desvinculados). Parece que foi possível para permitir rename() de um ponto de montagem. Mas apenas porque foi interpretado como renomeando o arquivo subjacente ao (s) sistema (s) de arquivos montado (s).

Seria uma exceção estranha à regra atual, que rename(oldpath, newpath) requer que o oldpath e o newpath estejam no mesmo sistema de arquivos. Caso contrário, falhará com o EXDEV. (Na verdade, eles devem ser na mesma montagem do sistema de arquivos ).

Pensei em um pouco de estranheza extra no Linux. Se você definir o "bit imutável" do Linux no arquivo subjacente, acho que o rename () deve ser negado. Mas se você inspecionar o bit imutável no ponto de montagem, você não verá o bit imutável do arquivo subjacente! Eu espero que funcione bem, seria apenas um pouco chato se você tivesse que solucionar o problema.

    
por 13.09.2018 / 00:56
2

A resposta de Schily sobre por que isso não está funcionando é correta.

No entanto, você pode mover os próprios pontos de montagem no Linux. Usando o exemplo da pergunta, a maneira correta de fazer isso é:

mount --move g/mnt g/m

O diretório de destino (neste caso, g/m ) tem que ser um local válido para um ponto de montagem (o diretório deve existir, etc.) e você deve estar executando com privilégios de root (ou CAP_MOUNT). essencialmente sem restrições.

Esta operação atualizará todas as estruturas de dados gerenciadas pelo kernel que referenciam esse ponto de montagem, incluindo entradas da tabela de montagem (dentro do namespace de montagem atual), descritores de arquivos abertos, diretórios raiz e atuais para execução de programas e algumas outras coisas, por isso é (razoavelmente) seguro fazer isso em um ponto de montagem em uso ativo.

A ressalva é que qualquer coisa que esteja em execução e use caminhos em vez de descritores de arquivo pode não manipulá-la adequadamente (por exemplo, mover a raiz do seu site dessa maneira provavelmente interromperá o site, porque a maioria dos servidores da Web não se mantém aberta referências a todos os arquivos do site).

Você também pode achar o comando pivot_root interessante, é um caso especial de mover um ponto de montagem (ele troca dois pontos de montagem e atualiza a raiz e o diretório atual de tudo no sistema) e é usado durante a inicialização a maioria dos sistemas Linux modernos para alternar do initramfs para o sistema de arquivos raiz real.

    
por 11.09.2018 / 21:31
1

Você não pode renomear o diretório raiz de um sistema de arquivos e é isso que você gosta de fazer.

Se você montar o sistema de arquivos pelo NFS com o ponto de montagem subjacente, poderá renomeá-lo, pois isso permite que você veja o ponto de montagem descoberto.

Segundo plano: se algo for montado em uma entrada no sistema de arquivos, isso ocultará o arquivo original, mas será necessário renomear o arquivo original. O que você vê é o diretório raiz do filesytem montado e que não pode ser renomeado.

    
por 11.09.2018 / 19:26

Tags