<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>raid &amp;mdash; Cyberdyne Systems</title>
    <link>https://noblogo.org/aytin/tag:raid</link>
    <description>&#34;Fare o non fare. Non c&#39;è provare!&#34;</description>
    <pubDate>Mon, 25 May 2026 10:55:19 +0000</pubDate>
    <item>
      <title>Cose molto notevoli su LVM</title>
      <link>https://noblogo.org/aytin/cose-molto-notevoli-su-lvm</link>
      <description>&lt;![CDATA[lvm plus&#xA;Oltre che alla grande flessibilità nella gestione dei volumi, LVM attraverso device mapper, aggiunge tutta una serie di ulteriori capacità che rendono questa tecnologia estremamente versatile.&#xA;&#xA;La possibilità di disporre di meccanismi per la gestione di snapshot, cache pool. thin provisioning e raid, rendono LVM qualcosa di più di un gestore di volumi. &#xA;!--more--&#xA;&#xA;1. Snapshot&#xA;   1.1. Attenzione: Dimensione della snapshot&#xA;   1.2. Esempio&#xA;2. Thin Pool&#xA;3. Thin Pool e snapshot&#xA;4. Cache Pool&#xA;   4.1. Caso 1: configurazione automatica del cache pool lv&#xA;   4.2. Caso 2: configurazione manuale del cache pool lv&#xA;   4.3. Switch della modalità&#xA;   4.4. Rimozione della cache&#xA;   4.5. Monitoraggio&#xA;5. LVM Stripe&#xA;6. LVM Mirror&#xA;7. LVM Raid&#xA;   7.1. Raid 0 (Stripe)&#xA;   7.2. Raid 1 (Mirroring)&#xA;   7.3. Raid 5 (Stripe con parità singola)&#xA;   7.4. Raid 6 (Stripe con parità doppia)&#xA;   7.5. Raid 10&#xA;   7.6. Come monitorare il raid&#xA;   7.7. Come intervenire in caso di guasto&#xA;&#xA;1. Snapshot&#xA;Le snapshot LVM usano la tecnica del Copy-on-Write (CoW) allo scopo di ridurre la duplicazione. &#xA;&#xA;La snapshot dovrà essre la fotografia del volume prima all&#39;origine.&#xA;&#xA;Ad ogni modifica / cancellazione, il file originale verrà portato sulla snapshot prima dell&#39;operazione.&#xA;Sul volume originale verranno scritti tutti i dati nuovi e quelli modificati.&#xA;&#xA;Per il ripristino, si effettua quello che si chiama merge, dove i dati vecchi vengono ripristinati dalla snapshot e quelli nuovi cancellati dal volume.&#xA;&#xA;Per il consolidamento delle modifiche, basterò rimuovere la snapshot,&#xA;&#xA;1.1. Attenzione: Dimensione della snapshot&#xA;&#xA;Se la snapshot ha la stessa dimensione del volume logico non ci sono problemi.&#xA;&#xA;Se è più piccola, occorre prestare attenzione a che la quantità dei dati modificati sul volume logico non superino la dimensione della snapshot.&#xA;&#xA;In questo caso infatti la snapshot risulterà inutilizzabile e non potrà più essere usata per il ripristino ma potrà essree solo rimossa.&#xA;&#xA;1.2. Esempio&#xA;Supponiamo di avere un gruppo di volumi, myvg, composto da 3 volumi logici:&#xA;&#xA;lvroot (30 GiB)&#xA;lvhome (200 GiB)&#xA;lvdati (500 GiB)&#xA;&#xA;e di voler creare una snapshot precauzionale sulla root (supponendo di avere spazio a sufficienza altrimenti dovrò fare bene i miei conti per non riempire oltremisura la snapshot rendendola inservibile).&#xA;&#xA;Creazione snapshot&#xA;lvcreate -s -L 30G -n  lvrootsnap myvg/snap&#xA;Ripristino&#xA;umount /dev/myvg/lvroot&#xA;lvconvert --merge myvg/snap&#xA;Consolidamento&#xA;lvremove snap&#xA;2. Thin Pool&#xA;Il thin provisioning di LVM è l&#39;alternativa dinamica alla classica gestione di volumi, thick, che prevede l&#39;assegnazione statica delle dimensioni dei volumi.&#xA;&#xA;Se è vero che il thick provisioning risulta comunque abbastastanza agevole per via della flessibilità intrinseca dei volumi in caso di riduzione o aumento della superficie allocabile, il thin provisioning può aumentare i vantaggi derivanti da LVM in alcuni scenari.&#xA;&#xA;Il thin provisioning si basa sul principio che lo spazio assegnato ai volumi non viene usato mai completamente e mai tutto in una volta.&#xA;&#xA;Ecco perché un&#39;allocazione dinamica ci permetterebbe di definire volumi che si riempiono solo man mano che lo spazio viene occupato.&#xA;&#xA;Se si opta per un thin provisioning sarebbe opportuno non usare tutto il gruppo di volumi ma lasciarne un 20% in previsione di future espansioni.&#xA;&#xA;Con i thin pool non solo abbiamo la stessa flessibilità della gestione thick, ma possiamo lavorare anche in over provisioning ossia creare pool di volumi la cui somma potenziale sia superiore allo spazio realmente allocabile.&#xA;&#xA;Es. Supponiamo avere un device da 100 GiB, /dev/sdb, su cui definisco un volume group e creare un thin pool di 50 GiB. Su questo thin pool creeremo 3 volumi &#34;virtuali&#34; da 20, 30 e 20 GiB.&#xA;creazione volume group di 100 GiB&#xA;vgcreate vglab /dev/sdb&#xA;&#xA;creazione thin pool da 50 GiB&#xA;lvcreate -L 50G --thinpool vglab/lvtp&#xA;&#xA;creazione dei 3 volumi virtuali in &#34;over provisioning&#34; &#xA;lvcreate -V 20G --thin -n vol1virt --thinpool vglab/lvtp&#xA;lvcreate -V 30G --thin -n vol2virt --thinpool vglab/lvtp&#xA;lvcreate -V 20G --thin -n vol3virt --thinpool vglab/lvtp&#xA;Una volta creati i volumi possono essere formattati e montati come di consueto.&#xA;&#xA;Lo spazio effettivamente occupato è quasi nullo, il sistema solleverà solo un warning per avvertirci che i volumi virtuali rischiano di saturare lo spazio disponibile.&#xA;&#xA;Ecco perché bisogna prestare attenzione al raggiungimento della soglia critica.&#xA;Bisognerà estendere subito il thin pool ed i volumi virtuali nel modo consueto.&#xA;&#xA;⚠️⚠️⚠️ ATTENZIONE ⚠️⚠️⚠️&#xA;L&#39;estensione di un volume virtuale non differisce molto da quello di un volume &#34;classico&#34;.&#xA;Se lo spazio per le fette si sta esaurendo, si estendono nell&#39;ordine:&#xA;&#xA;il gruppo di volumi (se necessario)&#xA;il thin pool (se nel volume group c&#39;è spazio a sufficienza)&#xA;i volumi virtuali&#xA;i filesystem&#xA;&#xA;Se non siamo con l&#39;acqua alla gola, i punti 3 e 4 sono sufficienti. L&#39;estensione del volume virtuale è più rapida di quella classica perché non viene allocato spazio.&#xA;L&#39;estensione di un volume logico classico corrisponde all&#39;estensione del thin pool.&#xA;&#xA;Nel caso di riduzione, la situazione cambia parecchio perché la riduzione di un volume virtuale non fa guadagnare spazio allocabile visto che l&#39;ampiezza del volume è solo teorica, ciò avviene solo con fstrim.&#xA;Inoltre accorciando il volume virtuale al di sotto dei dati effettivamente scritti, si rischia di corrompere l&#39;intero filesystem.&#xA;Consiglio spassionato: ESTENDI SEMPRE E NON RIDURRE MAI!!!&#xA;&#xA;Altra considerazione va fatta anche per i metadati.&#xA;&#xA;A differenza dell&#39;LVM classico dove la creazione di un volume logico necessitava di un extent per i metadati, il thin provisioning di LVM riserva un volume logico per i dati e un volume logico per i metadati.&#xA;&#xA;L&#39;estensione continua di piccole fette, può riempire il volume dei metadati col rischio di corrompere l&#39;intero thin pool e prima che succeda, anche il volume dei metadati può dover essere esteso.&#xA;lvextend --poolmetadatasize +1G vglab/lvtp&#xA;3. Thin Pool e snapshot&#xA;Un altro bel vantaggio della modalità thin pool è quello di facilitare l&#39;uso delle snapshot.&#xA;&#xA;Trattandosi di volumi virtuali, la dimensione della snapshot non ha bisogno di essere dichiarata. La creazione di snapshot è estremamente semplice.&#xA;creazione di una snapshot&#xA;lvcreate -s -n lvsnap vglab/volvirt&#xA;Come pure sia la creazione di snapshot annidate che il rollback risultano molto più semplici ed efficienti.&#xA;creazione di una snapshot&#xA;lvcreate -s -n lvsnap1 vglab/volvirt&#xA;&#xA;creazione di una snapshot annidata&#xA;lvcreate -s -n lvsnap2 vglab/lvsnap1&#xA;&#xA;rollback&#xA;umount vol1&#xA;lvconvert --merge vglab/lvsnap2&#xA;mount -t ext4 -o defaults /dev/vglab/volvirt vol1&#xA;E a proposito di snapshot, occorre fare qualche osservazione.&#xA;&#xA;Una serie di snapshot thin annidate, non è una catena di patch incrementali esposte al filesystem come si potrebbe pensare.&#xA;In virtù del CoW, la snapshot annidate fotograferanno sempre lo stesso istante: quello del file system all&#39;origine.&#xA;&#xA;Facciamo un esempio:&#xA;lvcreate -V 10g -T vgtest/thinpool -n vmroot&#xA;mkfs.ext4 /dev/vgtest/vmroot&#xA;mount /dev/vgtest/vmroot /mnt/test&#xA;echo ORIGINAL   /mnt/test/file.txt&#xA;umount test&#xA;&#xA;lvcreate -s -n snap1 vgtest/vmroot&#xA;&#xA;mount /dev/vgtest/vmroot /mnt/test&#xA;echo MOD1   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;&#xA;lvcreate -s -n snap2 vgtest/snap1&#xA;&#xA;mount /dev/vgtest/vmroot /mnt/test&#xA;echo MOD2   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;&#xA;lvcreate -s -n snap3 vgtest/snap2&#xA;&#xA;mount /dev/vgtest/vmroot /mnt/test&#xA;echo MOD3   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;In questo esempio creo un volume virtuale, vmroot, e 3 snap annidate.&#xA;&#xA;Monto il volume virtuale.&#xA;La prima snapshot, snap1, fotografa il file system del volume virtuale che contiene il file con &#34;ORIGINAL&#34;.&#xA;Il volume virtuale viene montato e il file viene modificato.&#xA;La seconda snapshot, snap2, fotografa snap1 che a sua volta conteneva il file system del volume virtuale che contiene il file con &#34;ORIGINAL&#34;.&#xA;Il volume virtuale viene montato e il file viene modificato.&#xA;La terza snapshot, snap3, fotografa snap2 che a sua volta conteneva snap1.. ecc.&#xA;&#xA;Quindi snapshot siffatte non realizzano un versioning del file system come si potrebbe pensare, piuttosto possono essere utili per creare alberi di cloni/read-only, ambienti temporanei derivati da uno stato consistente, ecc.&#xA;&#xA;In sostanza tornano utili quando ho una base da cui faccio derivare n snapshot che condividono i blocchi comune e con CoW minimizzo lo spazio.&#xA;&#xA;Il merge di una qualunque snapshot ricondurrà il file system allo stato originario.&#xA;origin&#xA; ├── snap1&#xA; ├── snap2&#xA; ├── snap3&#xA;Per lavorare sul delta come immaginiamo, si dovranno montare via via le snapshop, non il volume virtuale, e modificare quelle.&#xA;lvcreate -V 10g -T vgtest/thinpool -n vmroot&#xA;mkfs.ext4 /dev/vgtest/vmroot&#xA;mount /dev/vgtest/vmroot /mnt/test&#xA;echo ORIGINAL   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;&#xA;lvcreate -s -n snap1 vgtest/vmroot&#xA;&#xA;lvchange -ay -K vgtest/snap1&#xA;mount /dev/vgtest/snap1 /mnt/test&#xA;echo MOD1   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;&#xA;lvcreate -s -n snap2 vgtest/snap1&#xA;&#xA;lvchange -ay -K vgtest/snap2&#xA;mount /dev/vgtest/snap2 /mnt/test&#xA;echo MOD2   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;&#xA;lvcreate -s -n snap3 vgtest/snap2&#xA;&#xA;lvchange -ay -K vgtest/snap3&#xA;mount /dev/vgtest/snap3 /mnt/test&#xA;echo MOD3   /mnt/test/file.txt&#xA;umount /mnt/test&#xA;In questo modo si &#34;inverte&#34; la logica del merge che, prima riconduceva il file system allo stato inizale, ora invece consolida le modifiche delle snapshot&#xA;origin&#xA; └── snap1&#xA;      └── snap2&#xA;           └── snap3&#xA;Il merge va fatto in ordine se si vogliono acquisire correttamente i delta.&#xA;Tuttavia questo approccio&#xA;&#xA;è raro&#xA;è difficile da gestire&#xA;complica i merge&#xA;può creare dependency tree intricati&#xA;&#xA;Per questo quasi tutti:&#xA;&#xA;snapshot sempre dell’origin&#xA;mai snapshot di snapshot&#xA;rollback lineare&#xA;&#xA;4. Cache Pool&#xA;Il cache pool di LVM serve a migliorare l&#39;accesso a dispositivi tradizionalmente lenti e lo fa combinando dischi  HDD con SSD/NVMe.&#xA;&#xA;In sostanza avremo un gruppo di volumi costituito dai dischi HDD e un altro gruppo di volumi costituito dai dischi SDD/NVMe, la nostra cache.&#xA;&#xA;Il Logical Volume Cache sul disco veloce migliora l&#39;accesso ad uno specifico volume logico del disco lento e prevede il ricorso a tutta una serie di tipi di volumi logici abbastanza variegata:&#xA;&#xA;Origin LV: volume logico orignale costituito dai dischi lenti&#xA;Cache pool LV: volume logico composto  a sua volta da altri due voumi logici: dati della cache e metadati della cache&#xA;&#x9;Cache data LV: volume logico contenente i blocchi di dati per il Cache pool LV.&#xA;&#x9;Cache metadata LV: volume logico contenente i metadatati per il Cache pool LV.&#xA;Cache LV: volume logico contenente l&#39;Origin LV e Il Cache pool LV. È il volume realemente utilizzabile&#xA;Spare metadata LV: volume logico correlato ad una funzione di recovery data failure&#xA;&#xA;cacheLVM.jpg&#xA;&#xA;Quando si crea una cache ho due possibilità a seconda che si voglia massimizzare velocità o affidabilità:&#xA;&#xA;writethrough: Le operazioni di scrittura vengono inviate sia alla cache SSD che all&#39;Origin HDD. La lettura avviene preferibilmente dalla cache.&#xA;È la modalità più sicura. Se l&#39;SSD muore, nessun dato va perso ma è meno efficiente in scrittura perché Origin HDD diventa il collo di bottiglia,&#xA;writeback: più veloce ma meno sicuro. Le scritture vengono salvate immediatamente sulla cache veloce e sincronizzate sull&#39;HDD in background in un secondo momento. Se si dovesse rompere il disco di cache, c&#39;è il rischio di una perdita di dati.&#xA;&#xA;Il dimensionamento della cache è proporzionale alla dimensione del disco origin.&#xA;Di solito si aggira in un range del 2-10%&#xA;&#xA;2%: archiviazione sequenziale, file di grandi dimensioni;&#xA;5%: standard consigliato. File server generico, utilizzo desktop/workstation;&#xA;10%: carichi di lavoro intensivi e casuali come database SQL/NoSQL attivi, nodi di virtualizzazione densi (molte VM), ecc.&#xA;&#xA;Non è necessario prevedere da subito Il disco di cache (se c&#39;è stata la possibilità tanto meglio), ma si può aggiungere in un secondo momento estendendo il gruppo di volumi contenente l&#39;HDD e battezzando l&#39;LV di cache.&#xA;&#xA;Perpariamo il nostro laboratorio in cui abbiamo un HD lento con un unico volume logico a cui applichiamo una cache.&#xA;&#xA;disco lento: 2 GiB&#xA;disco veloce: 500 MiB&#xA;cache: 5% di 2 GiB (~100 MiB)&#xA;&#xA;creazione del device fisico per il laboratorio&#xA;fallocate -l 2GiB slowdisk.img&#xA;&#xA;attach del device e creazione del gruppo di volumi&#xA;vgcreate vglab $(losetup -Pf --show slowdisk.img)&#xA;&#xA;creazione e formattazione dell&#39;unico volume logico&#xA;lvcreate -n lvorigin vglab -l 100%FREE&#xA;mkfs.ext4 /dev/vglab/lvorigin&#xA;Ora aggiungiamo il disco che farà da cache estendendo il gruppo di volumi&#xA;creazione del device fisico di cache per il laboratorio&#xA;fallocate -l 500MiB fastdisk.img&#xA;&#xA;attach del dispositivo e estensione del gruppo di volumi&#xA;DEVFAST=$(losetup -Pf --show fastdisk.img)&#xA;vgextend vglab &#34;${DEVFAST}&#34;&#xA;Il cache pool lv può essere configurato automaticamente oppure manualente&#xA;4.1. Caso 1: configurazione automatica del cache pool lv&#xA;In un unico passaggio, convertiamo il volume logico attuale in un volume logico con cache.&#xA;lvcreate \&#xA;  --type cache \&#xA;  --cachemode writethrough \&#xA;  -l 5%FREE \&#xA;  -n cachepool vglab/lvorigin &#34;${DEVFAST}&#34;&#xA;Dopo questo comando vedremo che il volume logico lvorigin incapsula il cache pool (lvorigincachecpool) e il volume logico dei dati (lvorigincorig)&#xA;&#xA;Il cache pool è composto da due volumi logici per i dati (lvorigincachecpoolcdata) e i metadati (lvorigincachecpoolcmeta)&#xA;&#xA;Infine distinguiamo anche il volume logico di metadati spare da utilizzare per un eventuale data recovery failure (lvol0pmspare).&#xA;lvs -a&#xA;  LV                           VG        Attr       LSize   Pool                   Origin            Data%  Meta%  Move Log Cpy%Sync Convert&#xA;  home                         vgfedora -wi-ao---- 409,81g                                                           &#xA;  root                         vgfedora -wi-ao----  50,00g                                                           &#xA;  swap                         vgfedora -wi-ao----  16,00g                                                           &#xA;  lvorigin                    vglab    Cwi-a-C---  &lt;2,00g [lvorigincachecpool] [lvorigincorig] 0,00   0,59            0,00&#xA;  [lvorigincorig]            vglab    owi-aoC---  &lt;2,00g                                                           &#xA;  [lvorigincachecpool]       vglab    Cwi---C---   8,00m                                          0,00   0,59            0,00&#xA;  [lvorigincachecpoolcdata] vglab    Cwi-ao----   8,00m                                                           &#xA;  [lvorigincachecpoolcmeta] vglab    ewi-ao----   8,00m                                                           &#xA;  [lvol0pmspare]              vglab    ewi-------   8,00m &#xA;&#xA;4.2. Caso 2: configurazione manuale del cache pool lv&#xA;Se invece vogliamo intervenire su ogni singolo passaggio della creazione del cache pool:&#xA;creazione dei volumi logici meta e dati per il cache pool&#xA;lvcreate -n cachepoolmeta -L 10M vglab &#34;${DEVFAST}&#34;&#xA;lvcreate -n cachepool -l 5%FREE vglab &#34;${DEVFAST}&#34;&#xA;&#xA;creazione del cache pool assemblando meta e data&#xA;lvconvert \&#xA;  --type cache-pool \&#xA;  --cachemode writethrough \&#xA;  --poolmetadata vglab/cachepoolmeta vglab/cachepool&#xA;&#xA;conversione del volume logico origin nel nuovo volume logico con cache&#xA;lvconvert \&#xA;  --type cache \&#xA;  --cachepool vglab/cachepool vglab/lvorigin&#xA;In realtà è meglio lasciare a LVM il compito di dimensionare correttamente il volume per i metadati&#xA;creazione della cache pool&#xA;lvcreate --type cache-pool -l 5%FREE -n cachecpool vglab &#34;${DEVFAST}&#34;&#xA;&#xA;conversione del volume logico originale in un volume logico con cache&#xA;lvconvert \&#xA;  --type cache \&#xA;  --cachepool vglab/cachecpool vglab/lvorigin&#xA;4.3. Switch della modalità&#xA;Per cambiare modalità fra writetrough e writeback (se non specificato nella definizione della cache pool, il default è writethrough).&#xA;lvchange --cachemode writeback vglab/lvorigin&#xA;4.4. Rimozione della cache&#xA;Se volessi levare il disco di cache e ritornare al volume logico di partenza:&#xA;lvconvert --uncache vglab/lvorigin&#xA;  Logical volume &#34;lvorigincachecpool&#34; successfully removed.&#xA;  Logical volume vglab/lvorigin is not cached.&#xA;e lvs -a mostra il volume logico in queste condizioni:&#xA;lvs -a&#xA;  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert&#xA;  lvorigin vglab    -wi-a-----  &lt;2,00g&#xA;4.5. Monitoraggio&#xA;lvs -a -o lvname,lvsize,cachemode,datapercent,metadatapercent vglab&#xA;5. LVM Stripe&#xA;Analogo a Raid 0, l&#39;uso diretto di stripe in lvm  attraverso il mappatore interno dm-stripe, permette di definire su quali e quanti dischi va frammentata l&#39;informazione da memorizzare allo scopo di aumentare le prestazioni.&#xA;&#xA;Considerazioni:&#xA;&#xA;Il gruppo di volumi deve contenere almeno due dischi fisici.&#xA;È preferibile che i dischi fisici abbiano tutti la stessa velocità altrimenti quello più lento diventerà il collo di bottiglia.&#xA;È possibile che i &lt; n, dove i è il numero di dischi per  lo stripe e n è il numero totale di dischi del gruppo di volumi&#xA;È anche possibile specificare i dischi va applicato lo stripe.&#xA;La dimensione dello stripe è di 64K come default. Ma per file molto grandi, video o database, la dimensione può essere anche di 128K o 256K&#xA;&#xA;creazione di un gruppo di volumi con 3 dischi&#xA;vgcreate vglab /dev/sdb /dev/sdc /dev/sdd&#xA;&#xA;stripe su due dischi a caso di vglab&#xA;lvcreate -i 2 -I 64k -L 10G -n lvstripe vglab&#xA;&#xA;stripe su tutti i dischi di vglab&#xA;lvcreate -i 3 -I 64k -L 10G -n lvstripe vglab&#xA;&#xA;stripe sui dischi sdc e sdd con uno stripe size di 128K&#xA;lvcreate -i 2 -I 128k -L 10G -n lvstripe vglab /dev/sdc /dev/sdd&#xA;Come ogni raid 0, massime prestazioni e sicurezza 0. Se un disco si rompe, addio ai dati.&#xA;6. LVM Mirror&#xA;Come per lvm stripe analogo a raid 0, il mirror in lvm tramite il mappatore interno dm-mirror, è assimiliabile a raid 1.&#xA;&#xA;Come ogni raid 1 che si rispetti, il chiaro vantaggio di questo approccio è proprio la ridondanza dei dati che, al costo del sacrificio di un disco, permette di correre ai ripari se uno dei dischi si danneggia.&#xA;creazione di un gruppo di volumi con 2 dischi&#xA;vgcreate vglab /dev/sdb /dev/sdc&#xA;&#xA;creazione del volume logico &#34;mirror&#34;&#xA;lvcreate -m 1 -L 10G -n lvmirror vglab&#xA;Il mirror diretto attraverso LVM in realtà è considerato legacy. Si consiglia di usare l&#39;approccio più moderno che prevede di specificare il tipo, raid x, nell&#39;invocazione di lvcreate perché userà il modulo specializzato del kernel per il raid software.&#xA;&#xA;LVM mirror infatti pur essendo funzionalmente equivalente ad un raid 1 non è altrettanto efficace perché si basa su un log di sincronizzazione dove lvm tiene traccia degli elementi allineati.&#xA;&#xA;Tale log deve stare su un altro disco (che diventa un altro punto di vulnerabilità) e quando c&#39;è bisogno di ricostruire l&#39;array in caso di rottura di un disco, l&#39;operazione è molto lenta.&#xA;7. LVM Raid&#xA;Il raid lvm è un modo per prendere il meglio dei due mondi.&#xA;&#xA;Non è che LVM abbia una sua implementazione del raid.&#xA;Il raid &#34;tradizionale&#34; si basa sul sottosistema Multiple Devices del kernel e lavora direttamente sui dispositivi a blocchi.&#xA;&#xA;LVM si interfaccia direttamente con il modulo md del kernel per attingere alle funzioni di raid così da offrire, attraverso device mapper, un&#39;interfaccia unica per la gestione dei volumi e del raid.&#xA;7.1. Raid 0 (Stripe)&#xA;lvcreate --type raid0 -i 2 -I 64k -L 10G -n lvraid0 vglab&#xA;A differenza del mirror, non ci sono gli stessi problemi per stripe. Il mappatore nativo di LVM, dm-stripe, fa bene il suo lavoro.&#xA;&#xA;Usare lvmraid in questo caso resta vantaggioso per ragioni di coerenza. L&#39;uso del modulo md rende possibile un&#39;eventuale evoluzione verso livelli superiori (come RAID 1 o RAID 5).&#xA;7.2. Raid 1 (Mirroring)&#xA;L&#39;alternativa moderna al vecchio lvm mirror che risolve i suoi problemi di efficienza usando il modulo md.&#xA;&#xA;Basandoci sull&#39;esempio di prima:&#xA;lvcreate --type raid1 -m 1 -L 10G -n lvraid1 vglab&#xA;7.3. Raid 5 (Stripe con parità singola)&#xA;Creiamo un volume logico con RAID 5 basato su 4 dischi (stripe su 3 dischi e uno per la parità):&#xA;creazione di un gruppo di volumi con 4 dischi&#xA;vgcreate vglab /dev/sdb /dev/sdc /dev/sdd /dev/sde&#xA;&#xA;creazione del volume logico con RAID 5&#xA;lvcreate --type raid5 -i 3 -L 10G -n lvraid5 vglab&#xA;7.4. Raid 6 (Stripe con parità doppia)&#xA;Se vogliamo una parità doppia su 4 dischi (2 stripe e due di parità);&#xA;creazione di un gruppo di volumi con 4 dischi&#xA;vgcreate vglab /dev/sdb /dev/sdc /dev/sdd /dev/sde&#xA;&#xA;creazione del volume logico con RAID 5&#xA;lvcreate --type raid6 -i 2 -L 10G -n lvraid6 vglab&#xA;7.5. Raid 10&#xA;E veniamo al RAID 1+0, uno stripe su n array in mirror per combinare l&#39;efficienza dello stripe con la sicurezza del mirror:&#xA;creazione di un gruppo di volumi con 4 dischi&#xA;vgcreate vglab /dev/sdb /dev/sdc /dev/sdd /dev/sde&#xA;&#xA;creazione del volume logico con RAID 5&#xA;lvcreate --type raid10 -i 2 -m 1 -L 10G -n lvraid10 vglab&#xA;7.6. Come monitorare il raid&#xA;Metodo rapido:&#xA;lvs -o name,vgname,copypercent,lvattr,raidhealthstatus,devices vglab&#xA;&#xA;Combinandolo con watch posso vedere per es. la percentuale &#xA;di completamento della copia in caso di sostituzione del disco&#xA;watch -n 1 lvs -o name,vgname,copypercent,lvattr,raidhealthstatus,devices vglab&#xA;Metodo dettagliato:&#xA;lvdisplay vglab/lvraid5&#xA;Monitoraggio a basso livello:&#xA;Balamente, visto che viene usato il modulo md:&#xA;cat /proc/mdstat&#xA;7.7. Come intervenire in caso di guasto&#xA;Con lvs vedremo che lo stato del volume è diventato degraded.&#xA;Con pvpdisplay possiamo individuare il device danneggiato che comparirà come unknown device o con un sacco di errori I/O .&#xA;&#xA;Dopo aver estratto il disco e messo quello nuovo, supponendo sia /dev/sdc, procediamo con la ricostruzione dell&#39;array:&#xA;inizializzazione nuovo disco&#xA;pvcreate /dev/sdc&#xA;&#xA;aggiunta del nuovo disco al gruppo&#xA;vgextend vglab /dev/sdc&#xA;&#xA;array rebuild&#xA;lvconvert --repair vglab/lvraid5&#xA;&#xA;rimozione disco danneggiato dal gruppo di volumi&#xA;vgreduce --removemissing vglab&#xA;#lvm #dm #devicemapper #md #multipledevices #snapshot #thinpool #thinprovisioning #cachepool #raid #lvmraid]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/0d402c64b-2701fc/8LVsevJUK9RB/pIGAWHQBQQtrEFdtoftvYLD9uFIUaLRrpYrDYhz0.jpg" alt="lvm plus">
Oltre che alla grande flessibilità nella gestione dei volumi, LVM attraverso <strong>device mapper</strong>, aggiunge tutta una serie di ulteriori capacità che rendono questa tecnologia estremamente versatile.</p>

<p>La possibilità di disporre di meccanismi per la gestione di snapshot, cache pool. thin provisioning e raid, rendono LVM qualcosa di più di un gestore di volumi.
</p>
<ul><li><a href="#1-snapshot" rel="nofollow">1. Snapshot</a>
<ul><li><a href="#1-1-attenzione-dimensione-della-snapshot" rel="nofollow">1.1. Attenzione: Dimensione della snapshot</a></li>
<li><a href="#1-2-esempio" rel="nofollow">1.2. Esempio</a></li></ul></li>
<li><a href="#2-thin-pool" rel="nofollow">2. Thin Pool</a></li>
<li><a href="#3-thin-pool-e-snapshot" rel="nofollow">3. Thin Pool e snapshot</a></li>
<li><a href="#4-cache-pool" rel="nofollow">4. Cache Pool</a>
<ul><li><a href="#4-1-caso-1-configurazione-automatica-del-cache-pool-lv" rel="nofollow">4.1. Caso 1: configurazione automatica del cache pool lv</a></li>
<li><a href="#4-2-caso-2-configurazione-manuale-del-cache-pool-lv" rel="nofollow">4.2. Caso 2: configurazione manuale del cache pool lv</a></li>
<li><a href="#4-3-switch-della-modalit%C3%A0" rel="nofollow">4.3. Switch della modalità</a></li>
<li><a href="#4-4-rimozione-della-cache" rel="nofollow">4.4. Rimozione della cache</a></li>
<li><a href="#4-5-monitoraggio" rel="nofollow">4.5. Monitoraggio</a></li></ul></li>
<li><a href="#5-lvm-stripe" rel="nofollow">5. LVM Stripe</a></li>
<li><a href="#6-lvm-mirror" rel="nofollow">6. LVM Mirror</a></li>
<li><a href="#7-lvm-raid" rel="nofollow">7. LVM Raid</a>
<ul><li><a href="#7-1-raid-0-stripe" rel="nofollow">7.1. Raid 0 (Stripe)</a></li>
<li><a href="#7-2-raid-1-mirroring" rel="nofollow">7.2. Raid 1 (Mirroring)</a></li>
<li><a href="#7-3-raid-5-stripe-con-parit%C3%A0-singola" rel="nofollow">7.3. Raid 5 (Stripe con parità singola)</a></li>
<li><a href="#7-4-raid-6-stripe-con-parit%C3%A0-doppia" rel="nofollow">7.4. Raid 6 (Stripe con parità doppia)</a></li>
<li><a href="#7-5-raid-10" rel="nofollow">7.5. Raid 10</a></li>
<li><a href="#7-6-come-monitorare-il-raid" rel="nofollow">7.6. Come monitorare il raid</a></li>
<li><a href="#7-7-come-intervenire-in-caso-di-guasto" rel="nofollow">7.7. Come intervenire in caso di guasto</a></li></ul></li></ul>

<h2 id="1-snapshot">1. Snapshot</h2>

<p>Le snapshot LVM usano la tecnica del <strong>C</strong>opy-<strong>o</strong>n-<strong>W</strong>rite (<strong>CoW</strong>) allo scopo di ridurre la duplicazione.</p>

<p>La snapshot dovrà essre la fotografia del volume prima all&#39;origine.</p>

<p>Ad ogni modifica / cancellazione, il file originale verrà portato sulla snapshot prima dell&#39;operazione.
Sul volume originale verranno scritti tutti i dati nuovi e quelli modificati.</p>

<p>Per il <strong>ripristino</strong>, si effettua quello che si chiama <strong>merge</strong>, dove i dati vecchi vengono ripristinati dalla snapshot e quelli nuovi cancellati dal volume.</p>

<p>Per il consolidamento delle modifiche, basterò rimuovere la snapshot,</p>

<h3 id="1-1-attenzione-dimensione-della-snapshot">1.1. Attenzione: Dimensione della snapshot</h3>

<p>Se la snapshot ha la stessa dimensione del volume logico non ci sono problemi.</p>

<p>Se è più piccola, occorre prestare attenzione a che la quantità dei dati modificati sul volume logico non superino la dimensione della snapshot.</p>

<p>In questo caso infatti la snapshot risulterà inutilizzabile e non potrà più essere usata per il ripristino ma potrà essree solo rimossa.</p>

<h3 id="1-2-esempio">1.2. Esempio</h3>

<p>Supponiamo di avere un gruppo di volumi, <strong>my_vg</strong>, composto da 3 volumi logici:</p>
<ul><li><strong>lv_root</strong> (30 GiB)</li>
<li><strong>lv_home</strong> (200 GiB)</li>
<li><strong>lv_dati</strong> (500 GiB)</li></ul>

<p>e di voler creare una snapshot precauzionale sulla root (supponendo di avere spazio a sufficienza altrimenti dovrò fare bene i miei conti per non riempire oltremisura la snapshot rendendola inservibile).</p>

<p><strong>Creazione snapshot</strong></p>

<pre><code class="language-bash">lvcreate -s -L 30G -n  lv_root_snap my_vg/snap
</code></pre>

<p><strong>Ripristino</strong></p>

<pre><code class="language-bash">umount /dev/my_vg/lv_root
lvconvert --merge my_vg/snap
</code></pre>

<p><strong>Consolidamento</strong></p>

<pre><code class="language-bash">lvremove snap
</code></pre>

<h2 id="2-thin-pool">2. Thin Pool</h2>

<p>Il <strong>thin provisioning</strong> di LVM è l&#39;alternativa dinamica alla classica gestione di volumi, <strong>thick</strong>, che prevede l&#39;assegnazione statica delle dimensioni dei volumi.</p>

<p>Se è vero che il <strong>thick provisioning</strong> risulta comunque abbastastanza agevole per via della flessibilità intrinseca dei volumi in caso di riduzione o aumento della superficie allocabile, il <strong>thin provisioning</strong> può aumentare i vantaggi derivanti da LVM in alcuni scenari.</p>

<p>Il thin provisioning si basa sul principio che lo spazio assegnato ai volumi non viene usato mai completamente e mai tutto in una volta.</p>

<p>Ecco perché un&#39;allocazione dinamica ci permetterebbe di definire volumi che si riempiono <strong>solo</strong> man mano che lo spazio viene occupato.</p>

<p>Se si opta per un thin provisioning sarebbe opportuno non usare tutto il gruppo di volumi ma lasciarne un 20% in previsione di future espansioni.</p>

<p>Con i thin pool non solo abbiamo la stessa flessibilità della gestione thick, ma possiamo lavorare anche in <strong>over provisioning</strong> ossia creare pool di volumi la cui somma potenziale sia superiore allo spazio realmente allocabile.</p>

<p>Es. Supponiamo avere un device da 100 GiB, <code>/dev/sdb</code>, su cui definisco un volume group e creare un thin pool di 50 GiB. Su questo thin pool creeremo 3 volumi “virtuali” da 20, 30 e 20 GiB.</p>

<pre><code class="language-bash"># creazione volume group di 100 GiB
vgcreate vg_lab /dev/sdb

# creazione thin pool da 50 GiB
lvcreate -L 50G --thinpool vg_lab/lv_tp

# creazione dei 3 volumi virtuali in &#34;over provisioning&#34; 
lvcreate -V 20G --thin -n vol1_virt --thinpool vg_lab/lv_tp
lvcreate -V 30G --thin -n vol2_virt --thinpool vg_lab/lv_tp
lvcreate -V 20G --thin -n vol3_virt --thinpool vg_lab/lv_tp
</code></pre>

<p>Una volta creati i volumi possono essere formattati e montati come di consueto.</p>

<p>Lo spazio effettivamente occupato è quasi nullo, il sistema solleverà solo un warning per avvertirci che i volumi virtuali rischiano di saturare lo spazio disponibile.</p>

<p>Ecco perché bisogna prestare attenzione al raggiungimento della soglia critica.
Bisognerà estendere subito il thin pool ed i volumi virtuali nel <a href="https://cyberdynesystem.wordpress.com/2026/04/21/ridimensionare-volumi-lvm/#step-4-estendere-il-volume-logico" rel="nofollow">modo consueto</a>.</p>

<p>⚠️⚠️⚠️ <strong>ATTENZIONE</strong> ⚠️⚠️⚠️
L&#39;estensione di un volume virtuale non differisce molto da quello di un volume “classico”.
Se lo spazio per le fette si sta esaurendo, si estendono nell&#39;ordine:</p>
<ol><li>il gruppo di volumi (se necessario)</li>
<li>il thin pool (se nel volume group c&#39;è spazio a sufficienza)</li>
<li>i volumi virtuali</li>
<li>i filesystem</li></ol>

<p>Se non siamo con l&#39;acqua alla gola, i punti 3 e 4 sono sufficienti. L&#39;estensione del volume virtuale è più rapida di quella classica perché non viene allocato spazio.
L&#39;estensione di un volume logico classico corrisponde all&#39;estensione del thin pool.</p>

<p>Nel caso di riduzione, la situazione cambia parecchio perché la riduzione di un volume virtuale non fa guadagnare spazio allocabile visto che l&#39;ampiezza del volume è solo teorica, ciò avviene solo con <code>fstrim</code>.
Inoltre accorciando il volume virtuale al di sotto dei dati effettivamente scritti, si rischia di corrompere l&#39;intero filesystem.
<strong>Consiglio spassionato:</strong> ESTENDI SEMPRE E NON RIDURRE MAI!!!</p>

<p>Altra considerazione va fatta anche per i metadati.</p>

<p>A differenza dell&#39;LVM classico dove la creazione di un volume logico necessitava di un extent per i metadati, il thin provisioning di LVM riserva un volume logico per i dati e un volume logico per i metadati.</p>

<p>L&#39;estensione continua di piccole fette, può riempire il volume dei metadati col rischio di corrompere l&#39;intero thin pool e prima che succeda, anche il volume dei metadati può dover essere esteso.</p>

<pre><code class="language-bash">lvextend --poolmetadatasize +1G vg_lab/lv_tp
</code></pre>

<h2 id="3-thin-pool-e-snapshot">3. Thin Pool e snapshot</h2>

<p>Un altro bel vantaggio della modalità thin pool è quello di facilitare l&#39;uso delle snapshot.</p>

<p>Trattandosi di volumi virtuali, la dimensione della snapshot non ha bisogno di essere dichiarata. La creazione di snapshot è estremamente semplice.</p>

<pre><code class="language-bash"># creazione di una snapshot
lvcreate -s -n lv_snap vg_lab/vol_virt
</code></pre>

<p>Come pure sia la creazione di snapshot annidate che il rollback risultano molto più semplici ed efficienti.</p>

<pre><code class="language-bash"># creazione di una snapshot
lvcreate -s -n lv_snap1 vg_lab/vol_virt

# creazione di una snapshot annidata
lvcreate -s -n lv_snap2 vg_lab/lv_snap1

# rollback
umount vol_1
lvconvert --merge vg_lab/lv_snap2
mount -t ext4 -o defaults /dev/vg_lab/vol_virt vol_1
</code></pre>

<p>E a proposito di snapshot, occorre fare qualche osservazione.</p>

<p>Una serie di snapshot thin annidate, non è una catena di patch incrementali esposte al filesystem come si potrebbe pensare.
In virtù del CoW, la snapshot annidate fotograferanno sempre lo stesso istante: quello del file system all&#39;origine.</p>

<p>Facciamo un esempio:</p>

<pre><code class="language-bash">lvcreate -V 10g -T vgtest/thinpool -n vmroot
mkfs.ext4 /dev/vgtest/vmroot
mount /dev/vgtest/vmroot /mnt/test
echo ORIGINAL &gt; /mnt/test/file.txt
umount test

lvcreate -s -n snap1 vgtest/vmroot

mount /dev/vgtest/vmroot /mnt/test
echo MOD1 &gt; /mnt/test/file.txt
umount /mnt/test

lvcreate -s -n snap2 vgtest/snap1

mount /dev/vgtest/vmroot /mnt/test
echo MOD2 &gt; /mnt/test/file.txt
umount /mnt/test

lvcreate -s -n snap3 vgtest/snap2

mount /dev/vgtest/vmroot /mnt/test
echo MOD3 &gt; /mnt/test/file.txt
umount /mnt/test
</code></pre>

<p>In questo esempio creo un volume virtuale, <code>vmroot</code>, e 3 snap annidate.</p>
<ol><li>Monto il volume virtuale.</li>
<li>La prima snapshot, <code>snap1</code>, fotografa il file system del volume virtuale che contiene il file con “ORIGINAL”.</li>
<li>Il volume virtuale viene montato e il file viene modificato.</li>
<li>La seconda snapshot, <code>snap2</code>, fotografa <code>snap1</code> che <strong>a sua volta conteneva il file system del volume virtuale che contiene il file con “ORIGINAL”</strong>.</li>
<li>Il volume virtuale viene montato e il file viene modificato.</li>
<li>La terza snapshot, <code>snap3</code>, fotografa <code>snap2</code> che <strong>a sua volta conteneva snap1.. ecc.</strong></li></ol>

<p>Quindi snapshot siffatte non realizzano un versioning del file system come si potrebbe pensare, piuttosto possono essere utili per creare alberi di cloni/read-only, ambienti temporanei derivati da uno stato consistente, ecc.</p>

<p>In sostanza tornano utili quando ho una base da cui faccio derivare <em>n</em> snapshot che condividono i blocchi comune e con CoW minimizzo lo spazio.</p>

<p>Il merge di una qualunque snapshot ricondurrà il file system allo stato originario.</p>

<pre><code>origin
 ├── snap1
 ├── snap2
 ├── snap3
</code></pre>

<p>Per lavorare sul delta come immaginiamo, si dovranno montare via via le snapshop, non il volume virtuale, e modificare quelle.</p>

<pre><code class="language-bash">lvcreate -V 10g -T vgtest/thinpool -n vmroot
mkfs.ext4 /dev/vgtest/vmroot
mount /dev/vgtest/vmroot /mnt/test
echo ORIGINAL &gt; /mnt/test/file.txt
umount /mnt/test

lvcreate -s -n snap1 vgtest/vmroot

lvchange -ay -K vgtest/snap1
mount /dev/vgtest/snap1 /mnt/test
echo MOD1 &gt; /mnt/test/file.txt
umount /mnt/test

lvcreate -s -n snap2 vgtest/snap1

lvchange -ay -K vgtest/snap2
mount /dev/vgtest/snap2 /mnt/test
echo MOD2 &gt; /mnt/test/file.txt
umount /mnt/test

lvcreate -s -n snap3 vgtest/snap2

lvchange -ay -K vgtest/snap3
mount /dev/vgtest/snap3 /mnt/test
echo MOD3 &gt; /mnt/test/file.txt
umount /mnt/test
</code></pre>

<p>In questo modo si “inverte” la logica del merge che, prima riconduceva il file system allo stato inizale, ora invece consolida le modifiche delle snapshot</p>

<pre><code>origin
 └── snap1
      └── snap2
           └── snap3
</code></pre>

<p>Il merge va fatto in ordine se si vogliono acquisire correttamente i delta.
Tuttavia questo approccio</p>
<ul><li>è raro</li>
<li>è difficile da gestire</li>
<li>complica i merge</li>
<li>può creare dependency tree intricati</li></ul>

<p>Per questo quasi tutti:</p>
<ul><li>snapshot sempre dell’origin</li>
<li>mai snapshot di snapshot</li>
<li>rollback lineare</li></ul>

<h2 id="4-cache-pool">4. Cache Pool</h2>

<p>Il cache pool di LVM serve a migliorare l&#39;accesso a dispositivi tradizionalmente lenti e lo fa combinando dischi  HDD con SSD/NVMe.</p>

<p>In sostanza avremo un gruppo di volumi costituito dai dischi HDD e un altro gruppo di volumi costituito dai dischi SDD/NVMe, la nostra cache.</p>

<p>Il <strong>Logical Volume Cache</strong> sul disco veloce migliora l&#39;accesso ad uno specifico volume logico del disco lento e prevede il ricorso a tutta una serie di tipi di volumi logici abbastanza variegata:</p>
<ul><li><strong>Origin LV</strong>: volume logico orignale costituito dai dischi lenti</li>
<li><strong>Cache pool LV</strong>: volume logico composto  a sua volta da altri due voumi logici: dati della cache e metadati della cache
<ul><li><strong>Cache data LV</strong>: volume logico contenente i <strong>blocchi di dati</strong> per il <strong>Cache pool LV</strong>.</li>
<li><strong>Cache metadata LV</strong>: volume logico contenente i <strong>metadatati</strong> per il <strong>Cache pool LV</strong>.</li></ul></li>
<li><strong>Cache LV</strong>: volume logico contenente l&#39;<strong>Origin LV</strong> e Il <strong>Cache pool LV</strong>. È il volume realemente utilizzabile</li>
<li><strong>Spare metadata LV</strong>: volume logico correlato ad una funzione di recovery data failure</li></ul>

<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/0d402c64b-2701fc/ghjmK6oYuYls/Zt6F2X7EaV5JxGJ3ZsvML0XgUmFAPWjrC4BlHSAA.jpg" alt="cacheLVM.jpg"></p>

<p>Quando si crea una cache ho due possibilità a seconda che si voglia massimizzare velocità o affidabilità:</p>
<ul><li><strong>writethrough</strong>: Le operazioni di scrittura vengono inviate sia alla cache SSD che all&#39;Origin HDD. La lettura avviene preferibilmente dalla cache.
È la modalità più sicura. Se l&#39;SSD muore, nessun dato va perso ma è meno efficiente in scrittura perché Origin HDD diventa il collo di bottiglia,</li>
<li><strong>writeback</strong>: più veloce ma meno sicuro. Le scritture vengono salvate immediatamente sulla cache veloce e sincronizzate sull&#39;HDD in background in un secondo momento. Se si dovesse rompere il disco di cache, c&#39;è il rischio di una perdita di dati.</li></ul>

<p>Il dimensionamento della cache è proporzionale alla dimensione del disco origin.
Di solito si aggira in un range del 2-10%</p>
<ul><li>2%: archiviazione sequenziale, file di grandi dimensioni;</li>
<li>5%: <strong>standard consigliato</strong>. File server generico, utilizzo desktop/workstation;</li>
<li>10%: carichi di lavoro intensivi e casuali come database SQL/NoSQL attivi, nodi di virtualizzazione densi (molte VM), ecc.</li></ul>

<p>Non è necessario prevedere da subito Il disco di cache (se c&#39;è stata la possibilità tanto meglio), ma si può aggiungere in un secondo momento estendendo il gruppo di volumi contenente l&#39;HDD e battezzando l&#39;LV di cache.</p>

<p>Perpariamo il nostro laboratorio in cui abbiamo un HD lento con un unico volume logico a cui applichiamo una cache.</p>
<ul><li>disco lento: 2 GiB</li>
<li>disco veloce: 500 MiB</li>
<li>cache: 5% di 2 GiB (~100 MiB)</li></ul>

<pre><code class="language-bash"># creazione del device fisico per il laboratorio
fallocate -l 2GiB slow_disk.img

# attach del device e creazione del gruppo di volumi
vgcreate vg_lab $(losetup -Pf --show slow_disk.img)

# creazione e formattazione dell&#39;unico volume logico
lvcreate -n lv_origin vg_lab -l 100%FREE
mkfs.ext4 /dev/vg_lab/lv_origin
</code></pre>

<p>Ora aggiungiamo il disco che farà da cache estendendo il gruppo di volumi</p>

<pre><code class="language-bash"># creazione del device fisico di cache per il laboratorio
fallocate -l 500MiB fast_disk.img

# attach del dispositivo e estensione del gruppo di volumi
DEV_FAST=$(losetup -Pf --show fast_disk.img)
vgextend vg_lab &#34;${DEV_FAST}&#34;
</code></pre>

<p>Il cache pool lv può essere configurato automaticamente oppure manualente</p>

<h3 id="4-1-caso-1-configurazione-automatica-del-cache-pool-lv">4.1. Caso 1: configurazione automatica del cache pool lv</h3>

<p>In un unico passaggio, convertiamo il volume logico attuale in un volume logico con cache.</p>

<pre><code class="language-bash">lvcreate \
  --type cache \
  --cachemode writethrough \
  -l 5%FREE \
  -n cache_pool vg_lab/lv_origin &#34;${DEV_FAST}&#34;
</code></pre>

<p>Dopo questo comando vedremo che il volume logico <strong>lv_origin</strong> incapsula il cache pool (<strong>lv<em>origincache</em>cpool</strong>) e il volume logico dei dati (<strong>lv<em>origin</em>corig</strong>)</p>

<p>Il cache pool è composto da due volumi logici per i dati (<strong>lv<em>origincache</em>cpool_cdata</strong>) e i metadati (<strong>lv<em>origincache</em>cpool_cmeta</strong>)</p>

<p>Infine distinguiamo anche il volume logico di metadati spare da utilizzare per un eventuale data recovery failure (<strong>lvol0_pmspare</strong>).</p>

<pre><code class="language-bash">lvs -a
  LV                           VG        Attr       LSize   Pool                   Origin            Data%  Meta%  Move Log Cpy%Sync Convert
  home                         vg_fedora -wi-ao---- 409,81g                                                           
  root                         vg_fedora -wi-ao----  50,00g                                                           
  swap                         vg_fedora -wi-ao----  16,00g                                                           
  lv_origin                    vg_lab    Cwi-a-C---  &lt;2,00g [lv_origincache_cpool] [lv_origin_corig] 0,00   0,59            0,00
  [lv_origin_corig]            vg_lab    owi-aoC---  &lt;2,00g                                                           
  [lv_origincache_cpool]       vg_lab    Cwi---C---   8,00m                                          0,00   0,59            0,00
  [lv_origincache_cpool_cdata] vg_lab    Cwi-ao----   8,00m                                                           
  [lv_origincache_cpool_cmeta] vg_lab    ewi-ao----   8,00m                                                           
  [lvol0_pmspare]              vg_lab    ewi-------   8,00m 

</code></pre>

<h3 id="4-2-caso-2-configurazione-manuale-del-cache-pool-lv">4.2. Caso 2: configurazione manuale del cache pool lv</h3>

<p>Se invece vogliamo intervenire su ogni singolo passaggio della creazione del cache pool:</p>

<pre><code class="language-bash"># creazione dei volumi logici meta e dati per il cache pool
lvcreate -n cache_pool_meta -L 10M vg_lab &#34;${DEV_FAST}&#34;
lvcreate -n cache_pool -l 5%FREE vg_lab &#34;${DEV_FAST}&#34;

# creazione del cache pool assemblando meta e data
lvconvert \
  --type cache-pool \
  --cachemode writethrough \
  --poolmetadata vg_lab/cache_pool_meta vg_lab/cache_pool

# conversione del volume logico origin nel nuovo volume logico con cache
lvconvert \
  --type cache \
  --cachepool vg_lab/cache_pool vg_lab/lv_origin
</code></pre>

<p>In realtà è meglio lasciare a LVM il compito di dimensionare correttamente il volume per i metadati</p>

<pre><code class="language-bash"># creazione della cache pool
lvcreate --type cache-pool -l 5%FREE -n cache_cpool vg_lab &#34;${DEV_FAST}&#34;

# conversione del volume logico originale in un volume logico con cache
lvconvert \
  --type cache \
  --cachepool vg_lab/cache_cpool vg_lab/lv_origin
</code></pre>

<h3 id="4-3-switch-della-modalità">4.3. Switch della modalità</h3>

<p>Per cambiare modalità fra <strong>writetrough</strong> e <strong>writeback</strong> (se non specificato nella definizione della cache pool, il default è <strong>writethrough</strong>).</p>

<pre><code class="language-bash">lvchange --cachemode writeback vg_lab/lv_origin
</code></pre>

<h3 id="4-4-rimozione-della-cache">4.4. Rimozione della cache</h3>

<p>Se volessi levare il disco di cache e ritornare al volume logico di partenza:</p>

<pre><code class="language-bash">lvconvert --uncache vg_lab/lv_origin
  Logical volume &#34;lv_origincache_cpool&#34; successfully removed.
  Logical volume vg_lab/lv_origin is not cached.
```https://noblogo.org/ebdpsbxxid/edit#publish
e `lvs -a` mostra il volume logico in queste condizioni:
```bash
lvs -a
  LV        VG        Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_origin vg_lab    -wi-a-----  &lt;2,00g
</code></pre>

<h3 id="4-5-monitoraggio">4.5. Monitoraggio</h3>

<pre><code class="language-bash">lvs -a -o lv_name,lv_size,cache_mode,data_percent,metadata_percent vg_lab
</code></pre>

<h2 id="5-lvm-stripe">5. LVM Stripe</h2>

<p>Analogo a <strong>Raid 0</strong>, l&#39;uso diretto di stripe in lvm  attraverso il mappatore interno <strong>dm-stripe</strong>, permette di definire su quali e quanti dischi va frammentata l&#39;informazione da memorizzare allo scopo di aumentare le prestazioni.</p>

<p><strong>Considerazioni:</strong></p>
<ul><li>Il gruppo di volumi deve contenere almeno due dischi fisici.</li>
<li>È preferibile che i dischi fisici abbiano tutti la stessa velocità altrimenti quello più lento diventerà il collo di bottiglia.</li>
<li>È possibile che <em>i</em> &lt; <em>n</em>, dove <em>i</em> è il numero di dischi per  lo stripe e <em>n</em> è il numero totale di dischi del gruppo di volumi</li>
<li>È anche possibile specificare i dischi va applicato lo stripe.</li>
<li>La dimensione dello stripe è di 64K come default. Ma per file molto grandi, video o database, la dimensione può essere anche di 128K o 256K</li></ul>

<pre><code class="language-bash"># creazione di un gruppo di volumi con 3 dischi
vgcreate vg_lab /dev/sdb /dev/sdc /dev/sdd

# stripe su due dischi a caso di vg_lab
lvcreate -i 2 -I 64k -L 10G -n lv_stripe vg_lab

# stripe su tutti i dischi di vg_lab
lvcreate -i 3 -I 64k -L 10G -n lv_stripe vg_lab

# stripe sui dischi sdc e sdd con uno stripe size di 128K
lvcreate -i 2 -I 128k -L 10G -n lv_stripe vg_lab /dev/sdc /dev/sdd
</code></pre>

<p>Come ogni raid 0, massime prestazioni e sicurezza 0. Se un disco si rompe, addio ai dati.</p>

<h2 id="6-lvm-mirror">6. LVM Mirror</h2>

<p>Come per <strong>lvm stripe</strong> analogo a <strong>raid 0</strong>, il <strong>mirror</strong> in lvm tramite il mappatore interno <strong>dm-mirror</strong>, è assimiliabile a <strong>raid 1</strong>.</p>

<p>Come ogni raid 1 che si rispetti, il chiaro vantaggio di questo approccio è proprio la ridondanza dei dati che, al costo del sacrificio di un disco, permette di correre ai ripari se uno dei dischi si danneggia.</p>

<pre><code class="language-bash"># creazione di un gruppo di volumi con 2 dischi
vgcreate vg_lab /dev/sdb /dev/sdc

# creazione del volume logico &#34;mirror&#34;
lvcreate -m 1 -L 10G -n lv_mirror vg_lab
</code></pre>

<p>Il mirror diretto attraverso LVM in realtà è considerato legacy. Si consiglia di usare l&#39;approccio più moderno che prevede di specificare il tipo, raid <em>x</em>, nell&#39;invocazione di <strong>lvcreate</strong> perché userà il modulo specializzato del kernel per il raid software.</p>

<p>LVM mirror infatti pur essendo funzionalmente equivalente ad un raid 1 non è altrettanto efficace perché si basa su un log di sincronizzazione dove lvm tiene traccia degli elementi allineati.</p>

<p>Tale log deve stare su un altro disco (che diventa un altro punto di vulnerabilità) e quando c&#39;è bisogno di ricostruire l&#39;array in caso di rottura di un disco, l&#39;operazione è molto lenta.</p>

<h2 id="7-lvm-raid">7. LVM Raid</h2>

<p>Il raid lvm è un modo per prendere il meglio dei due mondi.</p>

<p>Non è che LVM abbia una sua implementazione del raid.
Il raid “tradizionale” si basa sul sottosistema <strong>Multiple Devices</strong> del kernel e lavora direttamente sui dispositivi a blocchi.</p>

<p>LVM si interfaccia direttamente con il modulo <strong>md</strong> del kernel per attingere alle funzioni di raid così da offrire, attraverso <strong>device mapper</strong>, un&#39;interfaccia unica per la gestione dei volumi e del raid.</p>

<h3 id="7-1-raid-0-stripe">7.1. Raid 0 (Stripe)</h3>

<pre><code class="language-bash">lvcreate --type raid0 -i 2 -I 64k -L 10G -n lv_raid0 vg_lab
</code></pre>

<p>A differenza del mirror, non ci sono gli stessi problemi per stripe. Il mappatore nativo di LVM, <strong>dm-stripe</strong>, fa bene il suo lavoro.</p>

<p>Usare lvmraid in questo caso resta vantaggioso per ragioni di coerenza. L&#39;uso del modulo <strong>md</strong> rende possibile un&#39;eventuale evoluzione verso livelli superiori (come RAID 1 o RAID 5).</p>

<h3 id="7-2-raid-1-mirroring">7.2. Raid 1 (Mirroring)</h3>

<p>L&#39;alternativa moderna al vecchio lvm mirror che risolve i suoi problemi di efficienza usando il modulo <strong>md</strong>.</p>

<p>Basandoci sull&#39;esempio di prima:</p>

<pre><code class="language-bash">lvcreate --type raid1 -m 1 -L 10G -n lv_raid1 vg_lab
</code></pre>

<h3 id="7-3-raid-5-stripe-con-parità-singola">7.3. Raid 5 (Stripe con parità singola)</h3>

<p>Creiamo un volume logico con RAID 5 basato su 4 dischi (stripe su 3 dischi e uno per la parità):</p>

<pre><code class="language-bash"># creazione di un gruppo di volumi con 4 dischi
vgcreate vg_lab /dev/sdb /dev/sdc /dev/sdd /dev/sde

# creazione del volume logico con RAID 5
lvcreate --type raid5 -i 3 -L 10G -n lv_raid5 vg_lab
</code></pre>

<h3 id="7-4-raid-6-stripe-con-parità-doppia">7.4. Raid 6 (Stripe con parità doppia)</h3>

<p>Se vogliamo una parità doppia su 4 dischi (2 stripe e due di parità);</p>

<pre><code class="language-bash"># creazione di un gruppo di volumi con 4 dischi
vgcreate vg_lab /dev/sdb /dev/sdc /dev/sdd /dev/sde

# creazione del volume logico con RAID 5
lvcreate --type raid6 -i 2 -L 10G -n lv_raid6 vg_lab
</code></pre>

<h3 id="7-5-raid-10">7.5. Raid 10</h3>

<p>E veniamo al RAID 1+0, uno stripe su <em>n</em> array in mirror per combinare l&#39;efficienza dello stripe con la sicurezza del mirror:</p>

<pre><code class="language-bash"># creazione di un gruppo di volumi con 4 dischi
vgcreate vg_lab /dev/sdb /dev/sdc /dev/sdd /dev/sde

# creazione del volume logico con RAID 5
lvcreate --type raid10 -i 2 -m 1 -L 10G -n lv_raid10 vg_lab
</code></pre>

<h3 id="7-6-come-monitorare-il-raid">7.6. Come monitorare il raid</h3>

<p><strong>Metodo rapido:</strong></p>

<pre><code class="language-bash">lvs -o name,vg_name,copy_percent,lv_attr,raid_health_status,devices vg_lab

# Combinandolo con watch posso vedere per es. la percentuale 
# di completamento della copia in caso di sostituzione del disco
watch -n 1 lvs -o name,vg_name,copy_percent,lv_attr,raid_health_status,devices vg_lab
</code></pre>

<p><strong>Metodo dettagliato:</strong></p>

<pre><code class="language-bash">lvdisplay vg_lab/lv_raid5
</code></pre>

<p><strong>Monitoraggio a basso livello:</strong>
Balamente, visto che viene usato il modulo <strong>md</strong>:</p>

<pre><code class="language-bash">cat /proc/mdstat
</code></pre>

<h3 id="7-7-come-intervenire-in-caso-di-guasto">7.7. Come intervenire in caso di guasto</h3>

<p>Con <code>lvs</code> vedremo che lo stato del volume è diventato <code>degraded</code>.
Con <code>pvpdisplay</code> possiamo individuare il device danneggiato che comparirà come <code>unknown device</code> o con un sacco di errori I/O .</p>

<p>Dopo aver estratto il disco e messo quello nuovo, supponendo sia <code>/dev/sdc</code>, procediamo con la ricostruzione dell&#39;array:</p>

<pre><code class="language-bash"># inizializzazione nuovo disco
pvcreate /dev/sdc

# aggiunta del nuovo disco al gruppo
vgextend vg_lab /dev/sdc

# array rebuild
lvconvert --repair vg_lab/lv_raid5

# rimozione disco danneggiato dal gruppo di volumi
vgreduce --removemissing vg_lab
</code></pre>

<p><a href="/aytin/tag:lvm" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">lvm</span></a> <a href="/aytin/tag:dm" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">dm</span></a> <a href="/aytin/tag:devicemapper" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">devicemapper</span></a> <a href="/aytin/tag:md" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">md</span></a> <a href="/aytin/tag:multipledevices" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">multipledevices</span></a> <a href="/aytin/tag:snapshot" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">snapshot</span></a> <a href="/aytin/tag:thinpool" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">thinpool</span></a> <a href="/aytin/tag:thinprovisioning" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">thinprovisioning</span></a> <a href="/aytin/tag:cachepool" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cachepool</span></a> <a href="/aytin/tag:raid" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">raid</span></a> <a href="/aytin/tag:lvmraid" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">lvmraid</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/cose-molto-notevoli-su-lvm</guid>
      <pubDate>Mon, 25 May 2026 06:08:02 +0000</pubDate>
    </item>
  </channel>
</rss>