Eu acho que a opção 3, como você descreveu acima, é provavelmente sua melhor aposta. O maior problema com o que você deseja é que o ZFS realmente manipule apenas essa cópia na gravação no nível do conjunto de dados / instantâneo.
Sugiro strongmente evitar o uso de dedup, a menos que você tenha verificado se funciona bem com o seu ambiente exato. Eu tenho experiência pessoal com dedup trabalhando muito bem até que mais um usuário ou VM store seja movido, e então ele cai de um cliff de performance e causa muitos problemas. Só porque parece que está funcionando muito bem com seus primeiros dez usuários, sua máquina pode cair quando você adiciona o décimo primeiro (ou décimo segundo, ou décimo terceiro, ou qualquer outro). Se você quiser seguir esse caminho, certifique-se de ter um ambiente de teste que imite exatamente seu ambiente de produção e que ele funcione bem nesse ambiente.
De volta à opção 3, você precisará configurar um conjunto de dados específico para armazenar cada uma das árvores do sistema de arquivos que deseja gerenciar dessa maneira. Depois de configurá-lo e preenchê-lo inicialmente, tire seus instantâneos (um por conjunto de dados que será um pouco diferente) e promova os clones. Nunca toque no conjunto de dados original novamente.
Sim, esta solução tem problemas. Não estou dizendo que não, mas dadas as restrições do ZFS, ainda é provavelmente o melhor. Eu encontrei essa referência para alguém que usa clones com eficiência: link
Não estou familiarizado com o btrfs, mas se ele suportar as opções desejadas, você considerou configurar um servidor separado apenas para suportar esses conjuntos de dados, usando o Linux e o btrfs nesse servidor?