Manipulação do comportamento de captura instantânea ZFS da modificação, movimentação e renomeação de arquivos

2

Com o ZFS sendo descrito como mais como um banco de dados do que como um sistema de arquivos, parece razoável esperar que ele se comporte muito mais como um sistema de gerenciamento de versões, gerenciando de forma inteligente modificações, movimentações e renomeações de arquivos. As perguntas perguntam especificamente sobre os instantâneos, no entanto os instantâneos têm muito em comum com os clones e

  1. Quando um arquivo é modificado no ZFS após um instantâneo, o instantâneo terá o mesmo tamanho e apenas as diferenças ou o arquivo inteiro?
  2. Quando um arquivo é movido no ZFS após um instantâneo, o instantâneo permanecem essencialmente de tamanho zero?
  3. Quando um arquivo é renomeado no ZFS após um instantâneo, o instantâneo permanecerá essencialmente no tamanho zero?
  4. Quando um arquivo possui uma cópia com link físico após um instantâneo, o instantâneo permanecerá essencialmente vazio?

  5. Há uma sugestão de que o BTRFS é projetado para fazer basicamente as mesmas coisas que o ZFS, seria então esperado que ele tivesse os mesmos comportamentos nessas condições?

  6. Quando uma máquina Windows acessa o compartilhamento do ZFS remotamente pelo SAMBA, o mesmo comportamento acima é verdadeiro ou o SAMBA é um subconjunto das instruções padrão da unidade, ou seja, um movimento se torna uma cópia + exclusão?

  7. É possível responder às perguntas acima genericamente ou as respostas são todas específicas da implementação?

Conforme solicitado por um comentarista, o seguinte é um teste realizado nas operações descritas:

Informação do sistema:

  • kernel do CentOS 7 3.10.0
  • ZFS v0.6.5.9-1

.

                  'zpool list'           'zfs list'
      POOL        SIZE  ALLOC   FREE    USED   AVAIL  REFER

Criar pool: zpool create -m /test/mnt FILE-TEST /test/1.img /test/2.img

      FILE-TEST   224M  80.5K    224M    73K    192M    19K

Instantâneo: zfs snapshot FILE-TEST@1

      FILE-TEST   224M   122K    224M    73K    192M    19K
      FILE-TEST@1                          0       -    19K

Criar arquivo: echo ‘test’ > /test/mnt/test.txt

      FILE-TEST   224M   132K    224M    95K    192M    21K
      FILE-TEST@1                        17K       -    19K

Aumenta o tamanho do arquivo: 'head -c 128K /test/mnt/test.txt

      FILE-TEST   224M   678K   223M    490K    192M    148K
      FILE-TEST@1                        17K       -    19K

Instantâneo: zfs snapshot FILE-TEST@2

      FILE-TEST   224M   267K   224M    239K    192M    148K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                          0       -     48K

Edite o arquivo, altere os últimos 4 bytes.

      FILE-TEST   224M  1.07M   223M    386K    192M    148K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K

Instantâneo: zfs snapshot FILE-TEST@3

      FILE-TEST   224M   548K   223M    388K    192M    148K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                          0       -    148K

Renomear arquivo mv test.txt test2.txt

      FILE-TEST   224M   552K   223M    404K    192M    150K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K

Instantâneo: zfs snapshot FILE-TEST@4

      FILE-TEST   224M  1.06M   223M    645K    191M    150K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                          0       -    150K

Nova pasta: mkdir /test/mnt/subdir

      FILE-TEST   224M   716K   223M    420K    192M    151K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                         9K       -    150K

Instantâneo: zfs snapshot FILE-TEST@5

      FILE-TEST   224M   790K   223M    424K    192M    151K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                         9K       -    150K
      FILE-TEST@5                          0       -    151K

Mover arquivo: mv /test/mnt/test2.txt /test/mnt/subdir/

      FILE-TEST   224M   584K   223M    444K    192M    151K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                         9K       -    150K
      FILE-TEST@5                        10K       -    151K

Instantâneo: zfs snapshot FILE-TEST@6

      FILE-TEST   224M   602K   223M    447K    192M    151K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                         9K       -    150K
      FILE-TEST@5                        10K       -    151K
      FILE-TEST@6                          0       -    151K

