User Tools

Site Tools


doc:appunti:linux:sa:raid

Gestione dei dischi in Linux

Maneggiare le partizioni

Cambiare dimensione a una partizione ext3

Parametri Boot (per GRUB o LILO) relativi al RAID

Se vogliamo forzare il kernel ad assemblare le partizoini RAID in un determinato modo si possono passare dei parametri al kernel stesso, ad esempio:

raid=noautodetect md=1,/dev/hda5,/dev/hdc5 md=4,/dev/hda2,/dev/hdc2 root=/dev/md4

Gestione RAID con mdadm

Creazione di un volume RAID1

Con il comando seguente viene creato e immediatamente attivato un volume RAID1 in modalità degradata, cioè con un solo disco attivo:

mdadm --create /dev/md10 --run --level=1 --raid-devices=2 /dev/sdb3 missing

Aggiungere una partizione ad un volume RAID

Per aggiungere un componente ad un volume RAID, ad esempio per ripristinare un volume degradato:

mdadm /dev/md0 --add /dev/hdc1

Avviare un volume in modalità degradata

Se non è possibile montare un volume RAID nella sua completezza (ad esempio perché un componente di un RAID1 è guasto), il volume non viene attivato automaticamente. Per forzare l'operazione è necessario passare il parametro --run nel modo assemble oppure nel modo misc:

mdadm --assemble /dev/md0 --run
mdadm --misc /dev/md0 --run

Il modo --misc va usato se il device è stato assemblato solo parzialmente (cioè esiste il device, ma non è running, quindi risulta vuoto). Il nome del device. il corrispondente UUID e quindi le partizioni componenti vengono desunte dal file di configurazione /etc/mdadm/mdadm.conf.

È possibile anche forzare il nome del volume da creare e indicare le componenti da assemblare, specificando tutto sulla riga di comando:

mdadm /dev/md17 --assemble /dev/sdc7 --run

Rimuovere un componente da un volume RAID

Per rimuovere un componente, ad esempio da un volume RAID1, è necessario prima marcarlo come guasto (fail), dopo sarà possibile rimuoverlo dal RAID, che continuerà a lavorare in modalità degradata:

mdadm --manage /dev/md0 --fail /dev/sdb2
mdadm --manage /dev/md0 --remove /dev/sdb2

Distruggere un volume RAID

Per eliminare definitivamente un volume raid è necessario fermarlo, quindi è opportuno azzerare il sperblock di ogni componente, per evitare che l'auto-run dei volumi trovi la signature nelle partizioni e provveda a fare l'assemblaggio al successivo reboot:

mdadm --stop /dev/md4
mdadm --zero-superblock /dev/sda7
mdadm --zero-superblock /dev/sdb7

Checking health of a RAID volume

A disk can degrade (some bits get altered) without that hardware errors are detected, in this case the Linux md subsystem (cat /proc/mdstat) does not display any error. Fortunately - with recent Linux kernels (>= 2.6.17?) - we can force a check of the whole volume consistency. Say we want to check /dev/md0:

echo check >> /sys/block/md0/md/sync_action

Mismatches found are not repaired, but a count is displayed by:

cat /sys/block/md0/md/mismatch_cnt

The counter is reset at the start of the check, increased for each mismatch found, and then stored permanently (also across reboot?). It seems that each mismatch counts as 128 (may be this is the number of tries attempted before the mismatch is acknowledged?).

Unfortunately I have not yet found a way to know the exact filesystem block with the mismatch. If we could know the block number we could use debugfs(8) to discover the actual file using the mismatching block. Attempting to repair the mismatch is done by:

echo repair >> /sys/block/md0/md/sync_action

At the end of the repair we can read the mismatches found (and hoply repaired) via the mismatch_cnt. A new run of the check action should end with a zero mismatch_cnt.

I encountered a case where - for unknow reasons - the reapir did not work: the mismatch_cnt did not reset to zero. Fortunately it was a swap partition, so I solved the mismatch rewriting the partition entirely:

swapoff /dev/md1
dd if=/dev/zero of=/dev/md1
mkswap /dev/md1
swapon /dev/md1

