summaryrefslogtreecommitdiff
path: root/debian/mdrun
blob: cb63ff3de22e09886f1ea1730bbc62115ef735dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/bin/sh

# mdrun, (c) Eduard Bloch <blade@debian.org> 2003

# Usage: 
# Without arguments: autodetect all RAID partitions and activate MDs
# Arguments: [ DEVDIR ] NUMBER UUID [ <NUMBER UUID> ... ]
# a number of number/uuid pairs, where NUMBER is the one from /dev/md/*
# Argument: LIST
# lists all raids in the syntax needed for the pairs (see above)

# IMPORTANT: create /dev/fs directory if you have devfs support in the kernel
# but do not want to mount it over /dev. Usage of /dev/fs directory will keep
# mdrun away from /dev.

# If the first argument is a directory, it will be used as a writeable
# temporary directory for device nodes. mdrun needs mknod to create them
# on-the-fly

# Environment: 
# MORERAIDVOLUMES (list of strings) : additional raid disks to scan, 
#                                     eg. loop devices

is_true()
{
  case "$1" in
    [Yy]es|[Yy]|1|[Tt]rue) return 0;;
    *) return 1;
  esac
}

warn()
{
  echo "$@" >&2
}

[ -f /etc/default/mdadm ] && . /etc/default/mdadm
# disabled until the transition is complete
if false && ! is_true $USE_DEPRECATED_MDRUN; then
  warn
  warn =========================
  warn mdrun deprecation warning
  warn =========================
  warn
  warn If you are seeing this during boot, please upgrade to a newer
  warn version of the initramfs-tools package and ignore the rest of
  warn this message.
  warn
  warn You are running $0, or your system is not properly configured
  warn such that $0 is used as a fallback. Due to technical limitations,
  warn $0 is deprecated and will be removed in a future relese of mdadm.
  warn Please see /usr/share/doc/mdadm/README.mdrun for more info.
  warn

  TIMEOUT=15
  if [ -r /dev/stdin ]; then
    # cannot use -t or -n, which is not POSIX
    read -p'Please hit return to continue...' resp < /dev/stdin >&2
    warn
  else
    warn "Pausing for $TIMEOUT seconds..." >&2
    sleep $TIMEOUT
  fi
fi

if ! test -e /proc/partitions ; then
   echo "/proc not mounted!"
   exit 1
fi

DEVDIR=/dev

if [ -d "$1" ] ; then
   AUTOCREATE=true
   DEVDIR="$1"
   shift
fi

# For people that compile the kernel with devfs (means: different
# proc/partitions content), but without auto-mounting it
if ! uname -r | grep "^2.6" 1>/dev/null && [ -z "$AUTOCREATE" ] && grep "	devfs" /proc/filesystems >/dev/null 2>&1 && ! grep "^devfs" /proc/mounts >/dev/null 2>&1 ; then

   mkdir /dev/fs 2>/dev/null
   # if we can do it - good, we will use it. Otherwise, use /dev even if it is ugly

   # mount devfs for now to make the device names match, umount later
   if [ -d /dev/fs ] ; then
      DEVDIR=/dev/fs
   fi
   mount none $DEVDIR -tdevfs
   UMNTDEVFS="umount $DEVDIR"
fi

# arr(array, index): return contents in array[index]; as with Bourne shell
# in general, there is no easy way to distinguish between index not
# existing and empty string assigned.
arr() { sa_i=`arr_index $2`; eval "echo \"\$$1_${sa_i}\""; unset sa_i; }

# seterr(array, index, value): assign the given value to array[index].
setarr() { sa_i=`arr_index $2`; eval "$1_${sa_i}=\"$3\""; unset sa_i; }

# arr_index(index): make sure the given index is valid for use.
arr_index() { echo $1 | sed -e 's/:/_/g' | sed 's;/;_;g'; }


BASE=$DEVDIR/md
export BASE
#devfs
test -d $BASE && BASE=$BASE/

next_free_md() {
   for raidnr in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24; do
      if ! mdadm -D $BASE$raidnr >/dev/null 2>&1 ; then
         echo $BASE$raidnr
         return 0
      fi
   done
   return 1
}

listpairs() {
   for NUMBER in `cat /proc/mdstat | grep "^md. : active" | sed -e 's/^md\(.\) :.*/\1/'`; do
      echo $NUMBER
      mdadm -D ${BASE}$NUMBER 2>/dev/null |grep UUID | sed 's/.*: \(.*\)/\1/' 
   done
}

if [ "$1" = LIST ] ; then
   echo `listpairs`
   $UMNTDEVFS
   exit 0
fi

DEVDIRESC=$(echo $DEVDIR | sed -e 's!/!\\/!g')
if [ "$AUTOCREATE" ] ; then
   CREATECMD=$(sed -e "s/.*major.*//; s/.*\ \([:0-9:]\+\)\ \+\ \([:0-9:]\+\)\ \+\ [:0-9:]\+\ \+\([:a-z0-9\/:]\+\).*/mknod \3 b \1 \2 ; / ; s/\//_/g" < /proc/partitions)
   export CREATECMD
   export DEVDIR
   # and we need array nodes, of course
   (
      cd $DEVDIR ;
      eval $CREATECMD ; 
      for x in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ; do
         mknod ${BASE}$x b 9 $x
      done
   )
   PARTLIST=$(sed -e "s/.*major.*//; s/.*\ \([:0-9:]\+\)\ \+\ \([:0-9:]\+\)\ \+\ [:0-9:]\+\ \+\([:a-z0-9\/:]\+\).*/DEVDIR\3 /; s/\//_/g ; s/DEVDIR/$DEVDIRESC\//;" < /proc/partitions)
else
   PARTLIST=$(sed -e "s/.*major.*//; s/^[:0-9 :]* \([:a-z:].[:a-z0-9\/:]*\).*/\1/; s/^\([:a-z:].*\)/$DEVDIRESC\/\1/g" < /proc/partitions)
fi

for SRC in $PARTLIST $MORERAIDVOLUMES ; do
   SUM=$(mdadm -E $SRC 2>/dev/null | grep UUID | sed 's/.*: \(.*\)/\1/')
   for x in $SUM; do
      UUIDS="$UUIDS $SUM"
      setarr MDS $SUM "`arr MDS $SUM` $SRC"
   done
done

if [ "$#" -gt 1 ] ; then
   NUMBER=${BASE}$1
   MD=$2
   shift ; shift
   if [ "`arr MDS $MD`" != "started" ] ; then
      mdadm -A -a yes $NUMBER -f `arr MDS $MD` && setarr MDS $MD "started" 
      # just to be sure
      ln /dev/md/$NUMBER /dev/md$NUMBER 2>/dev/null
   fi
fi

# and process the rest, if it exists
# do not touch active arrays
#dropactive() {
   for NUMBER in `cat /proc/mdstat | grep "^md. : active" | sed -e 's/^md\(.\) :.*/\1/'`; do
      setarr MDS `mdadm -D ${BASE}$NUMBER 2>/dev/null |grep UUID | sed 's/.*: \(.*\)/\1/'` "started"
   done
#}


for MD in $UUIDS; do
   if [ "`arr MDS $MD`" != "started" ] ; then
      NUMBER=`next_free_md`
      mdadm -A -a yes $NUMBER -f `arr MDS $MD` && setarr MDS $MD "started" 
      # just to be sure
      ln /dev/md/$NUMBER /dev/md$NUMBER 2>/dev/null
   fi
done

$UMNTDEVFS