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
190
191
192
193
194
195
196
197
198
199
200
201
202
|
#!/bin/sh
# Copyright © 2001-2004 Mario Jou/3en <joussen@debian.org>
# Copyright © martin f. krafft <madduck@debian.org>
# Distributable under the terms of the GNU GPL version 2.
#
# $Id$
#
. /usr/share/debconf/confmodule
# see #369953 for ordering
set -eu
CONFIG=/etc/mdadm/mdadm.conf
ALTCONFIG=/etc/mdadm.conf
[ ! -f $CONFIG ] && [ -f $ALTCONFIG ] && CONFIG=$ALTCONFIG
DEBIANCONFIG=/etc/default/mdadm
DEBIANCONFIG_OLD=/etc/mdadm/debian.conf
if [ ! -e "$DEBIANCONFIG" ]; then
if [ -e "$DEBIANCONFIG_OLD" ]; then
DEBIANCONFIG="$DEBIANCONFIG_OLD"
fi
fi
INITRDSTART=''
if [ -s $DEBIANCONFIG ] ; then
AUTOSTART=true
AUTOCHECK=true
START_DAEMON=true
MAILADDR=root
[ -f $DEBIANCONFIG ] && . $DEBIANCONFIG
if [ -f $CONFIG ]; then
MAILADDR=$(sed -rne 's,^MAILADDR[[:space:]]*([^[:space:]]+).*,\1,p' $CONFIG)
fi
# if $MAIL_TO from $DEBIANCONFIG is set, give it priority. This is because
# it was used in the command line invocation of the mdadm monitor, and thus
# overruled any existing setting in /etc/mdadm/mdadm.conf.
# There's a slight chance of loss of a configuration setting (MAILADDR in
# /etc/mdadm/mdadm.conf), but it's only an email address, and it is likely
# unused anyway, thus we run the risk.
[ -n "${MAIL_TO:-}" ] && MAILADDR="$MAIL_TO"
[ -n "$AUTOSTART" ] && db_set mdadm/autostart "$AUTOSTART"
[ -n "$AUTOCHECK" ] && db_set mdadm/autocheck "$AUTOCHECK"
[ -n "$START_DAEMON" ] && db_set mdadm/start_daemon "$START_DAEMON"
[ -n "$MAILADDR" ] && db_set mdadm/mail_to "$MAILADDR"
fi
chrooted() {
test ! -r /proc/1/root
}
get_root_raiddev() {
local rootraiddev;
rootraiddev="$(df / | sed -rne 's,^(/dev/[^[:space:]]+).*,\1,p')"
if ! mdadm --detail $rootraiddev >/dev/null 2>&1; then
return 1
fi
echo ${rootraiddev%p[0-9]*}
return 0
}
get_initrdstart() {
db_fget mdadm/initrdstart seen
if chrooted || [ "$RET $INITRDSTART" = "false all" ]; then
echo all
return 1
fi
get_root_raiddev || echo all
}
[ -z "$INITRDSTART" ] && INITRDSTART="$(get_initrdstart)"
[ -n "$INITRDSTART" ] && db_set mdadm/initrdstart "$INITRDSTART"
db_capb escape
if [ ! -x "$(command -v debconf-escape)" ]; then
debconf-escape()
{ # copied from debconf 1.4.72:
perl -e '
while (<>) {
s/\\/\\\\/g;
s/\n/\\n/g;
print;
}
'
}
fi
msg=intro; suffix=''; error=0
while true; do
db_metaget mdadm/initrdstart_msg_${msg} extended_description || :
db_subst mdadm/initrdstart msg "$(echo -e "${RET}${suffix}" | debconf-escape -e)"
ret=0; db_input low mdadm/initrdstart || ret=$?
db_go
if [ $error -ne 0 ] && [ $ret -eq 30 ]; then
# there was an error in a previous run of this loop, but the above question
# was not asked, so we better exit the endless loop...
echo "W: unable to determine MD arrays needed for boot." >&2
echo "W: falling back to starting all of them..." >&2
INITRDSTART=all
break
fi
db_get mdadm/initrdstart
INITRDSTART="$(echo $RET | tr , ' ')"
case "$INITRDSTART" in
''|none) INITRDSTART=none; break;;
all) break;;
*)
arrays=''
for i in $INITRDSTART; do
# standardise by prefixing /dev/
i="/dev/${i#/dev/}"
# remove partition from partitionable array
i="${i%p[0-9]*}"
if [ ! -e "$i" ]; then
error=1; msg=errexist; suffix=": $i"; break
fi
if [ ! -b "$i" ]; then
t="$(readlink -nf "$i")"
if [ ! -b "$t" ]; then
suffix=": $t"
else
suffix=": $i"
fi
error=1; msg=errblock; break
fi
if ! mdadm --detail "$i" >/dev/null 2>&1; then
error=1; msg=errmd; suffix=": $i"; break
fi
if [ -f $CONFIG ]; then
if ! egrep -q "^(ARRAY)?[[:space:]]+$i([[:space:]]+|$)" $CONFIG; then
t="$(readlink -nf "$i")"
if [ -L "$i" ] \
&& egrep -q "^(ARRAY)?[[:space:]]+$t([[:space:]]|$)+" $CONFIG; then
i="$t"
else
db_set mdadm/initrdstart_notinconf false
db_fset mdadm/initrdstart_notinconf seen false
db_subst mdadm/initrdstart_notinconf array "$i"
db_subst mdadm/initrdstart_notinconf config "$CONFIG"
db_input high mdadm/initrdstart_notinconf || :
db_go
db_get mdadm/initrdstart_notinconf
if [ "$RET" = true ]; then
md5sum $CONFIG > /var/lib/mdadm/CONF-UNCHECKED
error=0
else
db_fset mdadm/initrdstart seen false
db_set mdadm/initrdstart all
error=1; msg=errconf; suffix=": $i"; break
fi
fi
fi
fi
# uniquely add device name
echo $arrays | egrep -q "\b${i}\b" || arrays="${arrays:+$arrays }$i"
done
if [ $error -eq 0 ]; then
INITRDSTART="$arrays"
# exit the while true loop
break
fi
;;
esac
done
db_set mdadm/initrdstart "$INITRDSTART"
if [ "$INITRDSTART" != all ]; then
db_input high mdadm/autostart || :
db_go
fi
db_input medium mdadm/autocheck || :
db_go
db_input medium mdadm/start_daemon || :
db_go
db_get mdadm/start_daemon || :
if [ "$RET" = true ]; then
db_input medium mdadm/mail_to || :
db_go
fi
|