GNU / Linux: dispositivo de bloco de sobreposição / dispositivo de bloco empilhável

14

O GNU / Linux possui montagem de união que sobrepõe dirs. Assim, você pode montar um dir gravável em cima de um dir somente leitura. Quando o diretório gravável é desmontado, o diretório somente leitura é intocado.

Estou procurando a mesma funcionalidade para dispositivos de bloco - de preferência com a parte gravável armazenada em um arquivo. Então, eu gostaria de executar algo como:

device-setup /dev/newdevice /dev/read-only-device overlayfile

Se eu escrever em / dev / newdevice, as alterações deverão ser armazenadas em overlayfile. Se eu ler os setores gravados, devo obter os dados do overlayfile. Se eu ler setores não gravados, devo obter os dados do / dev / dispositivo somente leitura.

Existe uma ferramenta desse tipo?

Ole Tange
fonte
Perguntas e respostas semelhantes: instantâneo semelhante ao LVM em um dispositivo de bloco normal .
imz - Ivan Zakharyaschev

Respostas:

22

Você pode fazer isso com o mapeador de dispositivos e seu snapshotdestino.

Basicamente, você faria o mesmo que o LVM faz ao criar um instantâneo gravável.

dev=/dev/read-only-device
ovl=/path/to/overlay.file
newdevname=newdevice
size=$(blockdev --getsz "$dev")

loop=$(losetup -f --show -- "$ovl")
printf '%s\n' "0 $size snapshot $dev $loop P 8" |
  dmsetup create "$newdevname"

Em seguida, você pode acessar o dispositivo sobreposto como /dev/mapper/newdevice.

Se você também precisar acessar o dispositivo original ao mesmo tempo, poderá:

printf '%s\n' "0 $size snapshot-origin $dev" |
  dmsetup create originaldevice

E acesse-o novamente /dev/mapper/originaldevice.

Você pode gravar nesse dispositivo e, além dos pedaços gravados no dispositivo de captura instantânea, o arquivo de sobreposição conterá uma cópia dos pedaços que foram substituídos ao gravar na origem da captura instantânea.

O arquivo de sobreposição pode ser um arquivo esparso. (por exemplo, crie-o como truncate -s10G the-file) e não precisa ser tão grande quanto o dispositivo original. Você pode dizer o quão cheio está dmsetup status "$newdevname".

Nota: Existem requisitos de tamanho e conteúdo em um dispositivo de captura instantânea .

Stéphane Chazelas
fonte
1
Uma questão interessante subseqüente é se as mudanças acc.umulated podem ser posteriormente incorporada no dispositivo original
IMZ - Ivan Zakharyaschev
1
A resposta subsequente: sim. "O mapeador de dispositivos permite que você ... *) Mesclar uma captura instantânea de um dispositivo de bloco de volta ao dispositivo de origem da captura instantânea." kernel.org/doc/Documentation/device-mapper/snapshot.txt
imz - Ivan Zakharyaschev
O que significa o parâmetro chunksize para o destino da captura instantânea (8 no seu caso)? Como escolher?
IMZ - Ivan Zakharyaschev
1
@ Tom Esses números nas tabelas DM sempre se referem a unidades de 512 bytes, não ao tamanho do setor físico dos dispositivos de bloco subjacentes. Portanto, usar algo que não seja múltiplo de 8, um instantâneo em cima de um dispositivo com setores de 4K seria uma má idéia.
Stéphane Chazelas
1
@ Tom, o tamanho do pedaço determina a granularidade da captura instantânea. não se trata do tamanho do bloco do FS para o arquivo de sobreposição, mas da ganularidade das operações de E / S executadas no que estiver no dispositivo de bloco. Daí a reversão. Obrigado pelo getsz vs getsize.
Stéphane Chazelas