Como modifico manualmente um inode?

2

Estou usando o Ubuntu Linux e, apenas por diversão, quero criar um link físico para um diretório (como visto aqui ). Porque eu estou apenas fazendo isso por diversão, eu não estou procurando por qualquer tipo de software de diretório-hardlink pré-desenvolvido que alguém escreveu, eu quero saber como fazer isso sozinho. Então, como eu diretamente, manualmente, modifico um inode?

Idealmente, gostaria que a resposta como um comando do Linux pudesse ser executado a partir da linha de comando do Bash, mas se não houver como fazer isso, também aceitarei informações sobre como fazer isso em C ou (como último recurso).

    
por Benubird 26.03.2013 / 12:05

1 resposta

8

Isso depende do sistema de arquivos. Para o ext4, você pode fazer isso com debugfs da seguinte forma:

dennis@lightning:/tmp$ dd if=/dev/zero of=ext4.img bs=1M count=100
104857600 bytes (105 MB) copied, 0.645009 s, 163 MB/s
dennis@lightning:/tmp$ mkfs.ext4 ext4.img 
mke2fs 1.42.5 (29-Jul-2012)
ext4.img is not a block special device.
Proceed anyway? (y,n) y
...
Writing superblocks and filesystem accounting information: done 
dennis@lightning:/tmp$ mkdir ext4
dennis@lightning:/tmp$ sudo mount ext4.img ext4
dennis@lightning:/tmp$ mkdir -p ext4/test/sub/
dennis@lightning:/tmp$ sudo umount ext4
dennis@lightning:/tmp$ debugfs -w ext4.img 
debugfs 1.42.5 (29-Jul-2012)
debugfs:  link test test/sub/loop
^D
dennis@lightning:/tmp$ ls ext4/test/sub/loop/sub/loop/sub/loop/sub/loop/sub/loop/
total 1
drwxrwxr-x 2 dennis dennis 1024 mrt 26 12:15 sub

Notas:

  • você não pode vincular diretamente ao pai, por isso foo/bar não pode ser um link para foo , daí o diretório extra.
  • Você não deve executar o debugfs em sistemas de arquivos montados. Se fizer isso, você precisará desmontar / montar depois de fazer alterações.

As ferramentas como find e ls ainda não serão reproduzidas:

dennis@lightning:/tmp$ find ext4
ext4
ext4/lost+found
find: 'ext4/lost+found': Permission denied
ext4/test
ext4/test/sub
find: File system loop detected; 'ext4/test/sub/loop' is part of the same file system loop as 'ext4/test'.
    
por 26.03.2013 / 12:23