Por que não vejo um arquivo sendo copiado imediatamente com ls?

2

É devido ao buffer na memória? Eu fiz cp /network/large_file . & e continuei fazendo ls -lh para monitorar o progresso, mas o arquivo não apareceu até que tivesse cerca de 400MB. Kernel do Linux 2.6, Bash 4, 4GB de swap, 16GB de RAM.

    
por Gregg Leventhal 30.08.2013 / 16:16

1 resposta

2

Isso provavelmente depende de seu sistema de arquivos subjacente, possíveis buffers de disco rígido, buffers do controlador RAID (se você estiver usando raid), etc. Quando um arquivo é copiado, ele primeiro inicia o fluxo na memória, notificando o disco uma operação de gravação pendente - e o disco cuida disso de lá. É muito comum que uma gravação tenha "concluído", mas o arquivo ainda está sendo gravado pelo disco. Alguns sistemas de arquivos evitam esse "atraso", como o ZFS, e acredito que o BtrFS (conhecido como copy-on-write). Outros sistemas de arquivos informarão que a operação de cópia / gravação está completa quando não estiver realmente - o que pode levar à corrupção do arquivo se a energia for perdida, etc. O ZFS e o BtrFS não relatam ao SO que uma operação de gravação de arquivo está concluída até está totalmente completo - evitando esta situação.

Para testar isso, tente fazer uma cópia de algo maior - como uma iso de DVD da sua distribuição favorita de um diretório para outro. A linha de comando retornará ao prompt em pouco tempo, mas se você digitar imediatamente sync e enviar o comando, perceberá que ele irá travar a linha de comando até que a operação de gravação esteja totalmente concluída. (se você tiver luzes de atividade de disco, você também notará que elas ainda estão piscando)

    
por 30.08.2013 / 17:38

Tags