diff options
author | Dimitri John Ledkov <xnox@ubuntu.com> | 2016-07-02 19:16:01 +0100 |
---|---|---|
committer | Dimitri John Ledkov <xnox@ubuntu.com> | 2016-07-02 19:16:01 +0100 |
commit | b83f8fcaffa542498c5698a3a161b9967ac1d3d6 (patch) | |
tree | 3cb83259723d112fd7b08b5bd299df2f5ee94009 /misc/mdcheck |
mdadm (3.4-2) unstable; urgency=low
* Reneable incremental assembly
* Rely on udev to assemble incremental arrays
* In environments with systemd rely on mdadm-last-resort@.timer|.service
units to activate degrated raids
* In environments initramfs-tools initrd (no systemd) add local-block
script to do the same after 2/3rds of root delay iteration
* Drop local-top initramfs script
* Drop dependency on initscripts package
* Drop INITRDSTART support
* Drop mdadm-raid init script
* Drop ancient preinst
* In mdadm.init remove dependency on mdadm-raid
* In mdadm.init check, and bail out running in a container
* In mdadm.config drop mdadm/autostart logic
* Drop CREATE stanzas from mkconf and don't include them in the
initramfs. The generated defaults, are the compiled-in defaults. And
the current one generates warnings when running mdadm in the
initramfs, as there is no passwd|group files to resolve root/disk
uid/gid. Closes: 717609
* Adapt changes and formatting of initramfs hook from Ubuntu
* Bump standards version to 3.9.7, no changes required
* Fix copyright-refers-to-symlink-license
* Closes: #781172, #796624, #769201, #813335, #632401, #804973, #714155,
#770002, #737132, #675452, #726390, #813637, #814036.
# imported from the archive
Diffstat (limited to 'misc/mdcheck')
-rw-r--r-- | misc/mdcheck | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/misc/mdcheck b/misc/mdcheck new file mode 100644 index 00000000..2c8f54d6 --- /dev/null +++ b/misc/mdcheck @@ -0,0 +1,159 @@ +#!/bin/bash + +# Copyright (C) 2014 Neil Brown <neilb@suse.de> +# +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# Author: Neil Brown +# Email: <neilb@suse.de> + +# This script should be run periodically to automatically +# perform a 'check' on any md arrays. +# +# It supports a 'time budget' such that any incomplete 'check' +# will be checkpointed when that time has expired. +# A subsequent invocation can allow the 'check' to continue. +# +# Options are: +# --continue Don't start new checks, only continue old ones. +# --duration This is passed to "date --date=$duration" to find out +# when to finish +# +# To support '--continue', arrays are identified by UUID and the 'sync_completed' +# value is stored in /var/lib/mdcheck/$UUID + +# convert a /dev/md name into /sys/.../md equivalent +sysname() { + set `ls -lLd $1` + maj=${5%,} + min=$6 + readlink -f /sys/dev/block/$maj:$min +} + +args=$(getopt -o hcd: -l help,continue,duration: -n mdcheck -- "$@") +rv=$? +if [ $rv -ne 0 ]; then exit $rv; fi + +eval set -- $args + +cont= +endtime= +while [ " $1" != " --" ] +do + case $1 in + --help ) + echo >&2 'Usage: mdcheck [--continue] [--duration time-offset]' + echo >&2 ' time-offset must be understood by "date --date"' + exit 0 + ;; + --continue ) cont=yes ;; + --duration ) shift; dur=$1 + endtime=$(date --date "$dur" "+%s") + ;; + esac + shift +done +shift + +# We need a temp file occasionally... +tmp=/var/lib/mdcheck/.md-check-$$ +trap 'rm -f "$tmp"' 0 + + +# firstly, clean out really old state files +mkdir -p /var/lib/mdcheck +find /var/lib/mdcheck -name "MD_UUID*" -type f -mtime +180 -exec rm {} \; + +# Now look at each md device. +cnt=0 +for dev in /dev/md?* +do + [ -e "$dev" ] || continue + sys=`sysname $dev` + if [ ! -f "$sys/md/sync_action" ] + then # cannot check this array + continue + fi + if [ "`cat $sys/md/sync_action`" != 'idle' ] + then # This array is busy + continue + fi + + mdadm --detail --export "$dev" | grep '^MD_UUID=' > $tmp || continue + source $tmp + fl="/var/lib/mdcheck/MD_UUID_$MD_UUID" + if [ -z "$cont" ] + then + start=0 + elif [ -z "$MD_UUID" -o ! -f "$fl" ] + then + # Nothing to continue here + continue + else + start=`cat "$fl"` + fi + + cnt=$[cnt+1] + eval MD_${cnt}_fl=\$fl + eval MD_${cnt}_sys=\$sys + echo $start > $fl + echo $start > $sys/md/sync_min + echo check > $sys/md/sync_action +done + +if [ -z "$endtime" ] +then + exit 0 +fi + +while [ `date +%s` -lt $endtime ] +do + any= + for i in `eval echo {1..$cnt}` + do + eval fl=\$MD_${i}_fl + eval sys=\$MD_${i}_sys + + if [ -z "$fl" ]; then continue; fi + + if [ "`cat $sys/md/sync_action`" != 'check' ] + then + eval MD_${i}_fl= + rm -f $fl + continue; + fi + read a rest < $sys/md/sync_completed + echo $a > $fl + any=yes + done + if [ -z "$any" ]; then exit 0; fi + sleep 120 +done + +# We've waited, and there are still checks running. +# Time to stop them. +for i in `eval echo {1..$cnt}` +do + eval fl=\$MD_${i}_fl + eval sys=\$MD_${i}_sys + + if [ -z "$fl" ]; then continue; fi + + if [ "`cat $sys/md/sync_action`" != 'check' ] + then + eval MD_${i}_fl= + rm -f $fl + continue; + fi + echo idle > $sys/md/sync_action + cat $sys/md/sync_min > $fl +done |