Como os instantâneos do sistema de arquivos são diferentes de simplesmente fazer uma cópia dos arquivos?

4

fazendo isso,

# btrfs subvolume snapshot /mnt/1 /mnt/1/snapshot
# tree /mnt/1
/mnt/1
├── a
├── snapshot
│   ├── a
│   └── subv
└── subv
    └── b

3 directories, 3 files

Podemos criar um instantâneo de / mnt / 1 no btrfs.

Minha pergunta é: qual é a vantagem de usar o snapshot, do que usar o rsync para um sistema de arquivos de backup simples?

    
por BufBills 07.01.2014 / 00:13

4 respostas

6

O instantâneo pode ser visto como um caso especial, mas distinto, da cópia.

Não estou familiarizado com os detalhes do Btrfs, mas o seguinte se aplica ao ZFS, do qual o Btrfs atrai muita inspiração. Aparentemente Os snapshots do Btrfs são realmente de leitura / gravação , tornando-os mais semelhantes a Clones do sistema de arquivos ZFS , mas isso não altera sua relação com as cópias de arquivos.

Um instantâneo é uma cópia somente leitura, point-in-time, do estado do sistema de arquivos.

Isso funciona porque o Btrfs e o ZFS são os chamados sistemas de arquivos Copy On Write. Sempre que um bloco de dados é alterado, os dados alterados são gravados em um local no disco diferente da cópia original. A principal vantagem disso é que ela aumenta muito a confiabilidade: como muito poucos dados precisam ser sobrescritos, há uma possibilidade muito reduzida de um problema que leva à perda de dados. No entanto, também há outras vantagens. Uma dessas vantagens é que você pode fazer snapshots em nível de sistema de arquivos com eficiência. Uma desvantagem importante é que, à medida que seu armazenamento é preenchido, ele tende a aumentar muito a fragmentação de armazenamento à medida que o alocador de bloco se esforça para encontrar em algum lugar, em qualquer lugar, para armazenar fisicamente a cópia. De fato, é recomendado manter o uso do pool do ZFS abaixo de 80% , presumivelmente não pelo menos por esse motivo exato.

Um instantâneo diz basicamente ao código do sistema de arquivos "esses blocos ainda são necessários". Assim, eles não serão recuperados e potencialmente sobrescritos com novos dados. No entanto, eles ainda fazem referência aos mesmos blocos de dados antigos.

Agora, como isso é diferente de simplesmente fazer uma cópia usando o rsync, cp, cat ou o que for? É diferente porque até que os dados realmente mudem, nenhuma cópia física adicional dos dados é feita.

É como hardlinks em stereoids; a mesma cópia física em disco dos dados é usada ao acessar um arquivo com nomes diferentes. A diferença é que, com hardlinks, uma alteração no arquivo sob um nome se propaga para todas as outras cópias, pois elas realmente fazem referência aos mesmos blocos de dados. Com copy-on-write e snapshot, os blocos alterados só aparecem no local onde foram alterados. (Com snapshots somente leitura, isso significa na versão "atual" do arquivo.) Você também só precisa reescrever os blocos que foram realmente alterados; os blocos restantes são deixados exatamente onde estão. Para fazer coisas como fazer snapshot de arquivos contendo imagens de disco da VM por exemplo, isso pode fazer uma diferença maciça na quantidade de dados necessários para armazenar no disco.

Então, para recapitular:

  • A captura instantânea exige apenas o espaço em disco exigido pelos blocos modificados. A cópia requer o número de cópias vezes o tamanho do arquivo.
  • As capturas instantâneas são somente leitura ou leitura / gravação, dependendo do design do sistema de arquivos. As cópias são de leitura / gravação por design.
  • As cópias são independentes. Os snapshots fazem referência aos mesmos blocos de dados que a versão atual do arquivo, até que a versão atual do arquivo seja alterada (no todo ou em parte).
por 07.01.2014 / 08:46
4

Os instantâneos não fazem backups. Pense neles como um conjunto sofisticado de hardlinks copy-on-write (que são consequentemente limitados à mesma partição btrfs) que você poderá montar como um sistema de arquivos aparentemente separado (no futuro você poderá usar diferentes opções de montagem para cada subvolume (= instantâneo)).

Somente com rsync você copia os dados.

No BTRFS, graças à imutabilidade dos dados reais armazenados no disco (a menos que você monte com --nodatacow ), é possível ter duas cópias do arquivo idêntico armazenado na área compartilhada na unidade, mas sem nenhum lado efeitos de links simbólicos ou hardlinks. Existe até uma ferramenta "bedup" que verifica sua partição btrfs e libera o espaço no disco rígido usado por arquivos idênticos.

Esse recurso BTRFS também se integra ao programa cp : da perspectiva do usuário, o cp --reflink <source> <dest> não difere da cópia normal, embora seja muito mais rápido. Na verdade, não copia os dados. A cópia será feita de forma transparente pelo sistema de arquivos, sempre que você tentar realmente modificar qualquer arquivo de destino ou fonte. E isso é verdade para qualquer arquivo que você modifique, não apenas os que foram copiados com --reflink . É por isso que é chamado de sistema COW (COW = Copy On Write)

    
por 07.01.2014 / 08:32
0

A principal diferença entre um instantâneo e uma cópia com cp -a --reflink para o mesmo sistema de arquivos é que o instantâneo é muito mais rápido (quase instantâneo); o desempenho não depende de quantos arquivos existem no subvolume original. Há também uma diferença menos fundamental, o que eu acho um pouco inconveniente: o snapshot só copia o volume em si, e subvolumes aninhados aparecerão como diretórios vazios dentro do snapshot. Para completar, o --reflink flag pede ao cp para usar o syscall do reflink, que é rápido e permite o compartilhamento de espaço nos sistemas de arquivos COW, em vez de copiar os dados lendo de um arquivo e gravando no outro.

    
por 07.01.2014 / 19:37
0

Os instantâneos podem ser enviados para outro BTRFS em um disco ou máquina separada usando btrfs send . Essa operação pode ser extremamente rápida e eficiente ao executar transferências instantâneas incrementais, pois o BTRFS só enviará as diferenças desde o último instantâneo transferido. Isso é superior ao rsync / cp em muitos casos ( link )

Não creio que você possa enviar uma pasta rsync 'd via btrfs send . O mesmo para uma pasta copiada via cp -a --reflink=true

Também , a resposta aceita (do Michael) não inclui o fato de que, para o Btrfs, você pode usar cp -a --reflink=true , que se comporta em muitos aspectos como um instantâneo de um diretório arbitrário. Significando "até que os dados realmente mudem, nenhuma cópia física adicional dos dados é feita." (então nenhum espaço extra é usado e a operação é extremamente rápida).

Observe também que cp -a --reflink=true é diferente de cp -al . Apenas os blocos comuns são referenciados, portanto, modificar um arquivo não modifica o outro. Até onde sei, o ZFS não suporta esse recurso.

    
por 07.01.2016 / 03:33