11 votos

Comprender la magia negra de firmlink APFS

Poco a poco estoy llegando a un acuerdo con la magia negra detrás de la división del sistema APFS / volumen de datos. Hoy, sin embargo, he encontrado un artefacto que simplemente no entiendo: archivos que existen y no existen simultáneamente.

La cuestión es: en la secuencia siguiente, ¿por qué ls y find ver una vista fusionada a veces y otras no?

Por ejemplo, sabemos que /usr/share contiene entradas tanto del volumen de sistema (inodos de alta numeración) como una del volumen de datos (inodos de baja numeración, concretamente snmp ):

# ls -li /usr/share
total 8
...
1152921500312798809 drwxr-xr-x    2 root  wheel    64 Jan  1  2020 skel
            4054997 drwxr-xr-x   28 root  wheel   896 Jan  1  2020 snmp
1152921500312798811 drwxr-xr-x    6 root  wheel   192 Jan  1  2020 tabset
...

Tiene sentido, por tanto, que al inspeccionar el volumen de Datos sólo se muestren las entradas de Datos:

# ls -li /System/Volumes/Data/usr/share
total 0
4054997 drwxr-xr-x  28 root  wheel  896 Jan  1  2020 snmp

Como era de esperar, find ve todos los archivos a través de / y sólo los archivos de datos a través de /System/Volumes/Data independientemente de -x :

# find /usr/share | grep '^/usr/share/' | wc -l
   14956
# find -x /usr/share | grep '^/usr/share/' | wc -l
   14956
# find /System/Volumes/Data/usr/share | grep '^/System/Volumes/Data/usr/share/' | wc -l
     179
# find -x /System/Volumes/Data/usr/share | grep '^/System/Volumes/Data/usr/share/' | wc -l
     179

Sin embargo, aquí es donde las cosas se ponen extrañas. Si hago la misma búsqueda desde un nivel más arriba, de repente obtengo la vista combinada en ambos sentidos:

# find /usr | grep '^/usr/share/' | wc -l
   14956
# find -x /usr | grep '^/usr/share/' | wc -l
   14956
# find /System/Volumes/Data/usr | grep /System/Volumes/Data/usr/share/ | wc -l
   14956
# find -x /System/Volumes/Data/usr | grep /System/Volumes/Data/usr/share/ | wc -l
   14956

Puede ver el mismo comportamiento si compara las salidas de ls :

# ls /usr/share
# ls /System/Volumes/Data/usr/share
# ls -R /System/Volumes/Data/usr

He estado escarbando en el código de find y fts sin embargo, y no veo ninguna trampilla para firmlinks.

Curiosamente, la versión Gnu de estas herramientas no ven la vista fusionada, por lo que es algo en la versión de Apple.

¿Qué me estoy perdiendo?

1voto

Jörg W Mittag Puntos 1171

El comportamiento de chdir y fchdir parece estar roto. Considere el siguiente ejemplo mínimo:

#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, const char * argv[]) {
    chdir("/System/Volumes/Data/usr/libexec");
    assert(strcmp(getwd(NULL), "/System/Volumes/Data/usr/libexec") == 0);

    chdir("cups");
    assert(strcmp(getwd(NULL), "/System/Volumes/Data/usr/libexec/cups") == 0); // will be "/usr/libexec/cups" instead.

    return 0;
}

Tenga en cuenta que no puede reproducirlo en una shell (por ejemplo, Zsh) porque su chdir desenrollará la ruta relativa en una ruta absoluta (es decir. /System/Volumes/Data/usr/libexec/cups ) antes de cambiar el directorio actual.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X