Criar arquivo de link físico: cp -l /test/mnt/subdir/test2.txt /test/mnt/subdir/test3.txt

      FILE-TEST   224M   603K   223M    466K    192M    152K
      FILE-TEST@1                        17K       -     19K
      FILE-TEST@2                       138K       -    148K
      FILE-TEST@3                        10K       -    148K
      FILE-TEST@4                         9K       -    150K
      FILE-TEST@5                        10K       -    151K
      FILE-TEST@6                        12K       -    151K

Observações acima:

  • SIZE e FREE são muito constantes e consistentes com o espaço consumido de arquivo (s)
  • ALLOC é aleatório
  • REFERIR nos instantâneos parece igual ao REFER então atual no conjunto
  • Na maioria das operações, USADO nos snapshots é de cerca de 10 KB, exceto pela alteração do arquivo, na qual o USED é um pouco maior do que todo o tamanho do arquivo alterado.
  • USADO na piscina cresce em saltos desiguais
  • A REFER cresce gradualmente em torno de 1K por operação
  • Os instantâneos não atuais permanecem inalterados em tamanho
por J Collins 08.12.2017 / 12:00

1 resposta

1
  1. When a file is modified in ZFS after a snapshot, will the snapshot be the same size and only the differences, or the whole file?

Os blocos que são diferentes aumentam o tamanho.

Isto significa que se um arquivo consiste em 100 blocos e você modifica um único byte (assumindo que um byte é menor que um bloco), um novo bloco será adicionado (total de 101) no final, seu arquivo antigo fará referência a blocos 1 para 100 (pode ser acessado somente leitura a partir do instantâneo) e seu arquivo novo / atual fará referência aos blocos 1 a 37 e 39 a 101 (ou qualquer outra combinação, dependendo da operação de modificação real).

Assim que você destruir o snapshot, o bloco 38 será marcado como livre e poderá ser sobrescrito (desde que nenhum outro snapshot faça referência a ele).

  1. When a file is moved in ZFS after a snapshot, will the snapshot remain essentially zero size?

Dentro do mesmo sistema de arquivos, sim, além dos metadados (as referências devem ser reorganizadas, por exemplo).

Entre sistemas de arquivos, é uma operação de cópia completa + exclusão, mesmo se os sistemas de arquivos estiverem no mesmo pool ou descendentes uns dos outros.

  1. When a file is renamed in ZFS after a snapshot, will the snapshot remain essentially zero size?

Sim, além dos metadados (por exemplo, seu novo nome deve estar registrado em algum lugar).

  1. When a file has a hardlinked copy of itself after a snapshot, will the snapshot remain essentially empty?

Você poderia ser mais específico aqui?

  1. There is suggestion that BTRFS is designed to do largely the same things as ZFS, would it then be expected to have the same behaviours in these conditions?

Eu não diria que faz tudo igual.

  1. When a Windows machine accesses the ZFS share remotely over SAMBA, will the same behaviour above hold true or does SAMBA a subset of the standard drive instructions i.e. a move becomes a copy+delete?

Você tem duas implementações possíveis para o compartilhamento de arquivos do Windows - o servidor CIFS desenvolvido pela Sun para Solaris e opensourced com OpenSolaris / illumos, ou a implementação Samba SMB que é usada em quase todas as distribuições GNU / Linux e sistemas BSD:

  • A versão do Solaris é melhor adaptada aos recursos do ZFS (como a configuração de propriedades de compartilhamento diretamente nos sistemas de arquivos, a implementação de instantâneos do ZFS como versões anteriores do Windows.
  • Por outro lado, a versão do Samba é mais cross-plattform e tem alguns recursos mais avançados como suporte (parcial) SMB3, IIRC.

Eu assumo que no segundo caso você tem praticamente o mesmo que em outros sistemas, embora eu não tenha testado.

  1. Is it possible to answer the questions above generically or are the answers all implementation-specific?

Você pode responder especificamente de acordo com o código que está no repositório illumos / OpenZFS (repositório Github) se você gosta de ler o código C, ou você pode respondê-lo geralmente de acordo com as páginas de manual e documentação. Por exemplo, as propriedades REFER, USED, etc. são explicadas em detalhes. As páginas de manual mais interessantes são man zpool (hardware, layouts de disco, propriedades do pool), man zfs (propriedades do sistema de arquivos, snapshots, clones), man chmod (somente Solaris / illumos, ACLs de compartilhamento e arquivo) e man zdb (depuração e análise).

    
por 11.12.2017 / 09:24

Tags