mount -t cifs fornece números de inode semi-aleatórios

2

Eu tenho um aplicativo que requer que os inodes sejam persistentes em montagens, reinicializações etc.
Com mount -t cifs -o serverino , é suposto fazer isso (com suporte ao servidor). Mas, quando eu montar, alguns conjuntos aleatórios de arquivos e diretórios terão IDs seqüenciais geradas pelo cliente < 2 ^ 32.

Eu tentei várias combinações de coisas, incluindo -o nounix -o serverino -o mfsymlinks -o noacls e muitas outras, mas nenhuma delas parece alterar a aleatoriedade das coisas.

Sempre que retornar o > 2 ^ 32 inode, parece ser consistente para um determinado arquivo / diretório, tanto quanto eu já vi muitas tentativas de montagem (não confirmadas exaustivamente), mas uma alta proporção ainda um conjunto aleatório de arquivos tem pequenos números de inode que incrementam monotonicamente na saída da lista.

O servidor é o Windows2012R2. Os clientes são o CentOS e o Ubuntu Linux com kernels recentes. Um tem 3.10.0 e o outro tem 4.4.0

Existe alguma coisa que pode ser definida no lado do cliente ou no lado do servidor para dar o UniqueId ou o FileID de volta ao cliente como o inode quando montado assim?

(experimentado nos protocolos vers 1, 2.1 e 3.0)

    
por DougH 03.02.2018 / 19:20

1 resposta

2

De acordo com a documentação mount.cifs(8) , passando a opção serverino deve habilitar os números de inodes do lado do servidor, mas somente se você tiver "CIFS UNIX Extensions" disponíveis no servidor (veja a seção "INDE NUMBERS"):

When Unix Extensions are enabled, we use the actual inode number provided by the server in response to the POSIX calls as an inode number.

When Unix Extensions are disabled and "serverino" mount option is enabled there is no way to get the server inode number. The client typically maps the server-assigned "UniqueID" onto an inode number.

Note that the UniqueID is a different value from the server inode number. The UniqueID value is unique over the scope of the entire server and is often greater than 2 power 32. This value often makes programs that are not compiled with LFS (Large File Support), to trigger a glibc EOVERFLOW error as this won't fit in the target structure field. It is strongly recommended to compile your programs with LFS support (i.e. with -D_FILE_OFFSET_BITS=64) to prevent this problem. You can also use "noserverino" mount option to generate inode numbers smaller than 2 power 32 on the client. But you may not be able to detect hardlinks properly.

Não está diretamente indicado na documentação , mas você provavelmente precisará do "CIFS POSIX Extensions" ( CONFIG_CIFS_POSIX kernel option) para ser ativado no kernel.

Como o Windows Server 2012 não tem essas extensões, convém habilite o recurso NFS Server ao invés de e use isso.

BTW, cifs não é o único sistema de arquivos onde este é o caso: os sistemas de arquivos /sys , /dev e /proc podem exibir esse comportamento também.

    
por 03.02.2018 / 22:42