Eu preciso fazer um instantâneo na memória de um sistema de arquivos raiz montado em execução.
O próprio sistema de arquivos está em um dispositivo lvm, mas não há espaço livre no VG e não há como expandi-lo. No entanto, tenho bastante memória RAM e só preciso do meu instantâneo para fazer um backup e, talvez, reverter para ele. Eu não me importo se o servidor for reinicializado e "reverter" para o instantâneo. Estou usando mapeador de dispositivos e não lvm2 porque não encontrei uma maneira de fazer isso com lvm. Então, na terminologia do DM, eu preciso fazer um snapshot-origin e um snapshot sobre ele.
Eu criei um dispositivo de bloco na memória (linear em cima do loop sobre o arquivo em tmpfs) para dados de vaca e funciona.
Meu problema é que meu dispositivo root fs é dois dispositivos lineares, não um:
root: 0 57000000 linear 8:48 2048
root: 57000000 160000000 linear 8:48 73869312
cow: 0 20971520 linear 7:2 0
(root não é o único LV neste vg, vaca é meu dispositivo na memória)
Encontrei um monte de artigos sobre como fazer isso on-line, por exemplo: link No entanto, não encontrei a sintaxe adequada para criar a origem do instantâneo no topo de dois ou mais dispositivos lineares.
quando eu faço assim: %código% Eu recebo "comando falhou" e isso no dmesg:
[ 2957.073592] device-mapper: table: 254:1: snapshot-origin: Cannot get target device
[ 2957.073595] device-mapper: ioctl: error adding target to table
Quando uso a mesma abordagem para um único dispositivo linear, tudo está bem.
Atualização:
Fiz um instantâneo lvm em uma mesma configuração, mas com algum espaço no vg para dar uma olhada em como o lvm lida com isso. Bem, isso acontece, mas eu ainda não entendo como faço isso manualmente (com meu próprio dispositivo de causa).
A configuração inicial:
Root: 0 57090048 linear 8:48 2048
Root: 57090048 160571392 linear 8:48 73869312
Isto é o que o lvm faz em dmsetup table root| sed 's~linear.*~snapshot-origin /dev/mapper/root~g'| dmsetup create snapshot-origin
.
Então é isso que eu quero criar manualmente:
Root--snap: 0 217661440 snapshot 254:1 254:4 P 8
Root-real: 0 57090048 linear 8:0 2048
Root-real: 57090048 160571392 linear 8:0 73869312
Root: 0 217661440 snapshot-origin 254:1
Root--snap-cow: 0 8388608 linear 8:0 57092096
Como eu entendo a documentação do dm e vários artigos, deve-se começar marcando o dispositivo original como origem do instantâneo:
dmsetup -vvv create so --table '0 217661440 snapshot-origin /dev/mapper/Root'
dm version OF [16384] (*1)
Udev cookie 0xd4d3634 (semid 12746752) created
Udev cookie 0xd4d3634 (semid 12746752) incremented to 1
Udev cookie 0xd4d3634 (semid 12746752) incremented to 2
Udev cookie 0xd4d3634 (semid 12746752) assigned to CREATE task(0) with flags DISABLE_LIBRARY_FALLBACK (0x20)
dm create so OF [16384] (*1)
dm reload so OF [16384] (*1)
<backtrace>
Udev cookie 0xd4d3634 (semid 12746752) decremented to 1
Udev cookie 0xd4d3634 (semid 12746752) incremented to 2
Udev cookie 0xd4d3634 (semid 12746752) assigned to REMOVE task(2) with flags DISABLE_LIBRARY_FALLBACK (0x20)
dm remove so OF [16384] (*1)
Udev cookie 0xd4d3634 (semid 12746752) decremented to 1
Udev cookie 0xd4d3634 (semid 12746752) waiting for zero
Udev cookie 0xd4d3634 (semid 12746752) destroyed
Command failed
Update2:
open("/dev/mapper/control", O_RDWR) = 3
/...cut.../
write(1, "dm create ECS-LVRoot OF [1638"..., 40dm create ECS-LVRoot OF [16384] (*1)
) = 40
ioctl(3, DM_DEV_CREATE, 0x7f66e826f350) = -1 EBUSY (Device or resource busy)
write(1, "<backtrace>\n", 12<backtrace>
) = 12
write(2, "Command failed\n", 15Command failed
) = 15
Tags lvm snapshot linux device-mapper