Antecedentes
Digamos que tenhamos a seguinte configuração de diretório:
$ ll
total 0
-rw-r--r-- 2 root root 0 Jul 29 23:36 afile.txt
-rw-r--r-- 2 root root 0 Jul 29 23:36 hL
lrwxrwxrwx 1 root root 9 Jul 30 01:22 sL -> afile.txt
Agora, vamos analisar suas duas perguntas.
Perguntas
- If a hard link /hL is given, pointing to the inode of the above file, in what order is the disk accessed?
Com hardlinks, eles possuem a mesma referência de inode que o arquivo / diretório original para o qual estão apontando. Portanto, não há acesso adicional ao HDD para lê-los.
Por exemplo:
$ stat hL | head -3
File: ‘hL’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 667668 Links: 2
vs.
$ stat afile.txt | head -3
File: ‘afile.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 667668 Links: 2
A única diferença entre esses dois é o nome. Assim, qualquer caminho terá o mesmo número de acessos ao disco rígido.
- If a soft link /sL is given, pointing to the above file, in what order is the disk accessed?
Com links suaves, no entanto, há um acesso adicional ao HDD. Esse acesso adicional seria contra os metadados do diretório, onde o arquivo sL
reside. Isso retornaria detalhes indicando que esse arquivo é, na verdade, um link simbólico e está apontando para outro arquivo / diretório.
Por exemplo:
$ stat sL | head -3
File: ‘sL’ -> ‘afile.txt’
Size: 9 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 681295 Links: 1
Aqui podemos ver que é do tipo 'link simbólico' e está apontando para afile.txt
. Observe também que ele tem um inode diferente (681295 vs. 667668), mais uma prova de que isso vai custar uma leitura adicional.
Então, quais são as ordens de leitura?
Se você usa strace
contra o próprio Bash shell, no qual você está executando comandos nesses arquivos / diretórios, pode ter uma ideia de como as coisas funcionam.
[pid 18098] stat("/tmp/adir/hL", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
[pid 18098] open("/tmp/adir/hL", O_RDONLY) = 3
[pid 18098] fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
Aqui está a saída do comando more /tmp/adir/hL
.
Para /tmp/adir/hL
:
- stat / open (/) → stat / open (tmp) → stat / open (adir) → stat / open (hL)
Para /tmp/adir/sL
:
- stat / open (/) → stat / open (tmp) → stat / open (adir) → stat / open (sL) → stat / open (afile.txt)
Mais detalhes
A página da Wikipédia sobre links simbólicos ilude a tudo isso também:
Although storing the link value inside the inode saves a disk block and a disk read, the operating system still needs to parse the path name in the link, which always requires reading additional inodes and generally requires reading other, and potentially many, directories, processing both the list of files and the inodes of each of them until it finds a match with the link's path components. Only when a link points to a file in the same directory do "fast symlinks" provide significantly better performance than other symlinks.