Read also man md(4) and /usr/src/linux/Documentation/md.txt.

Managing bad blocks

resync=PENDING

If a volume remains in a resync=PENDING state (eg. a swap file which is in auto-read-only), you can force the resync with:

mdadm --readwrite /dev/md1

GRUB savedefault and RAID mismatches

The GRUB boot loader has the savedefault option which is used to remember the chosen boot entry. The information is saved into the /boot/grub/stage2 file (at least with GRUB 0.97). This is a problem if the file resides on a RAID volume, because GRUB is not aware of RAID and it writes on the underlying component device. For a RAID1 volume this means that only one component will be written, creating a RAID mismatch.

This problem can cause false alarms on systems that perform periodic RAID checks (a default setup on a Debian box), this is the warning found in /var/log/syslog:

mdadm: RebuildStarted event detected on md device /dev/md0
mdadm: Rebuild80 event detected on md device /dev/md0
mdadm: RebuildFinished event detected on md device /dev/md0, component device  mismatches found: 128

I think that savedefault option should be avoided when using Linux software RAID on the boot partition.

RAID in auto-read-only mode

You may find that a RAID array was assembled in auto-read-only mode, like this one:

md1 : active(auto-read-only) raid1 sda5[0] sdb5[1]
      1951744 blocks [2/2] [UU]

It seems a normal behaviour in newer Linux kernels (2.6.22). The read-only status is removed automatically as soon as something is written to the device. I did not find much info about this.

If you want to control this feature, check the state of the start_ro module parameter and eventually change it:

cat /sys/module/md_mod/parameters/start_ro
1
echo 0 > /sys/module/md_mod/parameters/start_ro

Obviously you need to change this parameter before the md kernel subsystem assembles the RAID volumes.

Mdadm problem with Debian Jessie and degraded raid1

Regression - mdadm in jessie will not boot degraded raid1 array. See Debian bug #784823. This is a workaround, as suggested by this post:

cd /etc/initramfs-tools/scripts/local-top
cp /usr/share/initramfs-tools/scripts/local-top/mdadm .
patch --verbose --ignore-whitespace <<'EndOfPatch'
--- mdadm
+++ mdadm
@@ -76,7 +76,15 @@
   if $MDADM --assemble --scan --run --auto=yes${extra_args:+ $extra_args}; then
     verbose && log_success_msg "assembled all arrays."
   else
-    log_failure_msg "failed to assemble all arrays."
+    log_warning_msg "failed to assemble all arrays, attempting individual starts..."
+    for dev in $(cat /proc/mdstat | grep '^md' | cut -d ' ' -f 1); do
+      log_begin_msg "attempting mdadm --run $dev"
+      if $MDADM --run $dev; then
+        verbose && log_success_msg "started $dev"
+      else
+        log_failure_msg "failed to start $dev"
+      fi
+    done
   fi
   verbose && log_end_msg

EndOfPatch
update-initramfs -u

Somewhere on the net there is a suggestion to use the md-mod.start_dirty_degraded=1 kernel command line, but this is not the case, because it is used to force starting degraded and dirty RAID5 and RAID6 volumes. Another hint about a BOOT_DEGRADED=true options in initramfs config seems to be Ubuntu specific.

The problem is that the initramfs hook script provided by the mdadm package does:

mdadm --assemble --scan --run --auto=yes

which actually does not run the array if it is degraded (where the previous start was not).

Rename an MD device permanently

To geneate the configuration file /etc/mdadm/mdadm.conf you can use the tool /usr/share/mdadm/mkconf, which gathers information from the existing RAID volumes. The information are read from the superblock of the MD arrays and contains the name and homehost, so the file created contains lines like this:

ARRAY /dev/md/125  metadata=1.2 UUID=d92a8066:fc45b7d3:f916e674:3a695968 name=hostname:125

Editing mdadm.conf to rename a device (e.g. changing from /dev/md/125 to /dev/md/5) will work on the next reboot (remember to update initramfs), but eventually mkconf will restore the name /dev/md/125 on the next run. To change the name permanently you have to stop the RAID device and update the superblock:

