Pelo que entendi, os subvolumes btrfs compartilham o mesmo sistema de arquivos "storage", então fiquei surpreso em saber que mover arquivos entre subvolumes diferentes é uma operação cara, como se mover entre sistemas de arquivos diferentes (copy + delete).
Fiquei especialmente surpreso quando alguém sugeriu esta solução alternativa: copiar arquivos entre subvolumes e depois excluir os originais. Diz-se que esta é uma operação barata (movendo-se apenas em metadados). Como é que subvolumes diferentes podem compartilhar blocos de dados ao usar COW, mas não na operação mais fácil de mover dados?
file-transfer
benchmarking
btrfs
m.alessandrini
fonte
fonte
mv
tentará um reflink antes de retornar a uma cópia padrão ( changelog ).cp --reflink
entre dois subvolumes, fui forçado a montar o subvolume de nível superior e emitir ocp
comando dentro desse namespace , caso contrário,cp
sairia com um erro dizendo...Invalid cross-device link
Respostas:
mv usa o renomear syscall para tentar o movimento. A renomeação de kernel do btrfs detecta a movimentação de subvolumes cruzados e explicitamente desaprova isso (mesmo se sob o mesmo ponto de montagem):
Isso provavelmente tem a ver com a contabilidade de subvolume inode e os caminhos de código que essas operações executam. A cópia do reflink está realmente criando novos metadados (mas os dados em si são CoW) contabilizados no novo subvolume. Em teoria, eles provavelmente poderiam fazer a renomeação "mover" os metadados fazendo algo similar ao que a cópia --reflink seguiu a rm source ... simplesmente ninguém fez o esforço para fazê-lo.
fonte