Como os instantâneos do LVM funcionam no nível do PE? O que é armazenado onde? Quais dados são perdidos quando o instantâneo fica sem espaço de reserva?
(descrição + explicação abaixo)
Eu estava experimentando com LVM e snapshots no VirtualBox, e estou percebendo um comportamento estranho. Eu queria ver como um sistema reagiria sob várias situações, então eu instalei o Lubuntu 13.04 em uma máquina virtual com a opção LVM marcada. Depois de instalar meu sistema, adicionei outra unidade de 8 GB à máquina virtual, usei vgcreate
para estender o grupo de volume lubuntu-vg
para /dev/sdb
e, em seguida, tirei um instantâneo de lubuntu-vg/root
com lvcreate
, com tamanho 6.74G criando lubuntu-vg/rootsnap
(note que o comando lvdisplay
registrado abaixo foi executado antes de eu criar o instantâneo)
user@user-VirtualBox:~$ sudo fdisk /dev/sda
Command (m for help): p
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders, total 16777216 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000c4cee
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 499711 248832 83 Linux
/dev/sda2 501758 16775167 8136705 5 Extended
/dev/sda5 501760 16775167 8136704 8e Linux LVM
Command (m for help): q
user@user-VirtualBox:~$ sudo lvdisplay
--- Logical volume ---
LV Path /dev/lubuntu-vg/root
LV Name root
VG Name lubuntu-vg
LV UUID JeyQ7Z-dtu1-Yr5R-hTTU-6Vya-Dr67-qSXwTf
LV Write Access read/write
LV Creation host, time lubuntu, 2013-05-02 18:09:41 -0500
LV Status available
# open 1
LV Size 6.73 GiB
Current LE 1723
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
--- Logical volume ---
LV Path /dev/lubuntu-vg/swap_1
LV Name swap_1
VG Name lubuntu-vg
LV UUID ZkyAxG-mFB0-zhDH-GjfK-CHlz-RbMc-ilumbj
LV Write Access read/write
LV Creation host, time lubuntu, 2013-05-02 18:09:41 -0500
LV Status available
# open 2
LV Size 1020.00 MiB
Current LE 255
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:1
user@user-VirtualBox:~$ sudo vgdisplay
--- Volume group ---
VG Name lubuntu-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 8
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 15.75 GiB
PE Size 4.00 MiB
Total PE 4033
Alloc PE / Size 1978 / 7.73 GiB
Free PE / Size 2055 / 8.03 GiB
VG UUID 2ZEhCz-Q988-oBAc-nE14-MdUs-j7un-2oicHD
user@user-VirtualBox:~$ sudo pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name lubuntu-vg
PV Size 7.76 GiB / not usable 2.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1986
Free PE 8
Allocated PE 1978
PV UUID OYCQrn-p7PH-4D52-4xRR-xphi-9DyL-Klys3t
--- Physical volume ---
PV Name /dev/sdb
VG Name lubuntu-vg
PV Size 8.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID ErizVU-o1Vf-73GO-Pkwf-PeM9-xoWo-snSmm2
Baixei algumas atualizações para preencher /var/cache/apt/archives
e, em seguida, desliguei o sistema. Para simular uma falha na unidade, removi / dev / sdb das configurações do VirtualBox e inicializei o backup da máquina. Não foi possível montar porque não foi possível encontrar lubuntu-vg/root
. Neste ponto, tentei descobrir como a configuração LE e PE "se parecia" para o meu sistema.
Eu tentei imaginar como seria o layout da minha configuração do LVM; No /dev/sda
, ele teria alocado alguns PEs no início para o swap, em seguida, alocava o restante dos PEs para lubuntu-vg/root
. Em seguida, estendi lubuntu-vg
para /dev/sdb
e tirei um instantâneo, que imaginei que alocaria a maioria dos PEs em /dev/sdb
. Meu palpite é que lubuntu-vg/rootsnap
agora usa os mesmos PEs que lubuntu-vg/root
fizeram originalmente e agora lubuntu-vg/root
(com o .debs em cache em /var/cache/apt/archives
) usa uma mistura dos PE antigos e os PEs recém alocados em /dev/sdb
para fins de COW. Então, para mim, quando eu removi /dev/sdb
(supostamente com os PEs COW), a máquina falhou ao inicializar porque não encontrou lubuntu-vg/root
.
Depois, adicionei novamente /dev/sdb
, inicializei e excluí o instantâneo. Neste ponto, eu esperava que, se eu fosse remover /dev/sdb
novamente, o sistema não conseguiria inicializar, já que os PEs de COW estavam nessa unidade. No entanto, quando tentei fazer isso, o sistema conseguiu inicializar com sucesso e os .debs ainda estavam em /var/cache/apt/archives
, apesar de /dev/sdb
não estarem conectados.
Como isso é possível? Eu pensei que os PEs COW estavam em /dev/sdb
, que eu removi. O LVM moveu os PEs COW para /dev/sda
quando removi o instantâneo ou alguns outros movimentos extravagantes ao criar o instantâneo?
Um pensamento que tive foi que talvez quando o LVM aloca PEs, ele faz virtualmente e na verdade não os reserva fisicamente quando um LV é criado, permitindo que os PEs de LV sejam intercalados entre si. Se esse for o caso, por que o sistema não conseguiu inicializar quando /dev/sdb
foi removido? Os PEs COW não estariam em /dev/sda
então?