Por que “cp -R --reflink = always” executa uma cópia padrão em um sistema de arquivos btrfs?

12

O Btrfs suporta Copy-On-Write. Eu tentei usar esse recurso para clonar um diretório:

cp -R --reflink=always foo_directory foo_directory.mirror

Eu esperava que o comando terminasse quase instantaneamente (como a btrfs subvolume snapshot), mas o cpcomando parece executar uma cópia lenta e padrão.

De acordo com a página do manual, eu esperava --reflink=alwaysaplicar o Copy-On-Write:

Quando --reflink [= sempre] for especificado, execute uma cópia leve, na qual os blocos de dados são copiados apenas quando modificados. Se isso não for possível, a cópia falhar ou se --reflink = auto for especificado, volte para uma cópia padrão.

Questões:

  • Você sabe por --reflink=alwaysque não funciona?
  • Quais opções (ou outros comandos) devo usar?
Philipp Claßen
fonte

Respostas:

20

cp --reflink=alwaysestá quase certamente funcionando corretamente. Se não fosse, você estaria recebendo um erro. Por design, essa é a diferença entre --reflink=alwayse --reflink=auto. O erro ficaria assim:

# Filesystem that does not support the feature at all
cp: failed to clone `xx' from `yy': Inappropriate ioctl for device

# Filesystem that does support it, but copy across filesystems
cp: failed to clone `xx' from `yy': Invalid cross-device link

Você está copiando uma estrutura de diretórios com muitos arquivos pequenos? Nesse caso, cpainda é necessário criar todos os diretórios e abrir e fechar todos os arquivos, por isso ainda levará tempo, ao contrário btrfs subvolume snapshot. Isso provavelmente explica o tempo necessário para executar a operação.

Celada
fonte
3
Sim, ele contém um grande número de arquivos, a maioria deles pequenos arquivos de texto. Eu não sabia que o cp ainda precisa processar todos os arquivos. Obrigado, essa foi a parte que eu não entendi. Penso que, no meu caso de uso, é melhor criar um instantâneo gravável.
Philipp Claßen
1
Sim, se você pode criar um instantâneo, vá em frente. cp --reflink=alwaysainda pode ser útil quando o que você está tentando clonar não é a raiz de um subvolume, pois btrfs subvolume snapshotopera apenas em subvolumes, não em partes de subvolumes.
Celada