Acho que a maioria das suas perguntas pode ser respondida simplesmente lembrando que, no Btrfs, um instantâneo não é realmente especial, é apenas um subvolume do Btrfs. Acontece que, quando é criado, tem conteúdo inicial em vez de estar vazio, e o espaço de armazenamento para esses conteúdos iniciais é compartilhado com qualquer subvolume do qual o instantâneo veio.
Um instantâneo é como uma cópia (completa), exceto por ser mais econômico devido ao armazenamento compartilhado.
- If I don't do snapshots, can you roll back a single file to several changes ago?
Não. Assim como com qualquer sistema de arquivos regular, modificar arquivos é destrutivo. Você não pode magicamente voltar para uma versão anterior.
- Can btrfs snapshots of root be used and thought of just like VMware/VirtualBox snapshots?
As imagens de disco da VM são geralmente dispositivos de bloco, não sistemas de arquivos ou arquivos em sistemas de arquivos, então acho que é um pouco diferente.
Você poderia usar um arquivo Btrfs como repositório de armazenamento para um dispositivo de bloco virtual da VM, eu acho. Nesse caso, a resposta a essa pergunta é sim. Exceto se você usar a opção NOCOW (que é realmente recomendada para imagens de disco). Então provavelmente não, porque copy-on-write é a magia que faz os snapshots funcionarem.
- I label snapshot A, make changes and label it B. If I go back to snapshot A and make changes (even just by booting changing /var/log), are those changes made in a "detached" or "unlabeled" snapshot, so those changes would be invisible if going back to B?
Cada subvolume (incluindo snapshots) no Btrfs tem um nome, portanto você não pode ter um snapshot "sem rótulo".
Em geral, as alterações feitas em um subvolume do Btrfs (se ele foi criado como um instantâneo ou não) não são absolutamente visíveis em outro subvolume do Btrfs. Basta lembrar que um instantâneo é como uma cópia, mas mais econômico.
- When deleting a file, is there "this file is deleted" metadata written, so space is still taken by all the versions of the file?
Ao excluir um arquivo, sua entrada de diretório é removida. Isso é uma modificação no diretório e, como todas as modificações, ele será privado para o subvolume no qual ocorreu. Então, depois disso, se e somente se o espaço de armazenamento para o arquivo não for usado por qualquer outra parte do sistema de arquivos, ele será liberado.
Excluir um arquivo cujo armazenamento é compartilhado entre vários instantâneos é muito parecido com a exclusão de um arquivo em qualquer sistema de arquivos comum quando ele possui vários links (físicos). O armazenamento [inode] é liberado se não for mais referenciado.
- If I build gcc from source, as an example, I think the build directory winds up being 5-8GB. If I build it periodically from source, I'm "chewing up" a bunch of hard drive space, right?
Se você criar gcc
várias vezes em vários diretórios diferentes, então sim, ele usará mais e mais espaço. Se você excluir cópias entre compilações ou sobrescrever o mesmo diretório de compilação a cada vez, então, não, não há nenhuma razão específica para continuar usando mais e mais espaço.