<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>filesystem &amp;mdash; Cyberdyne Systems</title>
    <link>https://noblogo.org/aytin/tag:filesystem</link>
    <description>&#34;Fare o non fare. Non c&#39;è provare!&#34;</description>
    <pubDate>Sat, 25 Apr 2026 11:42:30 +0000</pubDate>
    <item>
      <title>Ridimensionare volumi LVM</title>
      <link>https://noblogo.org/aytin/ridimensionare-volumi-lvm</link>
      <description>&lt;![CDATA[lvm&#xA;Supponiamo di avere 3 volumi logici, ad es. vol1, vol2, vol3 e di voler aumentare il secondo a discapito degli altri due.&#xA;&#xA;Un’esigenza analoga, su un filesystem partizionato in 3 parti in maniera canonica, è un mezzo incubo perché il ridimensionamento della partizione centrale prevede un discreto numero di salti mortali per manenere la contiguità e per non rischiare di lasciare buchetti inutilizzabili fra una partizione e l’altra. &#xA;!--more--&#xA;&#xA;1. Cose che è bene ricordare quando si manipolano i volumi logici&#xA;2. Scenario 1: Estensione e riduzione di volumi logici&#xA;   2.1. Step 0: curiosità&#xA;   2.2. Step 1: Smontare i dischi&#xA;   2.3. Step 2: Riduzione del filesystem&#xA;   2.4. Step 3: Ridimensionare i volumi logici&#xA;   2.5. Step 4: Estendere il volume logico&#xA;   2.6. Step 5: Bonus&#xA;3. Scenario 2: Estensione e riduzione di gruppi di volume&#xA;4. Conclusione&#xA;&#xA;Provo a buttare giù due righe su quello che mi verrebbe di fare:&#xA;&#xA;riduco la prima partizione&#xA;riduco la terza partizione&#xA;sposto la terza partizione fino alla fine del disco&#xA;sposto la seconda partizione fino alla fine della prima partizione&#xA;estendo la seconda partizione fino alla fine della prima&#xA;&#xA;Tutto questo tenendo presente che l’unità minima allocabile è il blocco (512 bytes) e che l’operazione che mi fa più paura è il move della partizione. parted non ha un comando “move” diretto. La procedura richiede di calcolare i nuovi settori, spostare i dati e aggiornare la tabella delle partizioni.&#xA;&#xA;Senza una GUI come quella di gparted, bisogna farsi letteralmente i conti con carta e penna prima di agire e c’è il rischio, comunque molto alto, di commettere errori che sarebbero disastrosi.&#xA;&#xA;LVM, al confronto, è una boccata d’ossigeno.&#xA;&#xA;LVM dà la possibilità di ridimensionare volumi in maniera più semplice rispetto al partizionamento più tradizionale perché la dimensione della partizione è disaccoppiata da concetti di contiguità e dalla geometria del disco.&#xA;&#xA;Nel caso del partizionamento tradizionale infatti le partizioni sono dei blocchi di settori consecutivi in cui ogni partizione inizia in un settore finisce in un altro.&#xA;&#xA;Con LVM invece l’approccio è radicalmente diverso. La minima unità allocabile è l’extent (default 4 MiB) che serve per mappare un volume fisico in un volume logico.&#xA;&#xA;Se immaginiamo che il volume fisico possa essere spezzettato in altrettanti extents in una sorta di “paniere”, il volume group, il volume logico non è altro che un insieme di questi extents pescati dal volume group (senza alcuna pretesa d’ordinamento) a cui posso:&#xA;&#xA;aggiungere extents prelevandoli dal volume group&#xA;levare extents riponendoli nel volume group (o assegnandoli ad altri volumi logici).&#xA;&#xA;Queste proprietà conferiscono una grande flessibilità alle operazioni di riduzione ed estensione dei volumi.&#xA;&#xA;1. Cose che è bene ricordare quando si manipolano i volumi logici.&#xA;&#xA;Partizioni&#xA;Quando si riduce o aumenta un filesystem, è bene smontare le partizioni e volumi logici.&#xA;&#xA;Ridurre un volume logico&#xA;Quando si riduce un volume logico, si deve:&#xA;&#xA;fare un check del filesystem&#xA;ridurre il filesystem&#xA;ridurre il volume logico&#xA;&#xA;Estendere un volume logico&#xA;Quando si aumenta un volume logico, al contrario, si deve:&#xA;&#xA;estendere il volume logico&#xA;estendere il filesystem&#xA;fare un check del filesystem&#xA;&#xA;Calcolare lo spazio allocabile&#xA;Un volume logico è composto da un insieme di extents, blocchi grandi di default 4 MiB, che sono la minima unità allocabile. Un volume logico è quindi sempre corrispondente ad un multiplo di 4 MiB, n extents di cui n\-1 allocabili, il rimanente per i metadati. Ad es. un volume logico di 2 GiB è composta da 512 extents di cui 511 allocabili.&#xA;&#xA;La potenza di due&#xA;Si deve tenere sempre presente che, nella matematica del calcolo dello spazio, si considerano le potenze di 2. Non di 10. Quindi un GiB equivale a 1024 MiB, non a 1000. Di conseguenza, se dividessi un GiB in due parti uguali avrei 2 blocchi da 512 MiB non da 500.&#xA;&#xA;Estensione e riduzione&#xA;Nelle istruzioni di estensione (lvextend) e riduzione (lvreduce) possiamo scegliere ciò che va specificato fra 4 modalità:&#xA;&#xA;il numero totale di extents&#xA;il delta in aggiunta o in diminuzione degli extents (a seconde che l’operazione sia rispettivamente di estensione o di riduzione)&#xA;la dimensione totale espressa in KiB-MiB-GiB-TiB&#xA;come prima, il delta in aggiunta o in diminuzione della dimensione espresso in KiB-MiB-GiB-TiB&#xA;&#xA;2. Scenario 1: Estensione e riduzione di volumi logici&#xA;Supponiamo di avere un disco da 2 GiB (2048 MiB) diviso in 3 volumi logici da 550 MiB, 350 MiB e 1148 MiB di e di volerne ridurre due per ampliare il terzo.&#xA;&#xA;Vogliamo ridurre il primo di 150 MiB, il terzo di 330 MiB e aumentare corrispondentemente il secondo volume di 480 MiB.&#xA;&#xA;Prepariamo il laboratorio col solito file appiccicato ad un loop device. Su quello definirò il volume group, il mio “paniere” di extents.&#xA;creazione device&#xA;fallocate -l 2GiB disk1.img&#xA;&#xA;creazione device e volum group&#xA;vgcreate vglab $(losetup -Pf --show disk1.img)&#xA;&#xA;creazione volumi logici&#xA;lvcreate -n lvlab1 vglab -L 550M&#xA;lvcreate -n lvlab2 vglab -L 350M&#xA;lvcreate -n lvlab3 vglab -l 100%FREE&#xA;&#xA;formattazione volumi logici&#xA;mkfs.ext4 /dev/vglab/lvlab1&#xA;mkfs.ext4 /dev/vglab/lvlab2&#xA;mkfs.ext4 /dev/vglab/lvlab3&#xA;&#xA;mount dei volumi&#xA;mkdir vol1 vol2 vol3&#xA;mount -t ext4 -o defaults /dev/vglab/lvlab1 vol1&#xA;mount -t ext4 -o defaults /dev/vglab/lvlab2 vol2&#xA;mount -t ext4 -o defaults /dev/vglab/lvlab3 vol3&#xA;2.1. Step 0: curiosità&#xA;Prima di cominciare esaminiamo un po’ di dati, ad es. di quanti extents sono composti i nostri oggetti.&#xA;pvdisplay /dev/loop9&#xA;  --- Physical volume ---&#xA;  PV Name               /dev/loop9&#xA;  VG Name               vglab&#xA;  PV Size               2,00 GiB / not usable 4,00 MiB&#xA;  Allocatable           yes (but full)&#xA;  PE Size               4,00 MiB&#xA;  Total PE              511&#xA;  Free PE               0&#xA;  Allocated PE          511&#xA;  PV UUID               YmLOru-bIdL-iqGb-vJfI-RsTk-yhv7-vSJhkX&#xA;pvdisplay mi dà informazioni sul disco fisico che andrò ad aggiungere nel volume group. Fra queste:&#xA;&#xA;PV Name: il nome del device, /dev/loop9&#xA;VG Name: è il nome del gruppo di volume, vglab, visibile solo perché abbiamo creato il gruppo di volume direttamente sul dispositivo invece che passare prima da pvcreate.&#xA;PV Size: 2 GiB, la dimensione del nostro “disco”&#xA;PE Size: dove PE sta Physical Extent, è di 4 MiB&#xA;Total PE sono i PE totali e sono 511, come previsto.&#xA;&#xA;vgdisplay vglab&#xA;  --- Volume group ---&#xA;  VG Name               vglab&#xA;  System ID&#xA;  Format                lvm2&#xA;  Metadata Areas        1&#xA;  Metadata Sequence No  1&#xA;  VG Access             read/write&#xA;  VG Status             resizable&#xA;  MAX LV                0&#xA;  Cur LV                0&#xA;  Open LV               0&#xA;  Max PV                0&#xA;  Cur PV                1&#xA;  Act PV                1&#xA;  VG Size               &lt;2,00 GiB&#xA;  PE Size               4,00 MiB&#xA;  Total PE              511&#xA;  Alloc PE / Size       0 / 0&#xA;  Free  PE / Size       511 / &lt;2,00 GiB&#xA;  VG UUID               6D89ck-c2Ni-XlMN-5Was-rh5j-vi2t-5juCXt&#xA;vgdisplay mi dà informazioni sul gruppo di volumi. Fra queste, disitnguiamo&#xA;&#xA;VG Name: il nome del volume group, già visto in pvdisplay, vglab&#xA;VG Size: la dimensione del volume group, minore di 2 GiB perché ci sono i metadati da considerari&#xA;PE Size: la dimensione di un extent, 4 MiB&#xA;Total PE / Size: Il numero totale di extent allocabili, che conferma VG Size, pari a 511 invece che 512.&#xA;Alloc PE: il numero totale di extent allocati, momento della creazione del volume group è 0&#xA;Free PE / Size: il numero totale di extent liberi, prima della creazione dei volumi logici è 511&#xA;&#xA;Cosa succede quando creerò i volumi logici? Che cambia il numero di PE liberi e allocati. Siccome userò tutti gli extent disponibili, i valori per Alloc PE e Free PE si invertiranno rispetto a prima.&#xA;&#xA;Infatti dopo la creazione dei volumi logici, vgdisplay mi dirà:&#xA;vgdisplay vglab&#xA;  --- Volume group ---&#xA;  VG Name               vglab&#xA;  ...&#xA;  Alloc PE / Size       511 / &lt;2,00 GiB&#xA;  Free  PE / Size       0 / 0&#xA;  ...  &#xA;511 extents allocati come confermato dai dati desumibili dei 3 volumi logici&#xA;lvdisplay vglab&#xA; --- Logical volume ---&#xA;  LV Path                /dev/vglab/lvlab1&#xA;  LV Name                lvlab1&#xA;  VG Name                vglab&#xA;...&#xA;  LV Size                552,00 MiB&#xA;  Current LE             138&#xA;...&#xA; --- Logical volume ---&#xA;  LV Path                /dev/vglab/lvlab2&#xA;  LV Name                lvlab2&#xA;  VG Name                vglab&#xA;...&#xA;  LV Size                352,00 MiB&#xA;  Current LE             88&#xA;...&#xA; --- Logical volume ---&#xA;  LV Path                /dev/vglab/lvlab3&#xA;  LV Name                lvlab2&#xA;  VG Name                vglab&#xA;...&#xA;  LV Size                1,11 GiB&#xA;  Current LE             285&#xA;...&#xA;Per il primo, il secondo e il terzo volume logico abbiamo rispettivamente:&#xA;&#xA;138, 88, 285 extents corrispondenti a&#xA;552 MiB, 352 MiB e 1140 MiB (1,11 GiB)&#xA;per un totale di 2044 MiB, al netto dei metadati.&#xA;&#xA;Possiamo notare subito che le dimensioni non corrispondono a quanto indicato in lvcreate.&#xA;lvcreate -n lvlab1 vglab -L 550M&#xA;lvcreate -n lvlab2 vglab -L 350M&#xA;lvcreate -n lvlab3 vglab -l 100%FREE&#xA;Questo succede perché vengono sempre approssimate all’extent più vicino. Ecco perché il primo e il secondo volume sono diventati di 552 (138 extents) e 352 MiB (88 extents).&#xA;&#xA;Sempre ricordando la particolarità dei multipli di 4 MiB legati a LVM, anche la riduzione di 150 MiB e di 330 MiB dei due volumi saranno approssimate sempre all’extent più vicino (152 MiB=38 extents e 332=83 extents). Questo dettaglio si rivelerà fondamentale quando dovremo ridimensionare il filesystem.&#xA;&#xA;Con questa rinnovata consapevolezza cominciamo a ridimensionare.&#xA;2.2. Step 1: Smontare i dischi&#xA;umount /dev/vglab/lvlab1&#xA;umount /dev/vglab/lvlab2&#xA;umount /dev/vglab/lvlab3&#xA;2.3. Step 2: Riduzione del filesystem&#xA;Se dovessi ridimensionare solo il filesystem, sarebbe sufficiente considerare dimensioni che siano potenze di 2 e non di 10.&#xA;&#xA;Ma sapendo che sotto c’è un LVM, sappiamo che per mantenere l’allineamento fra filesystem e volumi logici, oltre che potenze di due le dimensioni devono essere anche multipli di 4MiB.&#xA;&#xA;Ecco perché anche nel resize reale del filesystem non dovrò levare 150 MiB e 330 MiB ma 148 MiB (37 PE) e 328 (82 PE) (è buona norma approssimare per difetto all’extent più vicino per maggior prudenza) per un totale effettivo di 476 MiB (119 PE)&#xA;&#xA;Il filesystem del primo volume sarà dunque di 552 MiB - 148 MiB = 404 MiB. Il filesystem del terzo volume sarà di 1140 MiB - 328 MiB = 812 MiB.&#xA;check dei filesystem&#xA;e2fsck -f /dev/vglab/lvlab1&#xA;e2fsck -f /dev/vglab/lvlab2&#xA;e2fsck -f /dev/vglab/lvlab3&#xA;&#xA;Riduco il primo filesystem di 148 MiB&#xA;resize2fs /dev/vglab/lvlab1 404M&#xA;&#xA;Riduco il terzo filesystem di 328 MiB&#xA;resize2fs /dev/vglab/lvlab3 812M&#xA;2.4. Step 3: Ridimensionare i volumi logici&#xA;La riduzione del volume logico può essere fatta in 4 modi come sappiamo, ad es. sul primo volume:&#xA;il numero totale di extents, 138 PE - 37 PE = 101 PE&#xA;lvreduce -l 101 /dev/vglab/lvlab1 #oppure&#xA;&#xA;il numero di exrtents da sottrarre, 38 PE&#xA;lvreduce -l -37 /dev/vglab/lvlab1 #oppure&#xA;&#xA;la dimensione totale da ottenere, 404 MiB&#xA;lvreduce -L 404M /dev/vglab/lvlab1 #oppure&#xA;&#xA;il numero di MiB da sottrarre, 148 MiB&#xA;lvreduce -L -148M /dev/vglab/lvlab1 #oppure&#xA;Per maggior chiarezza userò il size assoluto in modo da farlo corrispondere a resize2fs&#xA;Riduco il primo volume logico di 148 Mib&#xA;lvreduce -L 404M /dev/vglab/lvlab1&#xA;&#xA;Riduco il terzo volume logico di 328 Mib&#xA;lvreduce -L 812M /dev/vglab/lvlab3&#xA;Verifichiamo quanti siano i PE residui&#xA;vgdisplay vglab | grep &#34;Free  PE&#34;&#xA; Free  PE / Size       119 / 476,00 MiB&#xA;119 extents, come previsto.&#xA;2.5. Step 4: Estendere il volume logico&#xA;Dopo aver ridotto il primo e il terzo volume, non ci rimane che estendere il secondo in base alla scaletta indicata prima:&#xA;&#xA;si estende il secondo volume logico&#xA;si estende il filesystem&#xA;si esegue il check fnale del filesystem&#xA;&#xA;L’estensione del volume, come ormai ben sappiamo, non sarà di 480 MiB ma di 476 MiB (37 PE + 82 PE = 119 PE) per via degli arrotondamenti effettuati nella riduzione degli altri volumi logici.&#xA;specifico gli extent che so essere residui&#xA;lvextend -l +119 /dev/vglab/lvlab2&#xA;o, equivalentemente&#xA;lvextend -L +476M /dev/vglab/lvlab2&#xA;&#xA;estendo il filesystem&#xA;resize2fs /dev/vglab/lvlab2 828M&#xA;&#xA;check filesystem&#xA;e2fsck -f /dev/vglab/lvlab2&#xA;2.6. Step 5: Bonus&#xA;Come premio per essere arrivato in fondo, posso rivelare come fare in un colpo solo tutte le operazioni descritte sopra.&#xA;&#xA;È vero che c&#39;è poco da considerare, giusto tenere a mente che su LVM ogni oggetto è multiplo di 4 MiB e che bisogna ridimensionare filesystem e volumi logici in ugual modo per non generare pericolose anomalie, ma tutte le operazioni che ho descritto nei passi 2-4 possono essere fatte con un unico comando che provvederà ad eseguire nell&#39;ordine corretto e con le giuste approssimazioni:&#xA;&#xA;il check del filesystem&#xA;il ridimensionamento del filesystem&#xA;il ridimensionamento dei volumi logici&#xA;&#xA;Dunque, tutto il pippone atomico precedente può essere condensato in un unico, solido comando:&#xA;Riduce il primo volume logico e il filesystem&#xA;lvreduce -r -L -150M /dev/vglab/lvlab1&#xA;&#xA;Riduce il terzo volume logico e il filesystem&#xA;lvreduce -r -L -330M /dev/vglab/lvlab3&#xA;&#xA;Estende il secondo volume logico e il filesystem&#xA;lvextend -r -l +119 /dev/vglab/lvlab2&#xA;Ora spieghiamo il perché soprattutto dell&#39;extend, che è interessante.&#xA;&#xA;Diciamo che è tutto molto guidato e le eventuali correzioni da apportare, senza spaccarsi troppo il cervello, sono suggerite con estrema chiarezza, basta leggere.&#xA;lvreduce -r -L -150M /dev/vglab/lvlab1&#xA; Rounding size to boundary between physical extents: 148.00 MiB.&#xA;  File system ext4 found on vglab/lvlab1.&#xA;  File system size (552.00 MiB) is larger than the requested size (404.00 MiB).&#xA;  File system reduce is required using resize2fs.&#xA;...&#xA;  Size of logical volume vglab/lvlab1 changed from 552.00 MiB (138 extents) to 404.00 MiB (101 extents).&#xA;  Logical volume vglab/lvlab1 successfully resized.&#xA;Ci dice innanzitutto che:&#xA;&#xA;c&#39;è stato un arrotondamento a 148 MiB (37 extents);&#xA;il filesystem è più grande del volume richiesto pertanto va subito ridimensionato;&#xA;infine si ridimensiona il volume logico da 552 MiB (138 extents) a 404 MiB (101 extents).&#xA;&#xA;Anche il secondo lvreduce ha un risultato analogo&#xA;lvreduce -r -L -330M /dev/vglab/lvlab3&#xA;  Rounding size to boundary between physical extents: 328.00 MiB.&#xA;  File system ext4 found on vglab/lvlab3.&#xA;  File system size (1.11 GiB) is larger than the requested size (812.00 MiB).&#xA;  File system reduce is required using resize2fs.&#xA;...&#xA;  Size of logical volume vglab/lvlab3 changed from 1.11 GiB (285 extents) to 812.00 MiB (203 extents).&#xA;  Logical volume vglab/lvlab3 successfully resized.&#xA;&#xA;anche qui abbiamo un arrotondamento a 328 MiB (82 extents);&#xA;il filesystem è più grande del volume richiesto pertanto va subito ridimensionato;&#xA;infine si ridimensiona il volume logico da 1140 MiB (285 extents) a 812 MiB (203 extents).&#xA;&#xA;È facilissimo desumere che la massima dimensione dell&#39;estensione sia 148 MiB + 328 MiB = 476 MiB (119 extents), basta fare una somma.&#xA;&#xA;Ma supponiamo di essere particolarmente distratti e proviamo ad estendere considerando le quantità iniziali: 150 MiB + 330 MiB = 480 MiB&#xA;lvextend -r -L +480M /dev/vglab/lvlab2&#xA;  File system ext4 found on vglab/lvlab2.&#xA;  File system fsck will be run before extend.&#xA;  Insufficient free space: 120 extents needed, but only 119 available&#xA;Nonostante la mia distrazione, come si può vedere, non si producono danni perché l&#39;ouput è categorico: &#34;non faccio nulla. Se vuoi, puoi aumentare al max di 476 MiB (119 extents)&#34;.&#xA;Non ci sono danni e anzi c&#39;è pure il suggerimento risolutivo.&#xA;&#xA;Ed ecco spiegato il mio extend di prima.&#xA;3. Scenario 2: Estensione e riduzione di gruppi di volume&#xA;Esaminiamo le possibilità di aggiungere o rimuovere dispositivi ad un volume group esistente.&#xA;&#xA;Ricreiamo il laboratorio partendo da 3 dischi, poi aggiungeremo due nuovi dischi e ne rimuoveremo altrettanti, il tutto senza intaccare l&#39;integrità dei dati.&#xA;&#xA;creazione di 5 device&#xA;for i in {1..9}: do fallocate -l 1GiB disk${i}.img; done&#xA;&#xA;creazione del gruppo di volumi con 3 device&#xA;vgcreate vglab \&#xA;  $(losetup -Pf --show disk1.img) \&#xA;  $(losetup -Pf --show disk2.img) \&#xA;  $(losetup -Pf --show disk3.img)&#xA;&#xA;crezione di 3 volumi logici&#xA;lvcreate -n lvlab1 vglab -l 300&#xA;lvcreate -n lvlab2 vglab -l 250&#xA;lvcreate -n lvlab3 vglab -l 100%FREE&#xA;&#xA;formattazione dei 3 dispositivi&#xA;mkfs.ext4 /dev/vglab/lvlab1&#xA;mkfs.ext4 /dev/vglab/lvlab2&#xA;mkfs.ext4 /dev/vglab/lvlab3&#xA;Ecco come sono distribuiti i volumi logici all&#39;interno dei dischi fisici&#xA;lsblk -o NAME,FSTYPE,SIZE,TYPE&#xA;  NAME               FSTYPE        SIZE      TYPE&#xA;  loop9              LVM2member     1G      loop&#xA;  └─vglab-lvlab1                1,2G      lvm&#xA;  loop10             LVM2member     1G      loop&#xA;  ├─vglab-lvlab1                1,2G      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;  loop11             LVM2member     1G      loop&#xA;  ├─vglab-lvlab2               1000M      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;Il gruppo di volumi è composto da 3 volumi fisici tutti attivi&#xA;vgdisplay vglab |grep PV&#xA;  Max PV                0&#xA;  Cur PV                3&#xA;  Act PV                3&#xA;Andiamo ad estendere il nostro gurppo di volumi con altri due device&#xA;vgextend vglab $(losetup -Pf --show disk4.img) $(losetup -Pf --show disk5.img)&#xA;I nuovi dischi sono visibili in fondo, come si può vedere anche da  vgdisplay che mostra i 5 dischi tutti attivi. &#xA;lsblk -o NAME,FSTYPE,SIZE,TYPE&#xA;  NAME               FSTYPE        SIZE      TYPE&#xA;  loop9              LVM2member     1G      loop&#xA;  └─vglab-lvlab1                1,2G      lvm&#xA;  loop10             LVM2member     1G      loop&#xA;  ├─vglab-lvlab1                1,2G      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;  loop11             LVM2member     1G      loop&#xA;  ├─vglab-lvlab2               1000M      lvm&#xA;  └─vglab-lvlab3                860M      lvmchan&#xA;  loop12             LVM2member     1G      loop&#xA;  loop13             LVM2member     1G      loop&#xA;&#xA;vgdisplay vglab |grep PV&#xA;  Max PV                0&#xA;  Cur PV                5&#xA;  Act PV                5&#xA;Potremo usare i nuovi dischi per estendere i volumi logici esistenti ma li impiegheremo invece per rimpiazzare i primi due dischi. &#xA;&#xA;pvmove distribuisce tutti gli extents del disco fra tutti i volumi fisici che hanno spazio a sufficienza. Se non dovesse essercene, restituirà un messaggio d&#39;errore.&#xA;pvmove /dev/loop9&#xA;  /dev/loop9: Moved: 3,14%&#xA;  /dev/loop9: Moved: 100,00%&#xA;Alla fine dell&#39;operazione il disco s&#39;è liberato di tutti i suoi extents e può essere rimosso&#xA;lsblk -o NAME,FSTYPE,SIZE,TYPE&#xA;  NAME               FSTYPE        SIZE      TYPE&#xA;  loop9              LVM2member     1G      loop&#xA;  loop10             LVM2member     1G      loop&#xA;  ├─vglab-lvlab1                1,2G      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;  loop11             LVM2member     1G      loop&#xA;  ├─vglab-lvlab2               1000M      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;  loop12             LVM2member     1G      loop&#xA;  └─vglab-lvlab1                1,2G      lvm&#xA;  loop13             LVM2member     1G      loop&#xA;Prima si estrae il volume fisico dal gruppo di volumi e poi si rimuove il volume fisico e così può essere scollegato.&#xA;vgreduce vglab /dev/loop9&#xA;pvremove /dev/loop9&#xA;Verifichiamo che il volume fisico non sia più presente.&#xA;vgdisplay vglab |grep PV&#xA;  Max PV                0&#xA;  Cur PV                4&#xA;  Act PV                4&#xA;Procediamo allo stesso modo col secondo disco.&#xA;pvmove /dev/loop10&#xA;  /dev/loop10: Moved: 9,80%&#xA;  /dev/loop10: Moved: 17,65%&#xA;  /dev/loop10: Moved: 100,00%&#xA;&#xA;vgreduce vglab /dev/loop10&#xA;  Removed &#34;/dev/loop10&#34; from volume group &#34;vglab&#34;&#xA;&#xA;pvremove /dev/loop10&#xA;  Labels on physical volume &#34;/dev/loop10&#34; successfully wiped.&#xA;In conclusione possiamo vedere il gruppo di volumi con solo 3 dischi, gli altri due completamente disimpegnati col gruppo di volumi ricostituitosi attorno ai 3 dischi rimanenti. E tutto spostando semplicemente gli extents dove c&#39;era disponibilità in maniera totalmente trasparente per il filesystem.&#xA;vgdisplay vglab |grep PV&#xA;  Max PV                0&#xA;  Cur PV                3&#xA;  Act PV                3&#xA;&#xA;lsblk -o NAME,FSTYPE,SIZE,TYPE&#xA;  NAME               FSTYPE        SIZE      TYPE&#xA;  loop9                              1G      loop&#xA;  loop10                             1G      loop&#xA;  loop11             LVM2member     1G      loop&#xA;  ├─vglab-lvlab2               1000M      lvm&#xA;  └─vglab-lvlab3                860M      lvm&#xA;  loop12             LVM2member     1G      loop&#xA;  └─vglab-lvlab1                1,2G      lvm&#xA;  loop13             LVM2member     1G      loop&#xA;  ├─vglab-lvlab1                1,2G      lvm&#xA;  └─vglab-lvlab_3                860M      lvm&#xA;4. Conclusione&#xA;Ho solo sfiorato la complessità e le capacità offerte da LVM.&#xA;&#xA;L&#39;estensione e la riduzione di volumi logici e di gruppi di volumi sono scenari di base. Tuttavia sono sufficienti per mostrare come sia semplice, con i volumi logici, compiere operazioni che con un filesystem partizionato in maniera classica sarebbero complicatissime.&#xA;&#xA;#lvm #volumegroup #logicalvolume #filesystem #devicemapper]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://pixelfed.uno/storage/m/_v2/489827599091373610/31410d826-759a86/YynFD6sqFGzb/E2tgEVkaEtWT6Ucn0rqMrtk9qnJlr5p9nLl9m5pu.jpg" alt="lvm">
Supponiamo di avere 3 volumi logici, ad es. vol1, vol2, vol3 e di voler aumentare il secondo a discapito degli altri due.</p>

<p>Un’esigenza analoga, su un filesystem partizionato in 3 parti in maniera canonica, è un mezzo incubo perché il ridimensionamento della partizione centrale prevede un discreto numero di salti mortali per manenere la contiguità e per non rischiare di lasciare buchetti inutilizzabili fra una partizione e l’altra.
</p>
<ul><li><a href="#1-cose-che-%C3%A8-bene-ricordare-quando-si-manipolano-i-volumi-logici" rel="nofollow">1. Cose che è bene ricordare quando si manipolano i volumi logici</a></li>
<li><a href="#2-scenario-1-estensione-e-riduzione-di-volumi-logici" rel="nofollow">2. Scenario 1: Estensione e riduzione di volumi logici</a>
<ul><li><a href="#2-1-step-0-curiosit%C3%A0" rel="nofollow">2.1. Step 0: curiosità</a></li>
<li><a href="#2-2-step-1-smontare-i-dischi" rel="nofollow">2.2. Step 1: Smontare i dischi</a></li>
<li><a href="#2-3-step-2-riduzione-del-filesystem" rel="nofollow">2.3. Step 2: Riduzione del filesystem</a></li>
<li><a href="#2-4-step-3-ridimensionare-i-volumi-logici" rel="nofollow">2.4. Step 3: Ridimensionare i volumi logici</a></li>
<li><a href="#2-5-step-4-estendere-il-volume-logico" rel="nofollow">2.5. Step 4: Estendere il volume logico</a></li>
<li><a href="#2-6-step-5-bonus" rel="nofollow">2.6. Step 5: Bonus</a></li></ul></li>
<li><a href="#3-scenario-2-estensione-e-riduzione-di-gruppi-di-volume" rel="nofollow">3. Scenario 2: Estensione e riduzione di gruppi di volume</a></li>
<li><a href="#4-conclusione" rel="nofollow">4. Conclusione</a></li></ul>

<p>Provo a buttare giù due righe su quello che mi verrebbe di fare:</p>
<ol><li>riduco la prima partizione</li>
<li>riduco la terza partizione</li>
<li>sposto la terza partizione fino alla fine del disco</li>
<li>sposto la seconda partizione fino alla fine della prima partizione</li>
<li>estendo la seconda partizione fino alla fine della prima</li></ol>

<p>Tutto questo tenendo presente che l’unità minima allocabile è il blocco (512 bytes) e che l’operazione che mi fa più paura è il move della partizione. <code>parted</code> non ha un comando “move” diretto. La procedura richiede di calcolare i nuovi settori, spostare i dati e aggiornare la tabella delle partizioni.</p>

<p>Senza una GUI come quella di <strong>gparted</strong>, bisogna farsi letteralmente i conti con carta e penna prima di agire e c’è il rischio, comunque molto alto, di commettere errori che sarebbero disastrosi.</p>

<p>LVM, al confronto, è una boccata d’ossigeno.</p>

<p>LVM dà la possibilità di ridimensionare volumi in maniera più semplice rispetto al partizionamento più tradizionale perché la dimensione della partizione è disaccoppiata da concetti di contiguità e dalla geometria del disco.</p>

<p>Nel caso del partizionamento tradizionale infatti le partizioni sono dei blocchi di settori consecutivi in cui ogni partizione inizia in un settore finisce in un altro.</p>

<p>Con LVM invece l’approccio è radicalmente diverso. La minima unità allocabile è l’<strong>extent</strong> (default 4 MiB) che serve per mappare un volume fisico in un volume logico.</p>

<p>Se immaginiamo che il volume fisico possa essere spezzettato in altrettanti extents in una sorta di “paniere”, il <strong>volume group</strong>, il volume logico non è altro che un insieme di questi extents pescati dal volume group (senza alcuna pretesa d’ordinamento) a cui posso:</p>
<ul><li>aggiungere extents prelevandoli dal volume group</li>
<li>levare extents riponendoli nel volume group (o assegnandoli ad altri volumi logici).</li></ul>

<p>Queste proprietà conferiscono una grande flessibilità alle operazioni di riduzione ed estensione dei volumi.</p>

<h2 id="1-cose-che-è-bene-ricordare-quando-si-manipolano-i-volumi-logici">1. Cose che è bene ricordare quando si manipolano i volumi logici.</h2>

<p><strong>Partizioni</strong>
Quando si riduce o aumenta un filesystem, è bene smontare le partizioni e volumi logici.</p>

<p><strong>Ridurre un volume logico</strong>
Quando si riduce un volume logico, si deve:</p>
<ol><li>fare un check del filesystem</li>
<li>ridurre il filesystem</li>
<li>ridurre il volume logico</li></ol>

<p><strong>Estendere un volume logico</strong>
Quando si aumenta un volume logico, al contrario, si deve:</p>
<ol><li>estendere il volume logico</li>
<li>estendere il filesystem</li>
<li>fare un check del filesystem</li></ol>

<p><strong>Calcolare lo spazio allocabile</strong>
Un volume logico è composto da un <strong>insieme di extents</strong>, blocchi grandi di default 4 MiB, che sono la minima unità allocabile. Un volume logico è quindi <strong>sempre</strong> corrispondente ad un multiplo di 4 MiB, <em>n</em> extents di cui <em>n</em>-1 allocabili, il rimanente per i metadati. Ad es. un volume logico di 2 GiB è composta da 512 extents di cui <strong>511 allocabili</strong>.</p>

<p><strong>La potenza di due</strong>
Si deve tenere <strong>sempre</strong> presente che, nella matematica del calcolo dello spazio, si considerano le potenze di 2. Non di 10. Quindi un GiB equivale a 1024 MiB, non a 1000. Di conseguenza, se dividessi un GiB in due parti uguali avrei 2 blocchi da 512 MiB non da 500.</p>

<p><strong>Estensione e riduzione</strong>
Nelle istruzioni di estensione (<strong>lvextend</strong>) e riduzione (<strong>lvreduce</strong>) possiamo scegliere ciò che va specificato fra 4 modalità:</p>
<ol><li>il <strong>numero totale</strong> di extents</li>
<li>il <strong>delta</strong> in aggiunta o in diminuzione degli extents (a seconde che l’operazione sia rispettivamente di estensione o di riduzione)</li>
<li>la dimensione totale espressa in KiB-MiB-GiB-TiB</li>
<li>come prima, il delta in aggiunta o in diminuzione della dimensione espresso in KiB-MiB-GiB-TiB</li></ol>

<h2 id="2-scenario-1-estensione-e-riduzione-di-volumi-logici">2. Scenario 1: Estensione e riduzione di volumi logici</h2>

<p>Supponiamo di avere un disco da 2 GiB (2048 MiB) diviso in 3 volumi logici da <strong>550 MiB</strong>, <strong>350 MiB</strong> e <strong>1148 MiB</strong> di e di volerne ridurre due per ampliare il terzo.</p>

<p>Vogliamo ridurre il primo di <strong>150 MiB</strong>, il terzo di <strong>330 MiB</strong> e aumentare corrispondentemente il secondo volume di <strong>480 MiB</strong>.</p>

<p>Prepariamo il laboratorio col solito file appiccicato ad un loop device. Su quello definirò il volume group, il mio “paniere” di extents.</p>

<pre><code class="language-bash"># creazione device
fallocate -l 2GiB disk_1.img

# creazione device e volum group
vgcreate vg_lab $(losetup -Pf --show disk_1.img)

# creazione volumi logici
lvcreate -n lv_lab_1 vg_lab -L 550M
lvcreate -n lv_lab_2 vg_lab -L 350M
lvcreate -n lv_lab_3 vg_lab -l 100%FREE

# formattazione volumi logici
mkfs.ext4 /dev/vg_lab/lv_lab_1
mkfs.ext4 /dev/vg_lab/lv_lab_2
mkfs.ext4 /dev/vg_lab/lv_lab_3

# mount dei volumi
mkdir vol_1 vol_2 vol_3
mount -t ext4 -o defaults /dev/vg_lab/lv_lab_1 vol_1
mount -t ext4 -o defaults /dev/vg_lab/lv_lab_2 vol_2
mount -t ext4 -o defaults /dev/vg_lab/lv_lab_3 vol_3
</code></pre>

<h3 id="2-1-step-0-curiosità">2.1. Step 0: curiosità</h3>

<p>Prima di cominciare esaminiamo un po’ di dati, ad es. di quanti extents sono composti i nostri oggetti.</p>

<pre><code class="language-bash">pvdisplay /dev/loop9
  --- Physical volume ---
  PV Name               /dev/loop9
  VG Name               vg_lab
  PV Size               2,00 GiB / not usable 4,00 MiB
  Allocatable           yes (but full)
  PE Size               4,00 MiB
  Total PE              511
  Free PE               0
  Allocated PE          511
  PV UUID               YmLOru-bIdL-iqGb-vJfI-RsTk-yhv7-vSJhkX
</code></pre>

<p><code>pvdisplay</code> mi dà informazioni sul disco fisico che andrò ad aggiungere nel volume group. Fra queste:</p>
<ul><li><strong>PV Name</strong>: il nome del device, <strong>/dev/loop9</strong></li>
<li><strong>VG Name</strong>: è il nome del gruppo di volume, <strong>vg_lab</strong>, visibile solo perché abbiamo creato il gruppo di volume direttamente sul dispositivo invece che passare prima da <strong>pvcreate</strong>.</li>
<li><strong>PV Size</strong>: 2 GiB, la dimensione del nostro “disco”</li>
<li><strong>PE Size</strong>: dove <strong>PE</strong> sta <strong>P</strong>hysical <strong>E</strong>xtent, è di 4 MiB</li>
<li><strong>Total PE</strong> sono i PE totali e sono <strong>511</strong>, come previsto.</li></ul>

<pre><code class="language-bash">vgdisplay vg_lab
  --- Volume group ---
  VG Name               vg_lab
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               &lt;2,00 GiB
  PE Size               4,00 MiB
  Total PE              511
  Alloc PE / Size       0 / 0
  Free  PE / Size       511 / &lt;2,00 GiB
  VG UUID               6D89ck-c2Ni-XlMN-5Was-rh5j-vi2t-5juCXt
</code></pre>

<p><code>vgdisplay</code> mi dà informazioni sul gruppo di volumi. Fra queste, disitnguiamo</p>
<ul><li><strong>VG Name</strong>: il nome del volume group, già visto in <code>pvdisplay</code>, <strong>vg_lab</strong></li>
<li><strong>VG Size</strong>: la dimensione del volume group, minore di 2 GiB perché ci sono i metadati da considerari</li>
<li><strong>PE Size</strong>: la dimensione di un extent, 4 MiB</li>
<li><strong>Total PE / Size</strong>: Il numero totale di extent allocabili, che conferma <strong>VG Size</strong>, pari a <strong>511</strong> invece che <strong>512</strong>.</li>
<li><strong>Alloc PE</strong>: il numero totale di extent allocati, momento della creazione del volume group è <strong>0</strong></li>
<li><strong>Free PE / Size</strong>: il numero totale di extent liberi, prima della creazione dei volumi logici è <strong>511</strong></li></ul>

<p>Cosa succede quando creerò i volumi logici? Che cambia il numero di PE liberi e allocati. Siccome userò tutti gli extent disponibili, i valori per <code>Alloc PE</code> e <code>Free PE</code> si invertiranno rispetto a prima.</p>

<p>Infatti dopo la creazione dei volumi logici, <code>vgdisplay</code> mi dirà:</p>

<pre><code class="language-bash">vgdisplay vg_lab
  --- Volume group ---
  VG Name               vg_lab
  ...
  Alloc PE / Size       511 / &lt;2,00 GiB
  Free  PE / Size       0 / 0
  ...  
</code></pre>

<p><strong>511 extents</strong> allocati come confermato dai dati desumibili dei 3 volumi logici</p>

<pre><code class="language-bash">lvdisplay vg_lab
 --- Logical volume ---
  LV Path                /dev/vg_lab/lv_lab_1
  LV Name                lv_lab_1
  VG Name                vg_lab
...
  LV Size                552,00 MiB
  Current LE             138
...
 --- Logical volume ---
  LV Path                /dev/vg_lab/lv_lab_2
  LV Name                lv_lab_2
  VG Name                vg_lab
...
  LV Size                352,00 MiB
  Current LE             88
...
 --- Logical volume ---
  LV Path                /dev/vg_lab/lv_lab_3
  LV Name                lv_lab_2
  VG Name                vg_lab
...
  LV Size                1,11 GiB
  Current LE             285
...
</code></pre>

<p>Per il primo, il secondo e il terzo volume logico abbiamo rispettivamente:</p>
<ul><li><strong>138, 88, 285 extents</strong> corrispondenti a</li>
<li><strong>552 MiB, 352 MiB e 1140 MiB (1,11 GiB)</strong></li>
<li>per un totale di <strong>2044 MiB</strong>, al netto dei metadati.</li></ul>

<p>Possiamo notare subito che le dimensioni non corrispondono a quanto indicato in <code>lvcreate</code>.</p>

<pre><code class="language-bash">lvcreate -n lv_lab_1 vg_lab -L 550M
lvcreate -n lv_lab_2 vg_lab -L 350M
lvcreate -n lv_lab_3 vg_lab -l 100%FREE
</code></pre>

<p>Questo succede perché vengono <strong>sempre</strong> approssimate all’extent più vicino. Ecco perché il primo e il secondo volume sono diventati di <strong>552</strong> (138 extents) e <strong>352 MiB</strong> (88 extents).</p>

<p>Sempre ricordando la particolarità dei multipli di 4 MiB legati a LVM, anche la riduzione di 150 MiB e di 330 MiB dei due volumi saranno approssimate sempre all’extent più vicino (<strong>152 MiB=38 extents</strong> e <strong>332=83 extents</strong>). Questo dettaglio si rivelerà fondamentale quando dovremo ridimensionare il filesystem.</p>

<p>Con questa rinnovata consapevolezza cominciamo a ridimensionare.</p>

<h3 id="2-2-step-1-smontare-i-dischi">2.2. Step 1: Smontare i dischi</h3>

<pre><code class="language-bash">umount /dev/vg_lab/lv_lab_1
umount /dev/vg_lab/lv_lab_2
umount /dev/vg_lab/lv_lab_3
</code></pre>

<h3 id="2-3-step-2-riduzione-del-filesystem">2.3. Step 2: Riduzione del filesystem</h3>

<p>Se dovessi ridimensionare solo il filesystem, sarebbe sufficiente considerare dimensioni che siano potenze di 2 e non di 10.</p>

<p>Ma sapendo che sotto c’è un LVM, sappiamo che per mantenere l’allineamento fra filesystem e volumi logici, oltre che potenze di due le dimensioni devono essere anche multipli di 4MiB.</p>

<p>Ecco perché <strong>anche</strong> nel resize reale del filesystem non dovrò levare <strong>150 MiB</strong> e <strong>330 MiB</strong> ma <strong>148 MiB (37 PE)</strong> e <strong>328 (82 PE)</strong> (è buona norma approssimare per difetto all’extent più vicino per maggior prudenza) per un totale effettivo di <strong>476 MiB (119 PE)</strong></p>

<p>Il filesystem del primo volume sarà dunque di <em>552 MiB – 148 MiB = 404 MiB</em>. Il filesystem del terzo volume sarà di <em>1140 MiB – 328 MiB = 812 MiB</em>.</p>

<pre><code class="language-bash"># check dei filesystem
e2fsck -f /dev/vg_lab/lv_lab_1
e2fsck -f /dev/vg_lab/lv_lab_2
e2fsck -f /dev/vg_lab/lv_lab_3

# Riduco il primo filesystem di 148 MiB
resize2fs /dev/vg_lab/lv_lab_1 404M

# Riduco il terzo filesystem di 328 MiB
resize2fs /dev/vg_lab/lv_lab_3 812M
</code></pre>

<h3 id="2-4-step-3-ridimensionare-i-volumi-logici">2.4. Step 3: Ridimensionare i volumi logici</h3>

<p>La riduzione del volume logico può essere fatta in 4 modi come sappiamo, ad es. sul primo volume:</p>

<pre><code class="language-bash"># il numero totale di extents, 138 PE - 37 PE = 101 PE
lvreduce -l 101 /dev/vg_lab/lv_lab_1 #oppure

# il numero di exrtents da sottrarre, 38 PE
lvreduce -l -37 /dev/vg_lab/lv_lab_1 #oppure

# la dimensione totale da ottenere, 404 MiB
lvreduce -L 404M /dev/vg_lab/lv_lab_1 #oppure

# il numero di MiB da sottrarre, 148 MiB
lvreduce -L -148M /dev/vg_lab/lv_lab_1 #oppure
</code></pre>

<p>Per maggior chiarezza userò il size assoluto in modo da farlo corrispondere a <code>resize2fs</code></p>

<pre><code class="language-bash"># Riduco il primo volume logico di 148 Mib
lvreduce -L 404M /dev/vg_lab/lv_lab_1

# Riduco il terzo volume logico di 328 Mib
lvreduce -L 812M /dev/vg_lab/lv_lab_3
</code></pre>

<p>Verifichiamo quanti siano i PE residui</p>

<pre><code class="language-bash">vgdisplay vg_lab | grep &#34;Free  PE&#34;
 Free  PE / Size       119 / 476,00 MiB
</code></pre>

<p>119 extents, come previsto.</p>

<h3 id="2-5-step-4-estendere-il-volume-logico">2.5. Step 4: Estendere il volume logico</h3>

<p>Dopo aver ridotto il primo e il terzo volume, non ci rimane che estendere il secondo in base alla scaletta indicata prima:</p>
<ol><li>si estende il secondo volume logico</li>
<li>si estende il filesystem</li>
<li>si esegue il check fnale del filesystem</li></ol>

<p>L’estensione del volume, come ormai ben sappiamo, non sarà di <strong>480 MiB</strong> ma di <strong>476 MiB (37 PE + 82 PE = 119 PE)</strong> per via degli arrotondamenti effettuati nella riduzione degli altri volumi logici.</p>

<pre><code class="language-bash"># specifico gli extent che so essere residui
lvextend -l +119 /dev/vg_lab/lv_lab_2
# o, equivalentemente
# lvextend -L +476M /dev/vg_lab/lv_lab_2

# estendo il filesystem
resize2fs /dev/vg_lab/lv_lab_2 828M

# check filesystem
e2fsck -f /dev/vg_lab/lv_lab_2
</code></pre>

<h3 id="2-6-step-5-bonus">2.6. Step 5: Bonus</h3>

<p>Come premio per essere arrivato in fondo, posso rivelare come fare in un colpo solo tutte le operazioni descritte sopra.</p>

<p>È vero che c&#39;è poco da considerare, giusto tenere a mente che su LVM ogni oggetto è multiplo di 4 MiB e che bisogna ridimensionare filesystem e volumi logici in ugual modo per non generare pericolose anomalie, ma tutte le operazioni che ho descritto nei passi 2-4 possono essere fatte con un unico comando che provvederà ad eseguire nell&#39;ordine corretto e con le giuste approssimazioni:</p>
<ul><li>il check del filesystem</li>
<li>il ridimensionamento del filesystem</li>
<li>il ridimensionamento dei volumi logici</li></ul>

<p>Dunque, tutto il pippone atomico precedente può essere condensato in un unico, solido comando:</p>

<pre><code class="language-bash"># Riduce il primo volume logico e il filesystem
lvreduce -r -L -150M /dev/vg_lab/lv_lab_1

# Riduce il terzo volume logico e il filesystem
lvreduce -r -L -330M /dev/vg_lab/lv_lab_3

# Estende il secondo volume logico e il filesystem
lvextend -r -l +119 /dev/vg_lab/lv_lab_2
</code></pre>

<p>Ora spieghiamo il perché soprattutto dell&#39;extend, che è interessante.</p>

<p>Diciamo che è tutto molto guidato e le eventuali correzioni da apportare, senza spaccarsi troppo il cervello, sono suggerite con estrema chiarezza, basta leggere.</p>

<pre><code class="language-bash">lvreduce -r -L -150M /dev/vg_lab/lv_lab_1
 Rounding size to boundary between physical extents: 148.00 MiB.
  File system ext4 found on vg_lab/lv_lab_1.
  File system size (552.00 MiB) is larger than the requested size (404.00 MiB).
  File system reduce is required using resize2fs.
...
  Size of logical volume vg_lab/lv_lab_1 changed from 552.00 MiB (138 extents) to 404.00 MiB (101 extents).
  Logical volume vg_lab/lv_lab_1 successfully resized.
</code></pre>

<p>Ci dice innanzitutto che:</p>
<ul><li>c&#39;è stato un arrotondamento a <strong>148 MiB (37 extents)</strong>;</li>
<li>il filesystem è più grande del volume richiesto pertanto va subito ridimensionato;</li>
<li>infine si ridimensiona il volume logico da <strong>552 MiB (138 extents)</strong> a <strong>404 MiB (101 extents)</strong>.</li></ul>

<p>Anche il secondo <code>lvreduce</code> ha un risultato analogo</p>

<pre><code class="language-bash">lvreduce -r -L -330M /dev/vg_lab/lv_lab_3
  Rounding size to boundary between physical extents: 328.00 MiB.
  File system ext4 found on vg_lab/lv_lab_3.
  File system size (1.11 GiB) is larger than the requested size (812.00 MiB).
  File system reduce is required using resize2fs.
...
  Size of logical volume vg_lab/lv_lab_3 changed from 1.11 GiB (285 extents) to 812.00 MiB (203 extents).
  Logical volume vg_lab/lv_lab_3 successfully resized.
</code></pre>
<ul><li>anche qui abbiamo un arrotondamento a <strong>328 MiB (82 extents)</strong>;</li>
<li>il filesystem è più grande del volume richiesto pertanto va subito ridimensionato;</li>
<li>infine si ridimensiona il volume logico da <strong>1140 MiB (285 extents)</strong> a <strong>812 MiB (203 extents)</strong>.</li></ul>

<p>È facilissimo desumere che la massima dimensione dell&#39;estensione sia <strong>148 MiB + 328 MiB = 476 MiB (119 extents)</strong>, basta fare una somma.</p>

<p>Ma supponiamo di essere particolarmente distratti e proviamo ad estendere considerando le quantità iniziali: 150 MiB + 330 MiB = <strong>480 MiB</strong></p>

<pre><code class="language-bash">lvextend -r -L +480M /dev/vg_lab/lv_lab_2
  File system ext4 found on vg_lab/lv_lab_2.
  File system fsck will be run before extend.
  Insufficient free space: 120 extents needed, but only 119 available
</code></pre>

<p>Nonostante la mia distrazione, come si può vedere, non si producono danni perché l&#39;ouput è categorico: “non faccio nulla. Se vuoi, puoi aumentare al max di 476 MiB (119 extents)”.
Non ci sono danni e anzi c&#39;è pure il suggerimento risolutivo.</p>

<p>Ed ecco spiegato il mio extend di prima.</p>

<h2 id="3-scenario-2-estensione-e-riduzione-di-gruppi-di-volume">3. Scenario 2: Estensione e riduzione di gruppi di volume</h2>

<p>Esaminiamo le possibilità di aggiungere o rimuovere dispositivi ad un volume group esistente.</p>

<p>Ricreiamo il laboratorio partendo da 3 dischi, poi aggiungeremo due nuovi dischi e ne rimuoveremo altrettanti, il tutto senza intaccare l&#39;integrità dei dati.</p>

<pre><code class="language-bash"># creazione di 5 device
for i in {1..9}: do fallocate -l 1GiB disk_${i}.img; done

# creazione del gruppo di volumi con 3 device
vgcreate vg_lab \
  $(losetup -Pf --show disk_1.img) \
  $(losetup -Pf --show disk_2.img) \
  $(losetup -Pf --show disk_3.img)

# crezione di 3 volumi logici
lvcreate -n lv_lab_1 vg_lab -l 300
lvcreate -n lv_lab_2 vg_lab -l 250
lvcreate -n lv_lab_3 vg_lab -l 100%FREE

# formattazione dei 3 dispositivi
mkfs.ext4 /dev/vg_lab/lv_lab_1
mkfs.ext4 /dev/vg_lab/lv_lab_2
mkfs.ext4 /dev/vg_lab/lv_lab_3
</code></pre>

<p>Ecco come sono distribuiti i volumi logici all&#39;interno dei dischi fisici</p>

<pre><code class="language-bash">lsblk -o NAME,FSTYPE,SIZE,TYPE
  NAME               FSTYPE        SIZE      TYPE
  loop9              LVM2_member     1G      loop
  └─vg_lab-lv_lab_1                1,2G      lvm
  loop10             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_1                1,2G      lvm
  └─vg_lab-lv_lab_3                860M      lvm
  loop11             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_2               1000M      lvm
  └─vg_lab-lv_lab_3                860M      lvm
</code></pre>

<p>Il gruppo di volumi è composto da 3 volumi fisici tutti attivi</p>

<pre><code class="language-bash">vgdisplay vg_lab |grep PV
  Max PV                0
  Cur PV                3
  Act PV                3
</code></pre>

<p>Andiamo ad estendere il nostro gurppo di volumi con altri due device</p>

<pre><code class="language-bash">vgextend vg_lab $(losetup -Pf --show disk_4.img) $(losetup -Pf --show disk_5.img)
</code></pre>

<p>I nuovi dischi sono visibili in fondo, come si può vedere anche da  <code>vgdisplay</code> che mostra i 5 dischi tutti attivi.</p>

<pre><code class="language-bash">lsblk -o NAME,FSTYPE,SIZE,TYPE
  NAME               FSTYPE        SIZE      TYPE
  loop9              LVM2_member     1G      loop
  └─vg_lab-lv_lab_1                1,2G      lvm
  loop10             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_1                1,2G      lvm
  └─vg_lab-lv_lab_3                860M      lvm
  loop11             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_2               1000M      lvm
  └─vg_lab-lv_lab_3                860M      lvmchan
  loop12             LVM2_member     1G      loop
  loop13             LVM2_member     1G      loop

vgdisplay vg_lab |grep PV
  Max PV                0
  Cur PV                5
  Act PV                5
</code></pre>

<p>Potremo usare i nuovi dischi per estendere i volumi logici esistenti ma li impiegheremo invece per rimpiazzare i primi due dischi.</p>

<p><code>pvmove</code> distribuisce tutti gli extents del disco fra tutti i volumi fisici che hanno spazio a sufficienza. Se non dovesse essercene, restituirà un messaggio d&#39;errore.</p>

<pre><code class="language-bash">pvmove /dev/loop9
  /dev/loop9: Moved: 3,14%
  /dev/loop9: Moved: 100,00%
</code></pre>

<p>Alla fine dell&#39;operazione il disco s&#39;è liberato di tutti i suoi extents e può essere rimosso</p>

<pre><code class="language-bash">lsblk -o NAME,FSTYPE,SIZE,TYPE
  NAME               FSTYPE        SIZE      TYPE
  loop9              LVM2_member     1G      loop
  loop10             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_1                1,2G      lvm
  └─vg_lab-lv_lab_3                860M      lvm
  loop11             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_2               1000M      lvm
  └─vg_lab-lv_lab_3                860M      lvm
  loop12             LVM2_member     1G      loop
  └─vg_lab-lv_lab_1                1,2G      lvm
  loop13             LVM2_member     1G      loop
</code></pre>

<p>Prima si estrae il volume fisico dal gruppo di volumi e poi si rimuove il volume fisico e così può essere scollegato.</p>

<pre><code class="language-bash">vgreduce vg_lab /dev/loop9
pvremove /dev/loop9
</code></pre>

<p>Verifichiamo che il volume fisico non sia più presente.</p>

<pre><code class="language-bash">vgdisplay vg_lab |grep PV
  Max PV                0
  Cur PV                4
  Act PV                4
</code></pre>

<p>Procediamo allo stesso modo col secondo disco.</p>

<pre><code class="language-bash">pvmove /dev/loop10
  /dev/loop10: Moved: 9,80%
  /dev/loop10: Moved: 17,65%
  /dev/loop10: Moved: 100,00%

vgreduce vg_lab /dev/loop10
  Removed &#34;/dev/loop10&#34; from volume group &#34;vg_lab&#34;

pvremove /dev/loop10
  Labels on physical volume &#34;/dev/loop10&#34; successfully wiped.
</code></pre>

<p>In conclusione possiamo vedere il gruppo di volumi con solo 3 dischi, gli altri due completamente disimpegnati col gruppo di volumi ricostituitosi attorno ai 3 dischi rimanenti. E tutto spostando semplicemente gli extents dove c&#39;era disponibilità in maniera totalmente trasparente per il filesystem.</p>

<pre><code class="language-bash">vgdisplay vg_lab |grep PV
  Max PV                0
  Cur PV                3
  Act PV                3


lsblk -o NAME,FSTYPE,SIZE,TYPE
  NAME               FSTYPE        SIZE      TYPE
  loop9                              1G      loop
  loop10                             1G      loop
  loop11             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_2               1000M      lvm
  └─vg_lab-lv_lab_3                860M      lvm
  loop12             LVM2_member     1G      loop
  └─vg_lab-lv_lab_1                1,2G      lvm
  loop13             LVM2_member     1G      loop
  ├─vg_lab-lv_lab_1                1,2G      lvm
  └─vg_lab-lv_lab_3                860M      lvm
</code></pre>

<h2 id="4-conclusione">4. Conclusione</h2>

<p>Ho solo sfiorato la complessità e le capacità offerte da LVM.</p>

<p>L&#39;estensione e la riduzione di volumi logici e di gruppi di volumi sono scenari di base. Tuttavia sono sufficienti per mostrare come sia semplice, con i volumi logici, compiere operazioni che con un filesystem partizionato in maniera classica sarebbero complicatissime.</p>

<p><a href="/aytin/tag:lvm" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">lvm</span></a> <a href="/aytin/tag:volumegroup" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">volumegroup</span></a> <a href="/aytin/tag:logicalvolume" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">logicalvolume</span></a> <a href="/aytin/tag:filesystem" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">filesystem</span></a> <a href="/aytin/tag:devicemapper" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">devicemapper</span></a></p>
]]></content:encoded>
      <guid>https://noblogo.org/aytin/ridimensionare-volumi-lvm</guid>
      <pubDate>Mon, 20 Apr 2026 21:13:18 +0000</pubDate>
    </item>
  </channel>
</rss>