É possível renomear um arquivo ou diretório usando o inode?

10

Alterei o diretório / home para uma partição diferente e não pude acessar os arquivos dele, algo que consegui resolver a partir dessa questão - Como você acessa o conteúdo de uma montagem anterior depois de alternar para uma partição diferente? .

Caso eu tenha notado o inode do diretório antes, seria possível usar isso sozinho para renomear o diretório?

    
por vfclists 04.10.2015 / 04:42

2 respostas

6

Você pode renomear um arquivo (diretório ou qualquer outro) usando apenas o conhecimento do inode usando find , mas se (a) o sistema de arquivos que o contém não estiver montado, ou (b) houver outro sistema de arquivos montado sobre um não -empty diretório que contém o arquivo que você está interessado, o arquivo simplesmente não é acessível pelo seu sistema. No caso (a), você precisa montar o sistema de arquivos antes de poder fazer qualquer coisa no conteúdo, incluindo renomear, e no caso (b), você precisa desmontar o sistema de arquivos que está montado "por cima" do diretório que contém o arquivo. arquivo que você deseja renomear. Parece que você está perguntando sobre o caso (b).

Se eu entendi corretamente, você está tentando tornar acessível o seu antigo diretório /home (que está localizado em sua partição raiz), enquanto ainda usa sua nova partição montada em /home . Se é isso que você quer, faça o seguinte:

Feche todos os arquivos e faça logout. Em seguida, efetue login como root (use um terminal virtual para isso - pressione Ctrl-Alt-F2) Execute o seguinte:

umount /home
mv /home /home-old
mkdir /home
mount -a
ls /home
ls /home-old

Se tudo estiver bem, faça o logout e faça login como você e tudo ficará bem.

Aliás, o comando para renomear um arquivo usando apenas o conhecimento de seu inode (assumindo que o arquivo está no diretório atual) é:

find . -maxdepth 1 -inum 123456789 -exec mv {} mynewname \;

Onde 123456789 é o número do inode, é claro. (Observe que find determina o nome do arquivo e seu caminho e passa essa informação para mv ; não há como renomear um arquivo sem envolver o nome de arquivo existente de forma alguma, mas se for só que você não sabe o nome do arquivo, é bem simples.

    
por 04.10.2015 / 05:34
5

Em um típico sistema de arquivos Unix, é estruturalmente impossível, em geral, mover um arquivo baseado no inode. O motivo é que renomear um arquivo significa remover sua entrada de diretório do diretório que a contém e criar um diretório em outro lugar. Mas o inode não contém um ponteiro para a entrada de diretório, ele contém apenas (ponteiros para) os metadados do arquivo (timestamps, permissões, etc.) e o conteúdo do arquivo.

Para um arquivo com vários links físicos, qual deles você estaria renomeando? O inode não é informação suficiente.

Para um diretório, em alguns sistemas de arquivos, seria possível agir somente com o inode:

  1. Leia o conteúdo do diretório, que é definitivamente acessível a partir do inode.
  2. Localize a entrada de diretório para .. . Isso aponta para o diretório pai.
  3. No diretório pai, procure uma entrada de diretório com o número de inode correto.

Isso faz várias suposições, no entanto:

  • E se houver várias entradas para o mesmo inode? Na verdade, isso não é um problema: dificilmente isso acontecerá na prática, já que a maioria das variantes unix proíbem links físicos explícitos para diretórios.
  • O .. existe em primeiro lugar? Isso depende do tipo de sistema de arquivos. Alguns sistemas de arquivos possuem uma entrada explícita para .. ; para outros, essas entradas são falsificadas pelo driver do sistema de arquivos. Se .. não existe, essa abordagem é fundamentalmente impossível.
  • Mesmo que o sistema de arquivos inclua .. links, há outro obstáculo que pode não ser óbvio: o passo 1 pode ser possível dentro do kernel, mas não há interface para ele. Muitas variantes do unix não possuem uma interface que permita abrir um arquivo através de seu inode, porque isso ignoraria as permissões. Por exemplo, um arquivo com permissões rwxr-xr-x (ou seja, legível por todos) localizado em um diretório com permissões rwx------ (ou seja, acessível apenas ao proprietário) não é acessível a ninguém, exceto ao proprietário do diretório. Isso não pode ser determinado apenas a partir do inode - o arquivo pode ser acessado através de outro link físico!

O resultado é que não, não é possível fazer nada, incluindo renomear, com um arquivo dado apenas seu inode. Você precisa ter um caminho para o arquivo.

A única maneira prática de agir em um arquivo, dado seu inode, é primeiro encontrar um caminho, por exemplo, com find -inum , e então usar o caminho para agir. Isso não ajuda em sua situação, onde o arquivo é sombreado por um ponto de montagem. Não há maneira portátil de acessar arquivos sombreados por um ponto de montagem; no Linux, como você descobriu, você pode usar uma montagem de ligação.

    
por 05.10.2015 / 01:44

Tags