mdadm
, che permette di creare e manipolare array RAID, oltre che script e strumenti per integrarlo al resto del sistema, compreso il sistema di monitoraggio.
sda
, 4 GB, è interamente disponibile;
sde
, 4 GB, è anch'esso interamente disponibile;
sdg
, solo la partizione sdg2
(circa 4 GB) è disponibile;
sdh
, di nuovo 4 GB, interamente disponibile.
#
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda /dev/sde
mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. #
mdadm --query /dev/md0
/dev/md0: 8.00GiB raid0 2 devices, 0 spares. Use mdadm --detail for more detail. #
mdadm --detail /dev/md0
/dev/md0: Version : 1.2 Creation Time : Thu Sep 30 15:21:15 2010 Raid Level : raid0 Array Size : 8388480 (8.00 GiB 8.59 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Thu Sep 30 15:21:15 2010 State : active Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Chunk Size : 512K Name : squeeze:0 (local to host squeeze) UUID : 0012a273:cbdb8b83:0ee15f7f:aec5e3c3 Events : 0 Number Major Minor RaidDevice State 0 8 0 0 active sync /dev/sda 1 8 64 1 active sync /dev/sde #
mkfs.ext4 /dev/md0
mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 524288 inodes, 2097152 blocks 104857 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2147483648 55 block groups 32768 blocks per group, 32768 fragments per group 8160 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 26 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. #
mkdir /srv/raid-0
#
mount /dev/md0 /srv/raid-0
#
df -h /srv/raid-0
Filesystem Size Used Avail Use% Mounted on /dev/md0 8.0G 249M 7.4G 4% /srv/raid-0
mdadm --create
richiede diversi parametri: il nome del volume da creare (/dev/md*
, dove MD sta per Multiple Device), il livello di RAID, il numero di dischi (obbligatorio nonostante abbia significato perlopiù solo con RAID-1 e superiori) e i dischi fisici da usare. Una volta che il device è creato, lo si può usare come una partizione normale: ci si crea sopra un file system, lo si monta e così via. Notare che la creazione di un volume RAID-0 su md0
è solo una coincidenza: non è necessario che la numerazione dell'array sia legata alla quantità di ridondanza scelta.
#
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdg2 /dev/sdh
mdadm: largest drive (/dev/sdg2) exceed size (4194240K) by more than 1% Continue creating array?
y
mdadm: array /dev/md1 started. #
mdadm --query /dev/md1
/dev/md1: 4.00GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail. #
mdadm --detail /dev/md1
/dev/md1: Version : 1.2 Creation Time : Thu Sep 30 15:39:13 2010 Raid Level : raid1 Array Size : 4194240 (4.00 GiB 4.29 GB) Used Dev Size : 4194240 (4.00 GiB 4.29 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Thu Sep 30 15:39:26 2010 State : active, resyncing Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Rebuild Status : 10% complete Name : squeeze:1 (local to host squeeze) UUID : 20a8419b:41612750:b9171cfe:00d9a432 Events : 27 Number Major Minor RaidDevice State 0 8 98 0 active sync /dev/sdg2 1 8 112 1 active sync /dev/sdh #
mdadm --detail /dev/md1
/dev/md1: [...] State : active [...]
mdadm
si accorge che gli elementi fisici hanno dimensioni diverse; poiché ciò implica che verrà perso dello spazio sull'elemento più grande, è richiesta una conferma.
/dev/md1
è usabile e vi si può creare sopra un file system, oltre a copiarvi sopra dei dati.
mdadm
, in particolare la sua opzione --fail
, permette di simulare uno guasto:
#
mdadm /dev/md1 --fail /dev/sdh
mdadm: set /dev/sdh faulty in /dev/md1 #
mdadm --detail /dev/md1
/dev/md1: [...] Update Time : Thu Sep 30 15:45:50 2010 State : active, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 1 Spare Devices : 0 Name : squeeze:1 (local to host squeeze) UUID : 20a8419b:41612750:b9171cfe:00d9a432 Events : 35 Number Major Minor RaidDevice State 0 8 98 0 active sync /dev/sdg2 1 0 0 1 removed 2 8 112 - faulty spare /dev/sdh
sdg
dovesse guastarsi a sua volta, i dati sarebbero persi. Poiché è meglio evitare questo rischio, si va a sostituire il disco guasto con uno nuovo, sdi
:
#
mdadm /dev/md1 --add /dev/sdi
mdadm: added /dev/sdi #
mdadm --detail /dev/md1
/dev/md1: [...] Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Thu Sep 30 15:52:29 2010 State : active, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 1 Spare Devices : 1 Rebuild Status : 45% complete Name : squeeze:1 (local to host squeeze) UUID : 20a8419b:41612750:b9171cfe:00d9a432 Events : 53 Number Major Minor RaidDevice State 0 8 98 0 active sync /dev/sdg2 3 8 128 1 spare rebuilding /dev/sdi 2 8 112 - faulty spare /dev/sdh #
[...]
[...] #
mdadm --detail /dev/md1
/dev/md1: [...] Update Time : Thu Sep 30 15:52:35 2010 State : active Active Devices : 2 Working Devices : 2 Failed Devices : 1 Spare Devices : 0 Name : squeeze:1 (local to host squeeze) UUID : 20a8419b:41612750:b9171cfe:00d9a432 Events : 71 Number Major Minor RaidDevice State 0 8 98 0 active sync /dev/sdg2 1 8 128 1 active sync /dev/sdi 2 8 112 - faulty spare /dev/sdh
sdh
sta per essere rimosso dall'array, così da arrivare a un classico mirror RAID su due dischi:
#
mdadm /dev/md1 --remove /dev/sdh
mdadm: hot removed /dev/sdh from /dev/md1 #
mdadm --detail /dev/md1
/dev/md1: [...] Number Major Minor RaidDevice State 0 8 98 0 active sync /dev/sdg2 1 8 128 1 active sync /dev/sdi
sdh
fosse stato reale (invece di essere solo una simulazione) e il sistema si fosse riavviato senza rimuovere questo disco sdh
, questo disco si sarebbe attivato di nuovo, essendo stato riconosciuto durante il riavvio. A quel punto il kernel avrebbe tre elementi fisici, ciascuno dei quali direbbe di contenere metà dello stesso volume RAID. Un'altra fonte di confusione può sorgere quando volumi RAID di due server vengono consolidati su un solo server. Se questi array stavano funzionando normalmente prima che i dischi fossero spostati, il kernel potrebbe rilevare e riassemblare le coppie correttamente; ma se i dischi spostati sono stati aggregati in un md1
sul vecchio server e il nuovo server ha già un md1
, uno dei mirror verrebbe rinominato.
/etc/mdadm/mdadm.conf
, un esempio del quale è mostrato qui:
Esempio 12.1. File di configurazione di mdadm
# mdadm.conf # # Please refer to mdadm.conf(5) for information about this file. # # by default, scan all partitions (/proc/partitions) for MD superblocks. # alternatively, specify devices to scan, using wildcards if desired. DEVICE /dev/sd* # auto-create devices with Debian standard permissions CREATE owner=root group=disk mode=0660 auto=yes # automatically tag new arrays as belonging to the local system HOMEHOST <system> # instruct the monitoring daemon where to send mail alerts MAILADDR root ARRAY /dev/md0 metadata=1.2 name=squeeze:0 UUID=6194b63f:69a40eb5:a79b7ad3:c91f20ee ARRAY /dev/md1 metadata=1.2 name=squeeze:1 UUID=20a8419b:41612750:b9171cfe:00d9a432
DEVICE
, che elenca i device in cui il sistema cercherà automaticamente le componenti dei volumi RAID all'avvio. Nell'esempio, in questione, il valore predefinito, partitions
, è stato sostituito con una lista esplicita dei file di device, poiché si è scelto di usare dei dischi interi e non solo delle partizioni, per alcuni volumi.
/dev/md*
).
#
mdadm --misc --detail --brief /dev/md?
ARRAY /dev/md0 metadata=1.2 name=squeeze:0 UUID=6194b63f:69a40eb5:a79b7ad3:c91f20ee ARRAY /dev/md1 metadata=1.2 name=squeeze:1 UUID=20a8419b:41612750:b9171cfe:00d9a432
/dev
, quindi non c'è rischio di usarli direttamente.
/dev
e può essere usato come ogni altra partizione fisica (più di frequente per ospitare un filesystem o spazio di swap).
sdb
, una partizione sdb2
, 4 GB;
sdc
, una partizione sdc3
, 3 GB;
sdd
, 4 GB, completamente disponibile;
sdf
, una partizione sdf1
, 4 GB e una partizione sdf2
, 5 GB.
sdb
e sdf
siano più veloci degli altri due.
pvcreate
:
#
pvdisplay
#
pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created #
pvdisplay
"/dev/sdb2" is a new physical volume of "4,00 GiB" --- NEW Physical volume --- PV Name /dev/sdb2 VG Name PV Size 4.00 GiB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 9JuaGR-W7jc-pNgj-NU4l-2IX1-kUJ7-m8cRim #
for i in sdc3 sdd sdf1 sdf2 ; do pvcreate /dev/$i ; done
Physical volume "/dev/sdc3" successfully created Physical volume "/dev/sdd" successfully created Physical volume "/dev/sdf1" successfully created Physical volume "/dev/sdf2" successfully created #
pvdisplay -C
PV VG Fmt Attr PSize PFree /dev/sdb2 lvm2 a- 4.00g 4.00g /dev/sdc3 lvm2 a- 3.09g 3.09g /dev/sdd lvm2 a- 4.00g 4.00g /dev/sdf1 lvm2 a- 4.10g 4.10g /dev/sdf2 lvm2 a- 5.22g 5.22g
pvdisplay
elenca le PV esistenti, con due possibili formati di output.
vgcreate
. Solo le PV dei dischi più veloci saranno riunite in un VG vg_critical
; l'altro VG, vg_normal
, includerà anche gli elementi più lenti.
#
vgdisplay
#
vgcreate vg_critical /dev/sdb2 /dev/sdf1
Volume group "vg_critical" successfully created #
vgdisplay
--- Volume group --- VG Name vg_critical System ID Format lvm2 Metadata Areas 2 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 2 Act PV 2 VG Size 8.14 GB PE Size 4.00 MB Total PE 2084 Alloc PE / Size 0 / 0 Free PE / Size 2084 / 8.14 GB VG UUID 6eG6BW-MmJE-KB0J-dsB2-52iL-N6eD-1paeo8 #
vgcreate vg_normal /dev/sdc3 /dev/sdd /dev/sdf2
Volume group "vg_normal" successfully created #
vgdisplay -C
VG #PV #LV #SN Attr VSize VFree vg_critical 2 0 0 wz--n- 8.14g 8.14g vg_normal 3 0 0 wz--n- 12.30g 12.30g
vgdisplay
propone due formati di output). Notare che è possibile usare due partizioni dello stesso disco fisico in due diversi VG. Notare inoltre che si è usato un prefisso vg_
per nominare i VG, ma non è altro che una convenzione.
lvcreate
e una sintassi leggermente più complessa:
#
lvdisplay
#
lvcreate -n lv_files -L 5G vg_critical
Logical volume "lv_files" created #
lvdisplay
--- Logical volume --- LV Name /dev/vg_critical/lv_files VG Name vg_critical LV UUID 4QLhl3-2cON-jRgQ-X4eT-93J4-6Ox9-GyRx3M LV Write Access read/write LV Status available # open 0 LV Size 5.00 GB Current LE 1280 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 #
lvcreate -n lv_base -L 1G vg_critical
Logical volume "lv_base" created #
lvcreate -n lv_backups -L 12G vg_normal
Logical volume "lv_backups" created #
lvdisplay -C
LV VG Attr LSize Origin Snap% Move Log Copy% Convert lv_base vg_critical -wi-a- 1.00G lv_files vg_critical -wi-a- 5.00G lv_backups vg_normal -wi-a- 12.00G
lvcreate
. Il nome dei LV da creare viene specificato con l'opzione -n
e la sua dimensione viene generalmente data usando l'opzione -L
. Ovviamente bisogna anche dire al comando su quale VG operare, da cui l'ultimo parametro sulla riga di comando.
/dev/mapper/
:
#
ls -l /dev/mapper
total 0 crw-rw---- 1 root root 10, 59 5 oct. 17:40 control lrwxrwxrwx 1 root root 7 5 oct. 18:14 vg_critical-lv_base -> ../dm-1 lrwxrwxrwx 1 root root 7 5 oct. 18:14 vg_critical-lv_files -> ../dm-0 lrwxrwxrwx 1 root root 7 5 oct. 18:14 vg_normal-lv_backups -> ../dm-2 #
ls -l /dev/dm-*
brw-rw---- 1 root disk 253, 0 5 oct. 18:14 /dev/dm-0 brw-rw---- 1 root disk 253, 1 5 oct. 18:14 /dev/dm-1 brw-rw---- 1 root disk 253, 2 5 oct. 18:14 /dev/dm-2
#
ls -l /dev/vg_critical
total 0 lrwxrwxrwx 1 root root 7 5 oct. 18:14 lv_base -> ../dm-1 lrwxrwxrwx 1 root root 7 5 oct. 18:14 lv_files -> ../dm-0 #
ls -l /dev/vg_normal
total 0 lrwxrwxrwx 1 root root 7 5 oct. 18:14 lv_backups -> ../dm-2
#
mkfs.ext4 /dev/vg_normal/lv_backups
mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) [...] This filesystem will be automatically checked every 34 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. #
mkdir /srv/backups
#
mount /dev/vg_normal/lv_backups /srv/backups
#
df -h /srv/backups
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_normal-lv_backups 12G 159M 12G 2% /srv/backups #
[...]
[...] #
cat /etc/fstab
[...] /dev/vg_critical/lv_base /srv/base ext4 /dev/vg_critical/lv_files /srv/files ext4 /dev/vg_normal/lv_backups /srv/backups ext4
vg_critical
, si può espandere lv_files
. A questo scopo, si usa il comando lvresize
, quindi resize2fs
per adattare il file system di conseguenza:
#
df -h /srv/files/
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_files 5.0G 4.6G 142M 98% /srv/files #
lvdisplay -C vg_critical/lv_files
LV VG Attr LSize Origin Snap% Move Log Copy% Convert lv_files vg_critical -wi-ao 5.00g #
vgdisplay -C vg_critical
VG #PV #LV #SN Attr VSize VFree vg_critical 2 2 0 wz--n- 8.14g 2.14g #
lvresize -L 7G vg_critical/lv_files
Extending logical volume lv_files to 7.00 GB Logical volume lv_files successfully resized #
lvdisplay -C vg_critical/lv_files
LV VG Attr LSize Origin Snap% Move Log Copy% Convert lv_files vg_critique -wi-ao 7.00g #
resize2fs /dev/vg_critical/lv_files
resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/vg_critical/lv_files is mounted on /srv/files; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/vg_critical/lv_files to 1835008 (4k) blocks. The filesystem on /dev/vg_critical/lv_files is now 1835008 blocks long. #
df -h /srv/files/
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_files 6.9G 4.6G 2.1G 70% /srv/files
#
df -h /srv/base/
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_base 1008M 835M 123M 88% /srv/base #
vgdisplay -C vg_critical
VG #PV #LV #SN Attr VSize VFree vg_critical 2 2 0 wz--n- 8.14g 144.00m
sdb1
, che finora era stata usata al di fuori di LVM, conteneva solo archivi che potrebbero essere spostati su lv_backups
. La si può quindi riciclare e integrare nel gruppo di volume, liberando così dello spazio utilizzabile. Questo è lo scopo del comando vgextend
. Ovviamente la partizione deve essere preparata in precedenza come volume fisico. Una volta che il VG è stato esteso, possiamo usare comandi simili ai precedenti per espandere il volume logico e poi il file system:
#
pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created #
vgextend vg_critical /dev/sdb1
Volume group "vg_critical" successfully extended #
vgdisplay -C vg_critical
VG #PV #LV #SN Attr VSize VFree vg_critical 3 2 0 wz--n- 9.09g 1.09g #
[...]
[...] #
df -h /srv/base/
Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_critical-lv_base 2.0G 835M 1.1G 44% /srv/base
sda
e sdc
. Vengono partizionati in modo identico secondo il seguente schema:
#
fdisk -l /dev/sda
Disk /dev/hda: 300.0 GB, 300090728448 bytes 255 heads, 63 sectors/track, 36483 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00039a9f Device Boot Start End Blocks Id System /dev/sda1 * 1 124 995998+ fd Linux raid autodetect /dev/sda2 125 248 996030 82 Linux swap / Solaris /dev/sda3 249 36483 291057637+ 5 Extended /dev/sda5 249 12697 99996561 fd Linux raid autodetect /dev/sda6 12698 25146 99996561 fd Linux raid autodetect /dev/sda7 25147 36483 91064421 8e Linux LVM
md0
. Questo mirror è usato direttamente per contenere il file system di root.
sda2
e sdc2
sono usate come partizioni di swap, dando un totale di 2 GB di spazio di swap. Con 1 GB di RAM, la postazione di lavoro ha una quantità sufficiente di memoria disponibile.
sda5
e sdc5
, così come sda6
e sdc6
, sono assemblate in due nuovi volumi RAID-1 di circa 100 GB l'uno, md1
e md2
. Entrambi questi mirror sono inizializzati come volumi fisici per LVM e assegnati al gruppo di volume vg_raid
. Questo VG contiene circa 200 GB di spazio sicuro.
sda7
e sdc7
, sono usate direttamente come volumi fisici e assegnate a un altro VG chiamato vg_bulk
, che quindi ha all'incirca 200 GB di spazio.
vg_raid
saranno preservati anche in caso di guasto di uno dei dischi, cosa che non succede per i LV creati in vg_bulk
; d'altro canto, quest'ultimo sarà allocato in parallelo su entrambi i dischi, il che consente velocità di lettura o scrittura maggiori per file grandi.
lv_usr
, lv_var
e lv_home
su vg_raid
, per ospitare i corrispondenti file system; un altro grande LV, lv_movies
, verrà usato per ospitare le versioni definitive dei filmati dopo l'elaborazione. L'altro VG verrà suddiviso in un grande lv_rushes
, per ospitare i dati che provengono direttamente dalle videocamere digitali e un lv_tmp
per i file temporanei. La posizione dell'area di lavoro è meno ovvia: pur essendo necessarie delle buone prestazioni per quel volume, vale la pena rischiare di perdere il lavoro se un disco si guasta durante una sessione di elaborazione? A seconda della risposta a quella domanda, il relativo LV sarà creato su uno dei due VG.
/usr/
può essere allargato senza fatica.