Gestió de fallades
En aquest apartat, assumirem que el disc dur secundari /dev/nvme0n3
ha fallat. Aquest disc forma part del grup de volums vg_webapp
i conté el volum lògic lv_data
que emmagatzema les dades estàtiques de la web. La fallada del disc dur pot ser deguda a diversos factors, com ara errors de hardware, errors de software, o errors de configuració.
Preparació
-
Utilitzeu la màquina virtual creada a l'apartat anterior amb el grup de volums
vg_webapp
i el volum lògiclv_data
. -
Escriviu dades aleatòries a l’arxiu
/opt/webapp/data
per simular les dades del lloc web. Podeu utilitzar l’script següent:#!/bin/bash # Numero de gigabytes a escriure amountGB="$1" # Directori on escriure els arxius (per defecte /opt/webapp/data) dir="${2:-/opt/webapp/data}" for i in $(seq 1 "$amountGB"); do dd if=/dev/urandom of="$dir/file$i" bs=1M count=1024 done echo "S'han escrit $amountGB GB de dades a $dir"
Executeu el script amb la següent comanda per escriure 5GB de dades a l'arxiu
/opt/webapp/data
:bash script.sh 5
Tasques
Anàlisi de la fallada
En primer lloc, analitzarem amb més detall utiltizant pvdisplay --maps
i lvdisplay --maps
per entendre com estan distribuïts els extens del grup de volums i del volum lògic.
--- Physical volume ---
PV Name /dev/nvme0n2
VG Name vg_webapp
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 5119
Free PE 0
Allocated PE 5119
PV UUID 7saOpX-fjg1-afmU-ZoEA-d945-mJzN-6oo0Tl
--- Physical Segments ---
Physical extent 0 to 255:
Logical volume /dev/vg_webapp/lv_sources
Logical extents 0 to 255
Physical extent 256 to 2815:
Logical volume /dev/vg_webapp/lv_data
Logical extents 0 to 2559
Physical extent 2816 to 3071:
Logical volume /dev/vg_webapp/lv_run
Logical extents 0 to 255
Physical extent 3072 to 5118:
Logical volume /dev/vg_webapp/lv_data
Logical extents 2560 to 4606
--- Physical volume ---
PV Name /dev/nvme0n3
VG Name vg_webapp
PV Size 20.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5119
Free PE 4606
Allocated PE 513
PV UUID 4Exs4j-Japi-ab8p-pnYx-FPNY-tKdl-KTFkHq
--- Physical Segments ---
Physical extent 0 to 512:
Logical volume /dev/vg_webapp/lv_data
Logical extents 4607 to 5119
Physical extent 513 to 5118:
FREE
```
```bash
--- Logical volume ---
LV Path /dev/vg_webapp/lv_sources
LV Name lv_sources
VG Name vg_webapp
LV UUID ElTnFj-nVJT-OwhB-dTmm-l1zR-LNht-Zk8QY1
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-07-12 20:42:20 +0200
LV Status available
# open 1
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
--- Segments ---
Logical extents 0 to 255:
Type linear
Physical volume /dev/nvme0n2
Physical extents 0 to 255
--- Logical volume ---
LV Path /dev/vg_webapp/lv_data
LV Name lv_data
VG Name vg_webapp
LV UUID Oliogr-YoKj-OeKh-V3jE-bcbe-i25B-fowxdT
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-07-12 20:42:25 +0200
LV Status available
# open 1
LV Size 20.00 GiB
Current LE 5120
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:3
--- Segments ---
Logical extents 0 to 2559:
Type linear
Physical volume /dev/nvme0n2
Physical extents 256 to 2815
Logical extents 2560 to 4606:
Type linear
Physical volume /dev/nvme0n2
Physical extents 3072 to 5118
Logical extents 4607 to 5119:
Type linear
Physical volume /dev/nvme0n3
Physical extents 0 to 512
--- Logical volume ---
LV Path /dev/vg_webapp/lv_run
LV Name lv_run
VG Name vg_webapp
LV UUID YGKTJ2-HwMi-k9CG-uyM1-wyG5-t0Vh-vGiptU
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-07-12 20:42:30 +0200
LV Status available
# open 1
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:4
--- Segments ---
Logical extents 0 to 255:
Type linear
Physical volume /dev/nvme0n2
Physical extents 2816 to 3071
Si analitzem les dades anteriors, podem veure que el volum lògic lv_data
està distribuït entre els discs durs /dev/nvme0n2
i /dev/nvme0n3
. Això significa que si el disc dur /dev/nvme0n3
falla, les dades emmagatzemades en aquest disc dur es perdran. Si us centreu en /dev/vg_webapp/lv_data
veureu que els LEs 0-2559 i 2560-4606 estan en el disc dur /dev/nvme0n2
i equivalenen als PE 256-2815 i 3072-5118. Mentre que els LEs 4607-5119 estan en el disc dur /dev/nvme0n3
i equivalen als PE 0-512. Si fem les operacions assumint que la mida dels PE és de 4MiB i que la mida del volum lògic és de 20GB, podem veure que el disc dur /dev/nvme0n2
conté 18GB i el disc dur /dev/nvme0n3
conté 2GB. La traducció es pot fer utilitzant les següents operacions: $18GB = 4606 * 4MiB$ i $2GB = 512 * 4MiB$.
Simulació de la fallada
-
Hi ha moltes maneres de simular una fallada de disc, una d'elles es corrompre la secció de metadades lvm del disc
/dev/nvme0n3
. Per fer-ho, podeu utilitzar la comandadd
per sobreescriure els primeres 10MB del disc dur amb zeros:dd if=/dev/zero of=/dev/nvme0n3 bs=1M count=10
Alternativament, podeu utilitzar la comanda
wipefs
per eliminar les signatures del disc dur/dev/nvme0n3
:wipefs --all --backup -f /dev/nvme0n3
-
Un cop hàgiu simulat la fallada del disc dur
/dev/nvme0n3
, comproveu l'estat del grup de volumsvg_webapp
i del volum lògiclv_data
:vgdisplay vg_webapp lvdisplay /dev/vg_webapp/lv_data
Device /dev/nvme0n3 has no PVID (devices file 4Exs4jJapiab8ppnYxFPNYtKdlKTFkHq) WARNING: Couldn't find device with uuid 4Exs4j-Japi-ab8p-pnYx-FPNY-tKdl-KTFkHq. WARNING: VG vg_webapp is missing PV 4Exs4j-Japi-ab8p-pnYx-FPNY-tKdl-KTFkHq (last written to /dev/nvme0n3). WARNING: Couldn't find all devices for LV vg_webapp/lv_data while checking used and assumed devices.
A partir de la sortida anterior, podem veure que el disc dur
/dev/nvme0n3
ha fallat i que el grup de volumsvg_webapp
i el volum lògiclv_data
tenen problemes.Si utilitzeu
ls -la /opt/webapp/data
odf -h
observareu que encara podeu accedir a les dades. Recordeu que les primeres 18GB estan emmagatzemades al disc dur/dev/nvme0n2
. Amb la comanadapvdisplay --maps
ilvdisplay --maps
podeu comprovar-ho veient que únicament els LEs corresponents al disc dur/dev/nvme0n3
estan marcats com a unknown. -
Ara anem a omplir el disc dur
/dev/nvme0n2
per simular una fallada imminent. Per fer-ho, podeu utilitzar la comandadd
per escriure 19GB de dades aleatòries a l'arxiu/opt/webapp/data
:bash script.sh 19
Com ha pogut guardar 19GB si el disc dur
/dev/nvme0n3
ha fallat i el disc dur/dev/nvme0n2
només té 18GB? Això és degut a que les dades s'estan guardant en el disc dur/dev/nvme0n2
però no s'estan actualitzant les metadades de LVM. Això pot ser un problema greu, ja que si el disc dur/dev/nvme0n2
falla, les dades es perdran.Aquest fet el podeu posar de manifest intentant guardar dades al següent LE del disc dur
/dev/nvme0n2
i veureu que no es pot fer. Ja que el 1GB que ell tenia reservat s'ha omplert amb el 1GB restant de la còpia anterior.bash script.sh 1 /opt/webapp/run
dd: error writing '/opt/webapp/run/file1': No space left on device
Solucionant la fallada
Per solucionar la fallada del disc dur /dev/nvme0n3
, seguirem els següents passos:
-
Utilitzeu l'eina
pvck
per comprovar la integritat del disc dur/dev/nvme0n3
:pvck /dev/nvme0n3
WARNING: Device for PV 4Exs4j-Japi-ab8p-pnYx-FPNY-tKdl-KTFkHq not found or rejected by a filter.
A partir de la sortida anterior, podem veure que el disc dur
/dev/nvme0n3
no es pot trobar. Això és degut a que hem corromput les metadades de LVM del disc dur/dev/nvme0n3
. -
Utilitzeu l'eina
pvck
amb l'opció--repair
per intentar reparar el disc dur/dev/nvme0n3
:pvck --repair -f /etc/lvm/backup/vg_webapp /dev/nvme0n3
CHECK: label_header.crc expected 0x5bd06dba CHECK: label_header.type expected LVM2 001 WARNING: No LVM label found on /dev/nvme0n3. It may not be an LVM device. Writing label_header.crc 0xc9fb4741 pv_header uuid Tqyb8i0hyzOyb2AFlgMQJ4bNW6kDiOsJ device_size 21474836480 Writing data_offset 1048576 mda1_offset 4096 mda1_size 1044480 mda2_offset 0 mda2_size 0 Write new LVM header to /dev/nvme0n3? y Writing metadata at 4608 length 2190 crc 0x38751a64 mda1 Writing mda_header at 4096 mda1 Write new LVM metadata to /dev/nvme0n3? y
En aquest punt, hem intentat reparar el disc dur
/dev/nvme0n3
i hem escrit noves metadades de LVM al disc dur. El problema és que les noves metadades de LVM no coincideixen amb les metadades de LVM del grup de volumsvg_webapp
. Ho podeu comprovar amb la comandapvs -o+uuid
:pvs -o+uuid WARNING: scan of VG vg_webapp from /dev/nvme0n3 mda1 found mda_checksum 38751a64 mda_size 2190 vs d5280ec2 2174 WARNING: Scanning /dev/nvme0n3 mda1 found mismatch with other metadata. WARNING: scan failed to get metadata summary from /dev/nvme0n3 PVID Tqyb8i0hyzOyb2AFlgMQJ4bNW6kDiOsJ Device /dev/nvme0n3 has PVID Tqyb8i0hyzOyb2AFlgMQJ4bNW6kDiOsJ (devices file none) WARNING: scan of VG vg_webapp from /dev/nvme0n3 mda1 found mda_checksum 38751a64 mda_size 2190 vs d5280ec2 2174 WARNING: Scanning /dev/nvme0n3 mda1 found mismatch with other metadata. WARNING: scan failed to get metadata summary from /dev/nvme0n3 PVID Tqyb8i0hyzOyb2AFlgMQJ4bNW6kDiOsJ PV VG Fmt Attr PSize PFree PV UUID /dev/nvme0n1p3 almalinux lvm2 a-- 18.41g 0 59JST0-TYqg-3nyz-p4ek-MaEk-pJX6-cgGf96 /dev/nvme0n2 vg_webapp lvm2 a-- <20.00g 17.99g 7saOpX-fjg1-afmU-ZoEA-d945-mJzN-6oo0Tl /dev/nvme0n3 vg_webapp lvm2 a-- <20.00g 0 Tqyb8i-0hyz-Oyb2-AFlg-MQJ4-bNW6-kDiOsJ
-
Actualitzeu les metadades del grup de volums
vg_webapp
:vgcfgrestore vg_webapp
En aquest punt encara observareu WARNINGS, per mismatch de les metadades. Igual es pot omitir.
-
Actualitzeu les metadades del grup de volums
vg_webapp
:vgck --updatemetadata vg_webapp
Amb aquesta comanda actualitzarem les metadades del grup de volums
vg_webapp
amb les noves metadades del disc dur/dev/nvme0n3
. Ara ja no hauríeu de veure cap warning en la sortida depvs -o+uuid
.
Canviant el disc
-
Ara que hem reparat el grup de volums
vg_webapp
, procedirem a canviar el disc dur/dev/nvme0n3
per un de nou. En aquest cas, assumirem que el nou disc dur és/dev/nvme0n4
. -
Utilitzeu la comanda
pvcreate
per inicialitzar el disc dur/dev/nvme0n4
:pvcreate /dev/nvme0n4
-
Utilitzeu la comanda
vgextend
per afegir el disc dur/dev/nvme0n4
al grup de volumsvg_webapp
:vgextend vg_webapp /dev/nvme0n4
-
Utilitzeu pvmove per moure les dades del disc dur
/dev/nvme0n3
al disc dur/dev/nvme0n4
:pvmove /dev/nvme0n3 /dev/nvme0n4
Aquesta comanda mou les dades del disc dur
/dev/nvme0n3
al disc dur/dev/nvme0n4
. Aquest procés pot trigar una estona depenent de la quantitat de dades a moure. -
Utilitzeu la comanda
vgreduce
per eliminar el disc dur/dev/nvme0n3
del grup de volumsvg_webapp
:vgreduce vg_webapp /dev/nvme0n3
-
Utilitzeu la comanda
pvremove
per eliminar el disc dur/dev/nvme0n3
del grup de volumsvg_webapp
:pvremove /dev/nvme0n3
Anàlisi de la situació
Creus que hi ha alguna manera de recuperar les dades del disc dur /dev/nvme0n3
? Si la corrupció es fa a nivell de LEs en comptes de metadades. Investigar quines eines podrien ser útils per recuperar les dades del disc dur /dev/nvme0n3
.