A operação "copy a file"
não é uma operação básica do sistema de arquivos, como read
, write
, open
, close
e operações semelhantes. Veja esta página para uma boa explicação das operações que um sistema de arquivos deve suportar.
E são todos os sistemas de arquivos, seja ext4
, btrfs
ou nfsv4
.
Observe que não há como saber por que um processo abre o arquivo A, abre o arquivo B, lê o arquivo A e grava no arquivo B. Portanto, em geral, não há como "causar curto-circuito" e otimizar a cópia de um arquivo para que os dados não precisem atravessar a rede duas vezes, no caso do arquivo A e do arquivo B estarem em sistemas de arquivos NFS, mesmo que sejam compartilhados no mesmo servidor NFS.
Muitos sistemas operacionais fornecem chamadas do sistema como sendfile()
, que não copia dados de forma eficiente removendo a necessidade de copiar os dados de e para o espaço do usuário e, em teoria, isso poderia ser feito no nível do sistema de arquivos para copiar arquivos, mas mesmo assim haveria restrições semelhantes às dorename()
operação - tal operação hipotética de copyfile()
provavelmente teria que ser restrita ao curto-circuito somente daquelas cópias dentro de um único sistema de arquivos. Fazer o contrário criaria uma confusão complexa - o que fazer se o arquivo A e o arquivo B estiverem no mesmo servidor NFS, um cliente quiser copiar de um para outro, mas o arquivo A estiver em um sistema de arquivos ext4 e o arquivo B estiver ativado outro sistema de arquivos XFS?