Como criar um link físico para um inode (ext4)?

17

Se conheço o nó de índice (inode) de um arquivo, mas não conheço seu caminho (ou qualquer um de seus caminhos), é possível criar um link físico para esse inode diretamente?

Eu poderia encontrar o arquivo usando sudo find / -inum 123546e, em seguida, criar um link físico, mas isso seria muito lento para o meu aplicativo.

NB eu estou usando um sistema de arquivos ext4.

Uma pedra
fonte
11
Intimamente relacionado: remover ou renomear um arquivo por meio de seu inode (ambos os quais são igualmente impossíveis de serem feitos diretamente).
Gilles 'SO- stop be evil' (

Respostas:

23

AFAIK, não com a API do kernel. Se essa interface existisse, teria que ser limitada ao superusuário, caso contrário, isso permitiria que qualquer pessoa acessasse arquivos em diretórios aos quais não tem acesso de pesquisa.

Mas você pode usar debugfsno sistema de arquivos (uma vez desmontado) para fazer isso (supondo que você tenha acesso de gravação ao dispositivo de bloco).

debugfs -w / dev / block / device

(substitua /dev/block/devicepelo dispositivo de bloco real no qual o sistema de arquivos reside).

Em seguida, no prompt de debugfs, digite

stat < 123 >
(com os colchetes angulares, substituindo 123 pelo número real do inode) para verificar se o arquivo existe (inode possui uma contagem de links maior que 0) e não é um diretório.

Se tudo estiver bom, digite:

Em < 123 > caminho / para / novo arquivo
para criar o hardlink (observe que o caminho é relativo à raiz do sistema de arquivos). Seguido por:

mi < 123 >
para aumentar a contagem de links (pressione Enterpara todos os campos, exceto a contagem de links em que você deseja adicionar 1 ao valor atual).

Stéphane Chazelas
fonte
6
Essa interface também precisaria verificar se o arquivo tem uma contagem de links diferente de zero; caso contrário, seria possível ressuscitar um arquivo excluído, mas ainda aberto, que o IIRC foi rejeitado por violar os invariantes do kernel.
Gilles 'SO- stop be evil' (
2
@Gilles related: unix.stackexchange.com/a/499760/308316
mosvy
11
@PhilipCouling, o bit de permissão de execução em um diretório se traduz em permissão de pesquisa . Eu já disse nos diretórios, então não tem acesso à pesquisa .
Stéphane Chazelas 12/03/19
3
@OrangeDog, permissão de pesquisa é a terminologia usada pelo padrão POSIX.
Stéphane Chazelas 12/03/19
11
@mosvy: Essa verificação pode ser removida do kernel. Você precisa consertar alguns lugares no VFS para que ele não se manche. Eu fiz isso enquanto trabalhava na minha tese anos atrás.
Joshua
3

Dependendo do seu caso de uso, outra abordagem pode ser a primeira a coletar todos os candidatos a arquivos em um diretório, vinculando-o com força e, em seguida, vinculando com força os arquivos nos quais você está particularmente interessado.

Tal como

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(supondo que seus números de inode sejam todos inferiores a 1.000.000, crie mais diretórios, se necessário).

Posteriormente, seus inodes são agrupados em 1000 e coletados na by-inode/árvore. A partir daí, você pode vinculá-los conforme necessário.

Observe que isso significa que a exclusão de arquivos em <path>não recuperará o espaço por causa desse link físico extra.

glglgl
fonte