# LVM - Gestió de volumns lògics

LVM és l'acrònim de Logical Volume Manager, que en computació fa referència a una forma d'assignar espai de forma més flexible que les formes tradicionals com la partició. Un volume manager és una capa de gestió d'emmagatzematge que abstrau els discs físics, que permet crear, redimensionar i administrar espais d'emmagatzematge de manera flexible i dinàmica sense haver de reiniciar el sistema ni canviar particions físicament. També permet l'administració de volums definits per grups d'usuaris, atorgant-li a l'administrador del sistema bregar amb grups de volums amb noms més sensibles com "desenvolupament" o "sistema" en comptes de noms de discos físics que poc ens diuen com "sda" o "sdb".

# 1. Arquitectura d'LVM

LVM es descompon en tres capes: 

| Capa | Funció |
|--------------------|-----------------------------------------------------------|
| Volums físics (PV) | Discs o particions físiques preparades per a LVM (`pvcreate`) |
| Grups de volums (VG) | Pool d'emmagatzematge que agrupa un o més PV (`vgcreate`) |
| Volums lògics (LV) | Volums lògics creats dins del VG, que comporten com particions (`lvcreate`) |

![Anatomia d'LVM](https://proferamon.com/tic/imatges/lvm/lvm01.png)

# 2. Avantatges d'utilitzar LVM en un sistema petit

Una de les decisions que afronta un usuari instal·lant GNU/Linux és com particionar el disc dur. La necessitat d'estimar quant espai serà necessari per al sistema, per als temporals o per les dades personals, pot convertir-se en alguna cosa problemàtica, de manera que molts usuaris opten per crear una partició que ocupi tot el disc i allà introduir les dades. Encara havent estimat correctament quant espai es necessita per a */home*, */usr*, */tmp*, o qualsevol altre directori important, és bastant comú que ens quedem sense espai en aquestes particions, quan tenim espai de sobres en alguna altra. 

Amb l'ús d'un gestor de volums lògics, el disc complet pot ser assignat a un únic grup lògic i definir diferents volums lògics per emmagatzemar */home* o altres directoris. En el cas que ens quedem sense espai, per exemple, a */home*, i tenim espai a */opt*, podríem redimensionar */home* i */opt* i utilitzar l'espai que li hem tret a */opt* i afegir-lo a */home*. Cal tenir en compte, que per fer això, el nostre [sistema de fitxers](http://proferamon.com/tic/sistemes_fitxers.html) ha de suportar el redimensionat per dalt i per baix, com ReiserFS. 

Una altra alternativa seria deixar una certa quantitat d'espai del disc sense assignar i quan fos necessari, expandir el volum. 

# 3. Avantatges d'utilitzar LVM en un sistema gran

Administrar un sistema amb molts discos és una feina que consumeix temps, i es fa particularment complex si el sistema conté discs de diferents mides. Balancejar els requisits d'emmagatzematge de diferents usuaris (sovint conflictius) pot ser una tasca molt laboriosa i complexa. 

Els grups d'usuaris (diguem-ne per exemple administració, desenvolupament, etc.) Poden tenir els seus volums lògics i aquests poden créixer el que sigui necessari, i l'administrador pot efectuar les operacions oportunes sobre aquests volums. 

Quan un nou disc s'afegeix al sistema, no cal moure les dades dels usuaris. Simplement, s'afegeix el nou disc al grup lògic corresponent i s'expandeixen els volums lògics tot el que es consideri adient. També es poden migrar les dades de discos antics a altres nous, de forma totalment transparent a l'usuari. 

# 4. Inconvenients i precaucions
- **Rendiment:** Lleuger overhead per la capa addicional (normalment negligible en SSDs/moderns).
- **Complexitat:** Requereix coneixement previ; errors poden provocar pèrdua de dades.
- **Recuperació:** Més complicada que particions estàndard; calen còpies de seguretat de les metadades.
- **No és RAID:** LVM gestiona espai, **no** tolera fallades de disc. Combina amb `mdadm` (RAID) si cal redundància.
- **Reducció:** Requereix reduir primer el sistema de fitxers, després el LV. No tots els FS ho suporten bé.

> [!CAUTION]
>
> Fes sempre proves en entorns no productius. La manipulació incorrecta de LVM pot provocar una **pèrdua irreversible de dades**.

# 5. Ordres essencials

## 5.1. Preparar discs o particions

```bash
# Format amb tipus 8e (Linux LVM) si cal
fdisk /dev/sdb → t → 8e

# Crear PV
pvcreate /dev/sdb /dev/sdc

# Informació
pvs | pvdisplay
```

## 5.2. Gestionar grups de volums

```bash
vgcreate vg_dades /dev/sdb /dev/sdc
vgextend vg_dades /dev/sdd   # Afegir disc
vgreduce vg_dades /dev/sdc   # Eliminar (després de migrar dades)
vgs | vgdisplay
```

## 5.3. Gestionar volums lògics

```bash
lvcreate -L 50G -n lv_sistema vg_dades
lvcreate -l 100%FREE -n lv_rest vg_dades  # Usa tot l'espai lliure

# Ampliar
lvextend -L +20G /dev/vg_dades/lv_sistema
lvextend -l 100%FREE /dev/vg_dades/lv_rest

# Reduir (RISC, fa primer resize2fs o xfs_repair)
lvreduce -L -10G /dev/vg_dades/lv_sistema
```

## 5.4. Sistemes de fitxers

```bash
# Crear ext4
mkfs.ext4 /dev/vg_dades/lv_sistema

# Ampliar online (ext4/xfs)
resize2fs /dev/vg_dades/lv_sistema   # ext4
xfs_growfs /mnt/point                # xfs

# Snapshots
lvcreate -s -L 1G -n snap_lv /dev/vg_dades/lv_sistema
```

# 6. Monitoratge i diagnòstic

| Comanda             | Ús                                |
| ------------------- | --------------------------------- |
| `lvs` / `lvdisplay` | Llista LV                         |
| `vgs` / `vgdisplay` | Llista VG                         |
| `pvs` / `pvdisplay` | Llista PV                         |
| `lvm fullreport`    | Informació completa               |
| `dmsetup ls`        | Estructura de dispositius mappats |

# 7. Bones pràctiques

1. **Còpia de seguretat** de metadades LVM abans de canvis: `vgcfgbackup`
2. **Deixa espai lliure** al VG per a futures ampliacions.
3. **Verifica** sempre amb `df -h` i `lvs` després de canvis.
4. **Documenta** l'estructura LVM del teu sistema.
5. **Actualitza** `lvm2` per a correccions de seguretat i compatibilitat.

# 8. Gestionar LVM

Podem gestionar els LVM en un entorn gràfic amb el programa **kvpm **(KDE). El programa system‑config‑lvm (Gnome) tan sols mostra gràficament la distribució dels volums del LVM.

També podem fer servir directament les ordres de LVM des del terminal:

| Ordre | Descripció |
| ----- | --------------- |
| `pvchange` | Canvia atributs d'un volum físic. |
| `pvck` | Comprova metadades del volum físic. |
| `pvcreate` | Inicialitza un disc o partició per ser usat com a LVM. |
| `pvdisplay` | Mostra els atributs d'un volum físic. |
| `pvmove` | Mou extensions físiques. |
| `pvremove` | Elimina un volum físic. |
| `pvresize` | Canvia la mida d'un disc o partició en ús per LVM2. |
| `pvs` | Informa sobre els volums físics. |
| `pvscan` | Analitza tots els discos a la recerca de volums físics. |
| `vgcfgbackup` | Crea una còpia de seguretat de l'àrea del descriptor del grup de volums. |
| `vgcfgrestore` | Restaura una còpia de seguretat de l'àrea del descriptor del grup de volums. |
| `vgchange` | Canvia els atributs d'un grup de volums. |
| `vgck` | Comprova les metadades d'un grup de volums. |
| `vgconvert` | Converteix el format de metadades del grup de volums. |
| `vgcreate` | Crea un grup de volums. |
| `vgdisplay` | Mostra els atributs dels grups de volums. |
| `vgexport` | Fa grups de volums desconeguts per al sistema. |
| `vgextend` | Afegeix volums físics a un grup de volums. |
| `vgimport` | Fa grups de volums exportats coneguts pel sistema. |
| `vgimportclone` | Importa i canvia el nom del grup de volums duplicat (per exemple, una instantània de maquinari). |
| `vgmerge` | Combina dos grups de volums. |
| `vgmknodes` | Recrea el directori del grup de volums i arxius especials del volum lògic |
| `vgreduce` | Redueix un grup de volums mitjançant l'eliminació d'un o més volums físics. |
| `vgremove` | Elimina un grup de volums. |
| `vgrename` | Canvia el nom d'un grup de volums. |
| `vgs` | Informa sobre els grups de volums. |
| `vgscan` | Analitza tots els discos dels grups de volums i reconstrueix les caus. |
| `vgsplit` | Divideix un grup de volums en dos, movent els volums lògics del grup de volums a un altre movent tots els volums físics. |
| `lvchange` | Canvia els atributs d'un volum lògic. | 
| `lvconvert` | Converteix un volum lògic de lineal a mirall o instantània. | 
| `lvcreate` | Crea un volum lògic en un grup de volums existent. |
| `lvdisplay` | Mostra els atributs d'un volum lògic. |
| `lvextend` | Amplia la mida d'un volum lògic. |
| `lvmchange` | Canvia atributs del gestor de volums lògics. |
| `lvmdiskscan` | Analitza tots els dispositius visibles per LVM2. |
| `lvmdump` | Crea bolcats d'informació per a fins de diagnòstic. |
| `lvreduce` | Redueix la mida d'un volum lògic. |
| `lvremove` | Elimina un volum lògic. |
| `lvrename` | Canvia el nom d'un volum lògic. |
| `lvresize` | Canvia la mida d'un volum lògic. |
| `lvs` | Informa sobre els volums lògics. |
| `lvscan` | Analitza tots els discs a la recerca de volums lògics. |

# 9. Exemples

**Exemple 1** 

Els passos que haurem de seguir per ampliar amb l'eina kvpm són: 

1. Crear una nova taula de particions en el nou disc
2. Afegir una partició en el nou disc
3. Crear un volum físic amb la nova partició
4. Estendre el grup de volums existent
5. Estendre el volum lògic existent


**Exemple 2**

Els passos que haurem de seguir per ampliar, per exemple, /home des del terminal són: 

En aquest exemple tenim dos discs durs de 8 GB cadascú i hem creat un grup de volums anomenat *grup* de 16 GB dins del qual s'han definit tres volums lògics: *arrel* (6 GB), *casa* (9,6 GB) i *intercanvi* (0,4 GB). En el volum lògic arrel hem muntat el `/` i en el volum lògic casa hem muntat `/home`. El volum lògic *intercanvi* s'ha fet servir per al `swap`.

Amb l'ordre `df` veiem l'estat inicial

```bash
df -h
```

```nano
S. fitxers Mida En ús Lliure %Ús Muntat a 
/dev/mapper/grup-arrel 6,0G 3,0G 2,8G 52% / 
udev 494M 4,0K 494M 1% /dev 
tmpfs 201M 800K 200M 1% /run 
none 5,0M 0 5,0M 0% /run/lock 
none 501M 152K 501M 1% /run/shm 
/dev/mapper/grup-casa 9,6G 274M 8,8G 3% /home 
```

Després d'haver afegit físicament el nou disc, que és de 10 GB, el particionem

```bash
fdisk /dev/sdc
```

```nano
El dispositiu no conté ni taula de particions DOS vàlida, ni cap etiqueta de disc Sun, SGI o OSF 
Building a new DOS disklabel with disk identifier 0x1b8c2b90. 
Changes will remain in memory only, until you decide to write them. 
After that, of course, the previous content won't be recoverable. 

Avís: el senyalador 0x0000 invàlid de la taula de particions 4 es corregirà amb w(escriu) 

Ordre (m per a obtenir ajuda): o
Building a new DOS disklabel with disk identifier 0x4c5c816b. 
Changes will remain in memory only, until you decide to write them. 
After that, of course, the previous content won't be recoverable. 

Avís: el senyalador 0x0000 invàlid de la taula de particions 4 es corregirà amb w(escriu) 

Ordre (m per a obtenir ajuda): n

Partition type: 
 p primary (0 primary, 0 extended, 4 free) 
 e extended 
Select (default p): p
Nombre de partició (1-4, valor per defecte 1): 
S'està utilitzant el valor per defecte 1 
Primera sector (2048-20971519, valor per defecte 2048): 
S'està utilitzant el valor per defecte 2048 
Last sector, +sectors or +size{K,M,G} (2048-20971519, valor per defecte 20971519): 
S'està utilitzant el valor per defecte 20971519 

Ordre (m per a obtenir ajuda): w 
S'ha modificat la taula de particions. 

S'està cridant ioctl() per rellegir la taula de particions. 
S'estan sincronitzant els discs.
```

Creem el volum físic

```bash
pvcreate /dev/sdc1
```

```nano
Physical volume "/dev/sdc1" successfully created 
```

Estenem el grup de volums 

```bash
vgextend grup /dev/sdc1
```

```nano
Volume group "grup" successfully extended
```

Estenem el volum lògic *casa*

```bash
lvextend /dev/mapper/grup-casa /dev/sdc1
```

```nano
Extending logical volume casa to 19,53 GiB
Logical volume casa successfully resized 
```

Redimensionem el volum lògic

```bash
resize2fs /dev/mapper/grup-casa
```

```nano
resize2fs 1.42 (29-Nov-2011) 
El sistema de fitxers a /dev/mapper/grup-casa està muntat a /home; cal un canvi de mida en línia 
old_desc_blocks = 1, new_desc_blocks = 2 
Performing an on-line resize of /dev/mapper/grup-casa to 5120000 (4k) blocks. 
The filesystem on /dev/mapper/grup-casa is now 5120000 blocks long. 
```

Finalment, comprovem que la mida de `/home` s'ha incrementat

```bash
df -h
```

```nano
S. fitxers Mida En ús Lliure %Ús Muntat a 
/dev/mapper/grup-arrel 6,0G 3,0G 2,8G 52% / 
udev 494M 4,0K 494M 1% /dev 
tmpfs 201M 800K 200M 1% /run 
none 5,0M 0 5,0M 0% /run/lock 
none 501M 152K 501M 1% /run/shm 
/dev/mapper/grup-casa 20G 274M 19G 2% /home 
```

# 10. LVM vs. altres solucions

| Característica | LVM | mdadm (RAID) | ZFS/Btrfs |
|----------------|-----|--------------|-----------|
| Gestió d'espai | Excel·lent | Limitat | Integrat |
| Tolerància a fallades | No (combinar amb RAID) | Sí | Sí |
| Snapshots | Suportat | No | Natiu |
| Complexitat | Mitjana | Alta | Alta |

# 11. Recursos oficials

- `man lvm`, `man pvcreate`, `man vgcreate`, `man lvcreate`
- [Documentació Ubuntu Server](https://ubuntu.com/server/docs/how-to/storage/manage-logical-volumes/#manage-logical-volumes)
- `lvmhelp` i `vgcfgbackup/restore` per a recuperació

#### Versions d'aquest document

+ HTML - [lvm.html](https://proferamon.com/tic/lvm.html)
+ PDF - [lvm.pdf](https://proferamon.com/tic/docs/lvm.pdf)
+ ODT - [lvm.odt](https://proferamon.com/tic/odt/lvm.odt)
+ MD - [lvm.md](https://proferamon.com/tic/md/lvm.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

