#language it <
> <> <> <> = Introduzione = Per ''Linux Software RAID'' si intende una particolare tipologia di RAID il cui funzionamento dipende da un driver software e non richiede hardware dedicato. Per contro, i sistemi ''fake RAID'' possono essere realizzati solo in presenza di una scheda madre compatibile, e gli ''hardware RAID'' richiedono specifici controller dedicati.<
> <
> Il tool software che consente la creazione e la gestione degli array Linux Software RAID è '''[[apt://mdadm|mdadm]]''', la cui installazione comprende il driver '''md'''. Questo pacchetto non è preinstallato in '''Ubuntu''' desktop ma è presente nei [[Repository|repository]] ufficiali.<
> <
> Gli elementi che compongono un array possono essere interi dischi, ad esempio '''sda''' ed '''sdb''', oppure singole partizioni, ad esempio '''sda1''' ed '''sdb1'''. Ciò significa che sugli stessi dischi possono coesistere diversi array con diversi [[#Livelli_RAID_supportati|livelli RAID]]. Ad esempio utilizzando i dischi '''sda''' ed '''sdb''' è possibile creare un '''RAID 1''' con le partizioni '''sda1''' ed '''sdb1''' e un '''RAID 0''' con le partizioni '''sda2''' ed '''sdb2'''.<
> <
> I dischi coinvolti in un array dovrebbero avere le medesime caratteristiche hardware. L'ideale è che siano della stessa marca e modello. Inoltre tutti gli elementi dell'array, anche se si tratta di partizioni, devono avere la medesima dimensione. Fanno eccezione gli array di '''livello Linear''' (o JBOD) che possono includere elementi con caratteristiche differenti. = Nomenclatura degli array = Gli array software vengono visti dal sistema come dispositivi virtuali detti ''multi-disk'' (md) e assumono una nomenclatura del tipo '''md''N''''', dove '''''N''''' è un numero maggiore o uguale zero, ad esempio '''md0''', '''md1''', ecc...<
> Le partizioni all'interno di un array vengono indicate come '''p''N''''', dove '''''N''''' è un numero maggiore o uguale a 1, ad esempio '''md0p1''', '''md0p2''', ecc... Tuttavia, in casi particolari, l'array può essere privo di tabella delle partizioni, pertanto il solo nome dell'array ('''md''N''''' senza '''p''N''''') sì riferirsi all'unica partizione presente nell'array. Per maggiori dettagli consultare il paragrafo [[#Metadati|Metadati]]. = Livelli RAID supportati = * '''Linear''' (o JBOD) * '''RAID 0''' (eccetto metadati versione '''0.90''') * '''RAID 1''' * '''RAID 4''' * '''RAID 5''' * '''RAID 6''' * '''RAID 10''' Oltre a quasti livelli RAID sono supportate ulteriori modalità, come '''Container''', '''Faulty''' e '''Multipath'''. Per maggiori informazioni consultare il [[https://manpages.ubuntu.com/manpages/focal/en/man4/md.4.html|manuale di md]]. = Metadati = I metadati sono una piccola quantità di dati memorizzata nel superblocco. Il loro scopo è conservare informazioni sulla struttura e sullo stato dell'array. Le versioni di metadati supportate sono le seguenti: * Versione originale ('''0.90'''): supporta array composti da un massimo di 28 elementi con una dimensione massima di 2 TB per elemento. Non supporta il '''livello 0'''. Il superblocco si trova alla fine del disco. Il modo in cui vengono memorizzati i metadati dipende dal processore, pertanto gli array non possono essere facilmente spostati fra computer con processori diversi. * Nuova versione ('''1.x'''): supporta array composti da centinaia di elementi. Il modo in cui vengono memorizzati i metadati è indipendente dal processore. Il superblocco può trovarsi in una delle seguenti posizioni:<
> '''1.0''': Alla fine del disco.<
> '''1.1''': All'inizio del disco.<
> '''1.2''': A 4 KiB dall'inizio del disco. Per impostazione predefinita vengono usati i metadati versione '''1.2'''. Per specificare una versione diversa utilizzare il parametro `--metadata=` (oppure `-e`) al momento della creazione . Per utilizzare la versione '''1.0''' specificare `1.0` e non `1`. == Peculiarità dei metadati versione 0.90 e 1.0 == I metadati versione '''0.90''' e '''1.0''' sono accomunati dal fatto che il superblocco si trova alla fine del disco. Da questa caratteristica derivano alcune peculiarità.<
> <
> Se il primo elemento dell'array è una partizione, l'array sarà esso stesso una partizione, senza una tabella delle partizioni. In questo caso il nome dell'array (ad esempio '''md0''') si riferisce a quell'unica partizione. Per tutti i livelli RAID eccetto il '''livello 1''' è necessario formattare l'array con un file system oppure assegnargli una tabella e suddividerlo in partizioni. Gli array di '''livello 1''' invece mantengono inalterato il file system e tutti i dati della prima partizione che li costituisce.<
> Ad esempio, se '''sda1''' ed '''sdb1''' sono il primo e secondo elemento di un array di '''livello 1''', questo sarà privo di tabella delle partizioni e avrà lo stesso file system e i dati di '''sda1'''. Trattandosi di un array di '''livello 1''', file system e dati verranno replicati perfettamente su '''sdb1'''. Di conseguenza l'eventuale file system e i dati di '''sdb1''' verranno distrutti.<
> <
> Sempre in riferimento agli array di '''livello 1''', quando l'array non è attivo le partizioni che lo compongono sono accessibili in lettura e scrittura singolarmente, in modo indipendente. Se viene modificato il contenuto della partizione che funge da primo elemento, quando l'array viene riassemblato queste modifiche vengono replicate sugli altri elementi dell'array. Al contrario se viene modificato il contenuto di un altro elemento, quando l'array viene riassemblato queste modifiche non vengono mantenute e viene ripristinata una perfetta replica del primo elemento dell'array.<
> Ad esempio, se '''sda1''' ed '''sdb1''' sono il primo e secondo elemento di un array di '''livello 1''', quando l'array non è attivo è possibile accedere in lettura e scrittura alle due partizioni in modo indipendente. Essendo '''sda1''' il primo elemento dell'array, qualsiasi modifica apportata al suo contenuto verrà poi replicata su '''sdb1''' quando l'array verrà riassemblato. Al contrario le modifiche apportate a '''sdb1''' andranno perse, rimpiazzate da una perfetta replica di '''sda1'''.<
> <
> Prendendo in considerazione una situazione reale, in un sistema '''UEFI''' il firmware della scheda madre all'avvio deve poter accedere alla partizione EFI. Pertanto un'eventuale ''array EFI'' dovrà essere necessariamente di '''livello 1''' e utilizzare i metadati versione '''0.90''' o '''1.0'''. Inoltre se nel sistema è già presente una partizione EFI e questa contiene i file di avvio di altri sistemi operativi (multiboot), questa partizione dovrà essere indicata come primo elemento dell'array. In caso contrario i file di avvio degli altri sistemi andrebbero distrutti. = Creare un array = Il comando per creare un array è il seguente:{{{ sudo mdadm --create /dev/ --level= --raid-devices= /dev/ /dev/}}} Seguono alcuni esempi pratici: * Per creare un array denominato '''md0''' di '''livello 1''' composta da 3 elementi, ovvero le partizioni '''sda1''', '''sdb1''' ed '''sdc1''', digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --create /dev/md0 --level=1 --raid-devices=3 /dev/sd[a-c]1}}} Notare che la formula `/dev/sd[a-c]1` equivale a `/dev/sda1 /dev/sdb1 /dev/sdc1`. * Per creare un array denominato '''md1''' di '''livello 0''' composta da 2 elementi, ovvero le partizioni '''sda1''' ed '''sdb3''', digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sda1 /dev/sdb3}}} Notare che le partizioni che compongono l'array possono avere numeri diversi, in questo esempio '''1''' e '''3'''. * Per creare un array denominato '''md2''' di '''livello 5''' composta da 3 elementi, ovvero i dischi '''sda''', '''sdb''' ed '''sdc''', digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc}}} Notare che gli elementi di un array possono essere anche interi dischi, in questo esempio '''sda''', '''sdb''' ed '''sdc'''. * Per creare un ''array EFI'' denominato '''md3''' in un sistema in cui è già presente la partizione EFI '''sda1''' che si intende mettere in RAID con la partizione '''sdb1''', digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --create /dev/md3 --level=1 --metadata=1.0 --raid-devices=2 /dev/sda1 /dev/sdb1}}} Notare che, come specificato nel paragrafo [[#Peculiarit.2BAOA_dei_metadati_versione_0.90_e_1.0|Peculiarità dei metadati versione 0.90 e 1.0]], l'array EFI deve necessariamente essere di '''livello 1''' ed è necessario specificare il parametro `--metadata=` (oppure `-e`) con valore '''0.90''' oppure '''1.0'''. Inoltre il primo elemento dell'array deve essere l'eventuale partizione EFI preesistente, in questo esempio '''sda1'''. = Eliminare un array = {{{#!wiki note Nei passaggi seguenti sostituire `/dev/mdN` con l'array da eliminare, ad esempio `/dev/md0`, e `/dev/sdX` con i dispositivi o le partizioni che lo compongono, ad esempio `/dev/sda` o `/dev/sda1`.}}} 0. Se montato, smontare l'array digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo umount /dev/mdN}}} 0. Disattivare l'array digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --stop /dev/mdN}}} 0. Rimuovere i [[#Metadati|metadati]] presenti sui dispositivi o partizioni che compongono l'array digitando per ciascuno di essi il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --zero-superblock /dev/sdX}}} 0. Aprire con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/Sudo|privilegi di amministrazione]] il file `/etc/mdadm/mdadm.conf`. 0. Se presente, rimuovere o commentare la riga che fa riferimento all'array che si intende eliminare. La riga avrà un formato di questo tipo:{{{ ARRAY /dev/mdN metadata=N.N name=mdadmwrite:N UUID=XXXXXXXX:XXXXXXXX:XXXXXXXX:XXXXXXXX}}} 0. Salvare il file e chiudere l'editor di testo. 0. Aggiornare `initramfs` digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo update-initramfs -u}}} 0. Se in [[AmministrazioneSistema/Fstab|fstab]] sono presenti riferimenti all'array o a sue partizioni, rimuoverli. = Accedere ad un array da una sessione live = 0. Installare il pacchetto [[apt://mdadm|mdadm]]. 0. Assemblare l'array digitando uno dei seguenti comandi nel [[AmministrazioneSistema/Terminale|terminale]]: * Per assemblare tutti gli array presenti nel sistema:{{{ sudo mdadm --assemble --scan}}} * Per assemblare un singolo array:{{{ sudo mdadm --assemble /dev/}}} Sostituire `` con il nome dell'array da assemblare, ad esempio `md0`. = Ottenere informazioni su un array = * Per ottenere informazioni su tutti gli array presenti nel sistema digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --detail --scan}}} * Per ottenere informazioni su uno specifico array digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --detail /dev/}}} Sostituire `` con il nome dell'array di cui si desidera visualizzare i dettagli, ad esempio `md0`. * Per ottenere informazioni su un singolo elemento di un array digitare il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --examine /dev/}}} Sostituire `` con il nome dell'elemento di cui si desidera visualizzare i dettagli, ad esempio `sda` o `sda1`. = Montare un elemento di un array in modo indipendente dall'array = {{{#!wiki note Questa operazione è possibile solo per gli array di '''livello 1''' con metadati versione '''0.90''' o '''1.0'''.}}} {{{#!wiki note Nei passaggi seguenti sostituire `/dev/mdN` con il nome dell'array, ad esempio `/dev/md0`, e `/dev/sdX` con la partizione che si desidera montare in modo indipendente, ad esempio `/dev/sda1`.}}} {{{#!wiki important Le modifiche apportate alla partizione che funge da primo elemento dell'array vengono automaticamente replicate sugli altri elementi quando l'array viene riassemblato. Di conseguenza le modifiche apportate ad altri elementi dell'array non vengono mantenute.}}} 0. Se montato, smontare l'array digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo umount /dev/mdN}}} 0. Disattivare l'array digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mdadm --stop /dev/mdN}}} 0. Montare la partizione digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo mount -t /dev/mdN }}} Sostituire `` con il file system in cui è formattata la partizione, ad esempio `ext4`, e `` con il percorso in cui montare la partizione, ad esempio `/mnt`. = Risoluzione dei problemi = == Gli array non sono visibili da altri altri sistemi operativi == Perché un sistema operativo possa gestire gli array Linux software RAID è necessario che sia installato il tool '''mdadm''' e il driver '''md'''. Per '''Ubuntu''' e derivate valgono le istruzioni esposte nel paragrafo [[#Accedere_ad_un_array_da_una_sessione_live|Accedere ad un array da una sessione live]]. Sistemi operativi non Linux potrebbero non essere compatibili, se non mediante software di recupero dati o altri tool di terze parti. == Nel menù di avvio di Grub non compare Windows (UEFI)== Per rilevare altri sistemi operativi il comando `update-grub` si serve di '''os-prober''', il quale fa una ricerca nelle altre partizioni del sistema. Il boot loader di Windows risiede nella partizione EFI, ma se questa fa parte di un array Linux software RAID (come spiegato in questa guida) non è possibile accedervi mentre l'array è attivo. Inoltre '''os-prober''' non cerca il boot loader di Windows all'interno di array Linux software RAID ma solo in partizioni EFI standard. Per risolvere questo problema è quindi necessario smontare e disattivare l'array EFI prima che `update-grub` invochi '''os-prober'''. In seguito è necessario riattivare l'array EFI e rimontarlo. L'operazione può essere automatizzata apportando una modifica al file `/etc/grub.d/30_os-prober`, come spiegato di seguito: 0. Creare una copia di backup del file `/etc/grub.d/30_os-prober` digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo cp /etc/grub.d/30_os-prober /etc/grub.d/.30_os-prober.bak}}} {{{#!wiki note In caso di problemi sarà possibile ripristinare la copia di backup digitando il comando `sudo mv /etc/grub.d/.30_os-prober.bak /etc/grub.d/30_os-prober`}}} 0. Aprire con un [[Ufficio/EditorDiTesto|editor di testo]] e con i [[AmministrazioneSistema/Sudo|privilegi di amministrazione]] il file `/etc/grub.d/30_os-prober`. 0. Sostituire la seguente riga:{{{ OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`"}}} con{{{ md=false esp="$(findmnt -nosource /boot/efi)" if [[ "$esp" == '/dev/md'* ]]; then md=true umount '/boot/efi' mdadm -S $esp fi OSPROBED="`os-prober | tr ' ' '^' | paste -s -d ' '`" if $md; then mdadm -A $esp sleep 1 mount '/boot/efi' fi}}} 0. Salvare il file e chiudere l'editor. 0. Aggiornare la configurazione di '''Grub''' digitando il seguente comando nel [[AmministrazioneSistema/Terminale|terminale]]:{{{ sudo update-grub}}} Verrà rilevata una voce ''Windows Boot Manager'' per ciascuna partizione facente parte dell'array EFI. == Uno o più dischi hanno smesso di funzionare == La tolleranza ai guasti degli array RAID varia in base al livello. La tabella seguente illustra i casi in cui l'array è completamente ripristinabile, parzialmente ripristinabile o non ripristinabile: ||''' Livello RAID '''||<:25%>''' 1 disco guasto '''||<:25%>''' 2 dischi guasti '''||<:25%>''' Tutti guasti eccetto 1 '''|| ||<#f7f7f7:> '''Linear'''||Parziale||Parziale||Parziale|| ||<#f7f7f7:> '''0'''||No||No||No|| ||<#f7f7f7:> '''1'''||Completo||Completo||Completo|| ||<#f7f7f7:> '''4'''||Completo||No||No|| ||<#f7f7f7:> '''5'''||Completo||No||No|| ||<#f7f7f7:> '''6'''||Completo||Completo||No|| Nei casi in cui è possibile un '''ripristino completo''', l'array continua a funzionare nonostante il guasto e tutti i dati sono integri ed accessibili. Una volta sostituiti i dischi guasti e, se opportuno, create le partizioni necessarie, sarà possibile [[#Aggiungere_elementi_a_un_array|aggiungere i nuovi elementi all'array]], in modo da ripristinarne le struttura, la ridondanza e le prestazioni. Per gli array di '''livello Linear''' è possibile un '''ripristino parziale''', nel senso che vengono compromessi solo i dati presenti nei dischi danneggiati. Inoltre la dimensione dell'array si riduce alla somma degli elementi funzionanti restanti. Una volta sostituiti i dischi guasti e, se opportuno, create le partizioni necessarie, sarà possibile [[#Aggiungere_elementi_a_un_array|aggiungere i nuovi elementi all'array]], in modo da ripristinarne le dimensioni originali. Nei casi in cui '''il ripristino non è possibile''', l'array smette di funzionare e tutti i dati sono compromessi. Una volta sostituiti i dischi guasti e, se opportuno, create le partizioni necessarie, sarà possibile [[#Creare_un_array|ricreare l'array da zero]]. {{{#!wiki note Se i dischi non funzionanti sono ancora visibili dal sistema, è possibile tentare di recuperarne il contenuto. Per maggiori informazioni consultare la [[AmministrazioneSistema/RecuperoDati|guida dedicata]]}}}