Crie um dispositivo de loop de cache de gravação para um dispositivo de bloco muito maior

4

Então, longa história curta. * Eu tinha um array RAID5 de 5,5 TB com um controlador HP. * A HP usa um algoritmo RAID5 realmente doloroso (ref: Parity atrasada) * Escrevi um novo driver de bloco que traduz as solicitações para um novo dispositivo de bloco que ele cria, para os antigos discos do HP array - a tradução é de 1 via (somente leitura).

Então eu tenho um "array" de 5.5TB que parece ser montado corretamente, o módulo do sistema de arquivos EXT4 reclama um pouco sobre o jornal não ser 100%, alguns diretórios não são legíveis devido a erros, mas o resto do os dados parecem intactos o suficiente para acreditar que o driver do meu bloco está fazendo a coisa certa.

Mas eu sou muito cauteloso. Eu não quero apenas ativar o modo somente leitura e executar o fsck no sistema de arquivos apenas para descobrir que ele o destrói por causa de algo que eu não havia considerado.

O que eu gostaria de fazer é mapear o dispositivo de bloco para um dispositivo de loop em um nível de bloco; então eu posso rodar o fsck nele (as gravações serão armazenadas em cache no dispositivo de loop) e as leituras serão sindicalizadas (se nenhuma gravação for gravada para esse setor - leia o dispositivo de bloco, se houver, leia o dispositivo de loop).

O problema é que eu não tenho espaço em disco suficiente para criar um arquivo de 5,5 TB - mesmo este provisionado - para atuar como um cache de gravação, e parece uma perda de tempo já que provavelmente haverá apenas alguns GB de gravações - máximo, pois o fsck faz o seu trabalho.

A pergunta: Existe uma maneira de fazer um loopback / união do dispositivo de bloco em um arquivo, essencialmente em tamanho zero para começar, que irá crescer com as gravações que eu faço?

Obrigado antecipadamente.

    
por Litch 06.12.2014 / 10:43

1 resposta

2

Você pode usar o dm-snapshot ou o NBD no modo copy-on-write.

A solução dm-snapshot é fornecida aqui (desculpe por não repetir):

link

Quanto ao NBD, você pode instalar nbd-server e nbd-client e usá-lo da seguinte forma:

mount /mnt/storage # something with some free space
losetup --read-only /dev/sda1 /dev/loop0 # to ensure it's readonly
ln -s /dev/loop0 /mnt/storage/loop0
nbd-server 127.0.0.1@4242 /mnt/storage/loop0 -c

O link simbólico é necessário porque nbd-server insiste em armazenar o arquivo de cache de gravação temporário no mesmo local do arquivo que está sendo exibido. Então, sem o link, ele acabaria em /dev/ , o que não é útil.

Por fim, conecte-se a ele com o cliente:

nbd-client 127.0.0.1 4242 /dev/nbd0

O único problema com esta solução NBD é que ela usa bastante RAM (dependendo do tamanho do seu dispositivo), independentemente do armazenamento temporário disponível. Como fsck em si também é bastante ávido por RAM, é possível acabar se você não tiver muita RAM instalada.

    
por 06.12.2014 / 10:56