# LVM Disk Auto Add Script Bash per rilevare automaticamente un nuovo disco vuoto, aggiungerlo a LVM e aumentare il filesystem di root (`/`). > ⚠️ **Attenzione:** questo script modifica in modo distruttivo la configurazione storage (inizializza il disco con `pvcreate`). Usalo solo se sai esattamente cosa stai facendo. ## Cosa fa Lo script `auto-lvm-add-disk.sh` esegue questa sequenza: 1. Verifica che l’utente sia `root`. 1. Acquisisce un lock file (`flock`) per evitare esecuzioni concorrenti. 1. Salva lo spazio iniziale del filesystem `/`. 1. Forza una scansione SCSI su tutti gli host (`/sys/class/scsi_host/host*/scan`). 1. Se passato `--disk`, usa il disco specificato (con validazioni); altrimenti cerca il primo disco di tipo `disk`, senza filesystem (`FSTYPE` vuoto) e senza partizioni. 1. Inizializza il disco come Physical Volume (`pvcreate`). 1. Determina il device del mountpoint `/`, il relativo LV e il VG associato. 1. Estende il Volume Group (`vgextend`). 1. Estende il Logical Volume al 100% dello spazio libero (`lvextend -l +100%FREE`). 1. Esegue il resize del filesystem in base al tipo (`ext2/ext3/ext4` → `resize2fs`, `xfs` → `xfs_growfs /`). 1. Mostra un riepilogo finale e scrive il log in `extend-lvm.log`. ## Requisiti - Linux con LVM già configurato. - Filesystem root supportato: `ext2`, `ext3`, `ext4`, `xfs`. - Accesso root. - Utility richieste: `lsblk`, `df`, `awk`, `grep`, `findmnt`, `lvs`, `pvcreate`, `vgextend`, `lvextend`, `flock`. - Utility resize: `resize2fs` (per `ext*`) **oppure** `xfs_growfs` (per `xfs`). ## Limitazioni importanti Lo script assume implicitamente che: - il mountpoint `/` sia su un Logical Volume LVM; - il disco da aggiungere sia chiaramente identificabile come “nuovo e vuoto”; - il filesystem root sia tra quelli supportati (`ext*` o `xfs`). In ambienti con più VG/LV o dischi multipli non inizializzati, è necessario verificare attentamente il comportamento prima dell’uso in produzione. ## Audit rapido dello script (stato attuale) Esito: **script migliorato** con hardening sui punti più critici. ### Priorità alta - ✅ **Selezione target VG/LV più sicura**: ora usa il device del mountpoint `/` e ricava il VG con `lvs`. - ✅ **Rilevamento disco più robusto**: supporta `--disk` per scelta esplicita del device target. - ✅ **Compatibilità filesystem**: supporto `ext*` e `xfs` con comando dedicato. ### Priorità media - ✅ **Verifica dipendenze all’avvio**: controllo esplicito dei comandi richiesti. - ✅ **Lock anti-esecuzione concorrente**: esecuzione esclusiva con `flock`. - ✅ **Migliore robustezza shell**: aggiunto `set -o pipefail`. ### Priorità bassa - **Parametrizzazione avanzata**: opzioni CLI per specificare VG/LV e mountpoint (oltre a `--disk` già presente). - **Conferma interattiva in LIVE** (con bypass `--yes`) per ridurre errori operativi. - **Log path assoluto** (es. `/var/log/extend-lvm.log`) per evitare dipendenza dalla directory corrente. ## Roadmap minima consigliata 1. Introdurre parametri opzionali `--vg`, `--lv`. 2. Migliorare validazioni pre-flight (es. conferma interattiva opzionale in live). 3. Consentire lock path configurabile via variabile/env. 4. Aggiungere validazioni extra su dischi multipath/LUN complesse. 5. Mantenere `test` come default operativo in ambienti sensibili. ## Utilizzo ### 1) Dare permessi di esecuzione ```bash chmod +x auto-lvm-add-disk.sh ``` ### 2) Eseguire in modalità test (dry-run) ```bash sudo ./auto-lvm-add-disk.sh test ``` In questa modalità i comandi vengono solo loggati (`[TEST]`) e **non eseguiti**. ### 2-bis) Specificare il disco esplicitamente (consigliato in produzione) ```bash sudo ./auto-lvm-add-disk.sh --disk /dev/sdb ``` Oppure: ```bash sudo ./auto-lvm-add-disk.sh test --disk=sdb ``` ### 3) Eseguire in modalità live ```bash sudo ./auto-lvm-add-disk.sh ``` In modalità live i comandi vengono eseguiti (`[RUN]`). ## Log Il log viene scritto nel file: - `extend-lvm.log` Ogni riga include timestamp e stato (`[TEST]`, `[RUN]`, messaggi info/errore). ## Esempio flusso operativo consigliato 1. Collega/aggiungi il nuovo disco alla VM/server. 2. Esegui prima il test: - `sudo ./auto-lvm-add-disk.sh test` 3. Verifica nel log che il disco selezionato sia quello atteso. 4. Esegui in live: - `sudo ./auto-lvm-add-disk.sh` 5. Controlla output finale e spazio disponibile con: - `df -h /` ## Troubleshooting ### `ERRORE: eseguire come root` Esegui lo script con `sudo` o come utente root. ### `ERRORE: nessun disco nuovo trovato` Possibili cause: - il disco non è visibile al sistema (controlla `lsblk`), - non è vuoto, - contiene partizioni, - non è stato completato il rescan lato hypervisor/controller. ### `ERRORE: il device root (...) non risulta un Logical Volume LVM` Il mountpoint `/` non è su LVM oppure il mapping device non è leggibile tramite `lvs`. ### `ERRORE: filesystem root non supportato` Il filesystem su `/` non è tra `ext2/ext3/ext4/xfs`. ### `ERRORE: comando richiesto non trovato` Installa il pacchetto che contiene il comando mancante (tool LVM, util-linux o e2fsprogs/xfsprogs a seconda del filesystem). ### `ERRORE: script già in esecuzione (lock: ...)` È già presente un'altra esecuzione attiva. Attendi la fine del processo precedente o verifica lock stale. ## Sicurezza operativa - Testare sempre prima in ambiente di staging. - Effettuare backup/snapshot prima dell’esecuzione live. - Evitare esecuzione concorrente dello script. - Verificare manualmente disco target in ambienti critici. ## Exit code - `0`: esecuzione completata. - `1`: errore (es. non root, nessun disco trovato, o comando fallito). ## File del progetto - `auto-lvm-add-disk.sh` – script principale. - `README.md` – documentazione.