Image Image Image Image Image Image Image Image Image Image

Ubuntu Server | January 28, 2020

Scroll to top

Top

No Comments

Raid Software Debian/Ubuntu

Raid Software Debian/Ubuntu

Visto che è un operazione che faccio spesso volevo condividere con voi i miei appunti.

Prima di spieghiamo che cosa è un Raid fonte “Wikipedia”

In informatica il RAID, acronimo di Redundant Array of Independent Disks, insieme ridondante di dischi indipendenti, è una tecnica di raggruppamento di diversi dischi rigidi collegati ad un computer che li rende utilizzabili, dalle applicazioni e dall’utente, come se fosse un unico volume di memorizzazione. Tale aggregazione sfrutta, con modalità differenti a seconda del tipo di implementazione, i principi di ridondanza dei dati e di parallelismo nel loro accesso per garantire, rispetto ad un disco singolo, incrementi di prestazioni, aumenti nella capacità di memorizzazione disponibile, miglioramenti nella tolleranza ai guasti.

Esistono diversi tipi di RAID: 0, 1, 5, 10 e ognuno di questi viene creato con un determinato numero di dischi. Proverò brevemente a spiegare i principali: RAID 0 (detto anche striping) e il RAID 1 (o mirroring), mentre il RAID 5 ha le caratteristiche sia dello 0 che dell’1.

Come abbiamo già detto il RAID 0 è in modalità striping, cioè vengono sommate le performance e la capienza dei 2 drives (dove 2 sono il numero minimo di HD che devono essere presenti per creare il RAID).

Il RAID 1 o modalità mirroring invece, è un raid improntato alla sicurezza, infatti i drives coinvolti sono uno lo specchio dell’altro (anche in questa modalità, il numero minimo di HD è pari a 2).

Su Linux per creare un RAID software viene utilizzata l’utility mdadm, Il nome attuale deriva dal dispositivo md (multiple device) che amministra o gestisce.
Il nome originale era mdctl “Mirror Disk Controller” ma fu cambiato con l’aumentare delle sue funzionalità. È stata creata e viene mantenuta da Neil Brown di Suse.

Ecco il primo, breve, tutorial per la creazione di un array mirroring RAID.

Per prima cosa occorre preparare le partizioni che andranno in mirroring su ogni unità; non è indispensabile che i dischi coinvolti siano identici, ma è consigliato.
Per creare le partizioni è possibile utilizzare svariati tool quali fdisk, cfdisk e parted/gparted nel caso si stia creando un partizionamento MBR oppure gdisk e parted/gparted per il più evoluto partizionamento GPT.
Le partizioni vanno create della stessa dimensione (blocchi) per gli n dischi coinvolti.
Il tipo di partizione è 0xfd per l’MBR o fd00 per GPT.

Creazione delle partizioni del Disco

In questo esempio verrà creata una singola partizione del disco in /dev/sdc. La nuova partizione del disco verrà denominata /dev/sda1

Avviare fdisk per iniziare la creazione delle partizioni:

fdisk /dev/sda
 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
 Building a new DOS disklabel with disk identifier 0xa34cb70c.
 Changes will remain in memory only, until you decide to write them.
 After that, of course, the previous content won't be recoverable.
 
 WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
                 switch off the mode (command 'c') and change display units to
                 sectors (command 'u').

 

Premere ‘n’ al prompt per creare una nuova partizione:

Command (m for help): n

 

Successivamente, premere ‘p’ per creare una partizione primaria:

Command action
         e   extended
         p   primary partition (1-4)

 

Premere ‘1’ per selezionare la partizione numero 1:

Partition number (1-4): 1

 

Selezionare il punto di inizio della nuova partizione oppure premere <enter> per accettare le impostazioni predefinite, che prevedono il posizionamento della partizione all’inizio dello spazio libero nell’unità:

First cylinder (1-1305, default 1):
 Using default value 1

 

Selezionare le dimensioni della partizione, ad esempio digitare ‘+10G’ per creare una partizione da 10 gigabyte. In alternativa, premere <enter> per creare un’unica partizione che occupa l’intera unità:

Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305): 
 Using default value 1305

 

Successivamente, modificare l’ID e il tipo della partizione dal valore predefinito ’83’ (Linux) a ‘fd’ (rilevamento automatico RAID Linux):

Command (m for help): t
 Selected partition 1
 Hex code (type L to list codes): fd

 

Infine, scrivere la tabella delle partizioni sull’unità e chiudere fdisk:

Command (m for help): w
 The partition table has been altered!

 

Se dopo il partizionamento non vediamo le nuove partizioni e non possiamo eseguire un reboot è possibile utilizzare la seguente utility:

#partprobe
 
 
Syntax
 