mdadm --stop /dev/md/125
mdadm --assemble /dev/md/5 --name=5 --homehost=newhostname --update=name /dev/sda5 /dev/sdb5

Filesystem has unsupported feature(s)

Può capitare che un filesystem abbia errori.

Può capitare che qualche insano di mente cerchi di riparare questi errori avviando il computer con una versione diversa del sistema operativo in uso. Il risultato può essere un filesystem che il sistema operativo originale non riesce più ad usare:

fsck.ext3 -f -y /dev/hda1
e2fsck 1.27 (8-Mar-2002)
fsck.ext3: Filesystem has unsupported feature(s) (/dev/hda1)
e2fsck: Get a newer version of e2fsck!

Scartiamo l'ipotesi che qualche altro insano di mente innesti una versione di e2fsck diversa da quella fornita col sistema operativo, possiamo usare debugfs per rimettere a posto le cose. Basta scoprire quali sono le features supportate e rimuovere quelle di troppo:

debugfs -w /dev/hda1
debugfs 1.27 (8-Mar-2002)
debugfs:  features
Filesystem features: resize_inode dir_index filetype sparse_super
debugfs:  feature -resize_inode
Filesystem features: dir_index filetype sparse_super
debugfs:  feature -dir_index
Filesystem features: filetype sparse_super
debugfs:  quit

Passaggio da ext3 a ext2

Per convertire un filesystem ext3 in ext2 si deve rimuovere il journal, per tornare ad ext3 basta ricrearlo (tutte qui le differenze?). Il filesystem deve essere smontato. Maggiori informazioni qui: Converting Ext2 Filesystems to Ext3.

tune2fs -O ^has_journal /dev/md3

Per creare nuovamente il journal:

tune2fs -j /dev/md3

Forzare fsck al reboot

Su un server remoto o privo di monitor/tastiera conviene impostare il fix automatico di eventuali errori nel filesystem, senza richiesta di intervento manuale. Questo soprattutto prima di forzare un fsck al reboot.

Fino a Debian 7 Wheezy era sufficiente impostare in /etc/default/rcS:

FSCKFIX=yes

Da quando si usa il sistema di init systemd (cioè da Debian 8 Jessie) tale file non viene più preso in considerazione, esistono invece le unit chiamate systemd-fsck@.service e systemd-fsck-root.service (vedere man 8 systemd-fsck). Tale servizio riconosce alcuni parametri passati al kernel che si possono aggiungere - eventualmente separata da spazi - in /etc/default/grub (ricordarsi poi di eseguire update-grub):

GRUB_CMDLINE_LINUX="fsck.repair=yes"

Controllare anche in /etc/fstab che il sesto campo sia diverso da zero: 1 per il rootfs, 2 per gli altri.

Con tune2fs è possibile verificare ogni quanti reboot viene fatto il check e quando è stato fatto l'ultimo:

tune2fs -l /dev/sda3
...
Mount count:              18
Maximum mount count:      38
Last checked:             Wed May  9 18:57:29 2012
...

Un metodo di forzare il check è aumentare artificialmente il Mount count:

tune2fs -C 100 /dev/sda3

Oppure creare il file

touch /forcefsck

Un altro sistema è forzare il check sulla richiesta di reboot:

shutdown -rF now

Filesystem Features

Se ci sono differenze fra il sistema su cui si esegue il mkfs.ext4 e il sistema su cui si esegue il grub-install, si potrebbe incorrere nel seguente errore:

grub-install /dev/sda
Auto-detection of a filesystem of /dev/sda2 failed

Il caso visto sopra è dovuto al fatto che il filesystem è stato creato sull'host avviato con S.O. 64bit, mentre il grub-install è stato eseguito in un chroot di un sistema a 32bit.

Con tune2fs -l è possibile vedere le Filesystem features, quindi è possibile creare il filesystem con le opzioni opportune. Ad esempio il nostro problema è stato risolto eseguendo:

mkfs.ext4 -O 'uninit_bg,^64bit,^metadata_csum' /dev/sda2
doc/appunti/linux/sa/raid.txt · Last modified: 2024/09/27 08:11 by niccolo