partprobe [-d] [-s] [devices...]
 
-d Donat update the kernel.
-s Show a summary of devices and their partitions.
-h Show summary of options.
-v Show version of program.

A questo punto è possibile cominciare la vera è propria creazione del RAID mediante mdadm.

Ipotizziamo di avere 2 dischi:
Disco 1: sda1
Disco 2: sdb1

Prima di tutto dobbiamo installare mdadm:

# apt-get install mdadm

Vediamo quali dischi usare per il raid, il seguente comando può essere utile se abbiamo più dischi o aggiungiamo un raid in un secondo momento:

# lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT
 
Output
NAME     SIZE FSTYPE            TYPE MOUNTPOINT
sda      100G                   disk 
├─sda1   100G                   part
sdb      100G                   disk
├─sdb1   100G                   part

Assicuriamoci che il superblocco che contiene le informazioni del RAID software sia vuoto (capita spesso con dischi già utilizzati in catene md che tale blocco contenga ancora informazioni vecchie).

mdadm --zero-superblock /dev/sda
mdadm --zero-superblock /dev/sdb
Oppure
dd if=/dev/zero of=/dev/sda bs=512 count=200000
dd if=/dev/zero of=/dev/sdb bs=512 count=200000

Ora creiamo l’array:

mdadm --create --verbose --assume-clean --level=1 --raid-devices=2 /dev/md0 /dev/sda1 /dev/sdb1
 
# Esempio per Dischi SSD
mdadm --create /dev/md0 --level=1 --raid-devices=2 --bitmap=internal --write-behind=1024 /dev/sda2 --write-mostly /dev/sdb2

In dettaglio:

  • –create è autoesplicativo
  • –verbose aumenta il dettaglio in output dal comando
  • –assume-clean è importante, perché evita che l’array venga ricostruito e quindi fatto il resync. Su partizioni di grandi dimensioni può metterci molto tempo. E’ da utilizzare solo per la creazione di nuovi array vuoti
  • –level=1 specifica che si tratta di un mirroring e quindi un RAID di tipo 1
  • –raid-devices=2 numero dei devices da aggiungere all’array
  • /dev/md0 è il nome del device che punterà al nuovo array
  • /dev/sda1 e /dev/sdb1 sono le partizioni che andranno a formare l’array

Al termine del comando l’array sarà attivo e pronto all’utilizzo:

# cat /proc/mdstat
Personalities : [raid1] 
 
md0 : active raid1 sda1[1] sdb1[0]
      545533210 blocks super 1.2 [2/2] [UU]
 
unused devices: <none>

Ora dobbiamo aggiungere l’array al file /etc/mdadm/mdadm.conf (questo file viene usato dal sistema per riconoscere il RAID al boot)

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Aggiungiamo le opzioni per farci inviare la mail in caso di fault (ovviamente va configurato l’smtp su i vari demoni postfix,exim o sendmail Postfix Gmail Relay)

echo "DEVICE partitions" > /etc/mdadm/mdadm.conf      
echo "HOMEHOST ServerCasa" >> /etc/mdadm/mdadm.conf 
echo "MAILADDR francesco.gabriele@gmail.com" >> /etc/mdadm/mdadm.conf     
mdadm --detail --scan >> /etc/mdadm/mdadm.conf        
-- Test invio Email --                                      
mdadm --monitor --scan --test

Mentre per vedere lo stato dell’array:

mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Mar 11 21:44:23 2016
Raid Level : raid1
Array Size : 961618752 (917.07 GiB 984.70 GB)
Used Dev Size : 961618752 (917.07 GiB 984.70 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

 

== Ancora un paio di note ==

1 – per prima cosa conviene attivare il supporto bitmap per poter ricostruire l’array più velocemente:

mdadm --grow --bitmap=internal /dev/md0
Personalities : [raid1] 
 
md0 : active raid1 sdc1[1] sdb1[0]
      545533210 blocks super 1.2 [2/2] [UU]
      bitmap: 1/3 pages [4KB], 65536KB chunk
 
unused devices: <none>

Aggiungiamo il comando al file di configurazione generato precedentemente:

mdadm -Es >> /dev/mdadm.conf

è consigliato, ma tuttavia non necessario nel caso che il file /etc/mdadm.conf contenga già la riga:

AUTO +imsm +1.x -all

2 – Velocizziamo  l’rsync del raid utilizzando questo comando:

echo 50000 >/proc/sys/dev/raid/speed_limit_min

 

== Cambiare un disco rotto ==

Come faccio ad identificare quale disco è rotto?
Di solito vengono scritti un sacco di messaggi di errore nei file di log come ad esempio i file /var/log/messages,/var/log/syslog
oppure facendo un semplice dmesg:

# dmesg | grep "I/O error"
sd 0:0:0:0: [sda]  Add. Sense: Recorded entity not found
sd 0:0:0:0: [sda] CDB: Write(10): 2a 00 31 76 36 80 00 00 80 00
end_request: I/O error, dev sda, sector 829830784

Identifichiamo il disco tramite il seriale

# hdparm -i /dev/sda | grep SerialNo 
Model=WDC WD20EFRX-68EUZN0, FwRev=82.00A82, SerialNo=WD-WCC4M5SZC9VA

Controlliamo lo stato del raid:

# more /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb3[3]
      1951527744 blocks super 1.2 [2/1] [_U]
 
md0 : active raid1 sdb2[3]
      878016 blocks super 1.2 [2/1] [_U]
 
unused devices: <none>

Rimuovere le partizioni del disco rotto dagli array:

mdadm --manage --set-faulty /dev/md1 /dev/sda3
mdadm --manage --set-faulty /dev/md0 /dev/sda2
mdadm --manage /dev/md1 -r /dev/sda3
mdadm --manage /dev/md0 -r /dev/sda2

Ora possiamo rimuove il disco incriminato, se abbiamo un controller sata che supporta l’hot swap possiamo eseguire i seguenti comandi

Per prima cosa è ovviamente necessario smontare l’unità tramite il comando di base umount; supponendo che il disco da disconnettere sia sda il comando è:

sync && umount /dev/sda

A questo punto è necessario mandare offline l’unità da rimuovere; è possibile farlo attraverso l’interfaccia kernel in /sys con il comando

echo 1 > /sys/block/sda/device/delete

Una volta eseguito il comando l’unità verà rimossa dal subsystem scsi (sata) e spenta; il disco effettuerà lo spin-down.

Per l’inserimento di una nuova unità è sufficiente connetterla al sistema. Linux provvederà in modo autonomo al riconoscimento del disco e alla connessione dello stesso al subsystem scsi. Sarà possibile ora montare l’unità od effettuare altre operazioni sul disco (partizionamento, etc.); se non si è sicuri del device associato alla nuova unità collegata è possibile controllare gli ultimi messaggi del kernel attraverso il comando dmesg.

(Per poter effettuare tali operazioni di hot-swap il controller deve essere settato in modalità “AHCI”. L’opzione è modificabile, dove supportata, attraverso il BIOS)

 

Aggiungiamo il nuovo disco e controlliamo il seriale per essere sicuri di formattare il disco giusto:

# hdparm -i /dev/sda | grep SerialNo
Model=WDC WD30EFRX-68EUZN0, FwRev=80.00A80, SerialNo=WD-WMC4N1096166

Copiamo la tabella delle partizioni dal disco esistente a quello nuovo:

sfdisk -d /dev/discoesistente | sfdisk /dev/disconuovo
sfdisk -d /dev/sdb | sfdisk /dev/sda
 
# Se usiamo la tabella GPT invece di quella MSDOS
sgdisk -R /dev/disconuovo /dev/discoesistente
sgdisk -G /dev/disconuovo

Un volta creata la tabella sul nuovo disco aggiungiamo le singole partizioni a gli array:

mdadm /dev/md0 --add /dev/sda2
mdadm /dev/md1 --add /dev/sda3

Controlliamo lo stato della sincronizzazione degli array:

#cat /proc/mdstat
 
Personalities : [raid1]
md1 : active raid1 sda3[2] sdb3[1]
     1822442815 blocks super 1.2 [2/1] [_U]
     [===========&gt;.........]  recovery = 57.2% (1043526976/1822442815) finish=211.8min speed=61278K/sec
md0 : active raid1 sda2[2] sdb2[1]
     1073740664 blocks super 1.2 [2/1] [_U]
       resync=DELAYED

Installiamo il Boot Loader su tutti e due i dischi:

#grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
 
#grub-install /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.

 

Se vi sono stato di aiuto offritemi una birra 😀

 

 

 

Submit a Comment

*

adidas yeezy 650 boost adidas yeezy boost 650 adidas yeezy 650 boost colorways adidas yeezy 650 350 2 0 boost yeezy boost 650 adidas yeezy boost 650 supreme x nike air uptempo release info adidas yeezy boost 650 v1 sample detailed look adidas yeezy boost 650 v1 sample adidas yeezy boost 650 v1 sample adidas yeezy boost 650 v1 adidas yeezy 650 boost adidas yeezy boost 650 adidas yeezy 650 boost colorways adidas yeezy 650 350 2 0 boost yeezy boost 650 adidas yeezy boost 650 supreme x nike air uptempo release info adidas yeezy boost 650 v1 sample detailed look adidas yeezy boost 650 v1 sample