]>
Commit | Line | Data |
---|---|---|
d7f133d3 | 1 | #!/bin/sh |
c34c6a69 | 2 | MD_RCSID='$Revision$ $Date:: $' |
05c474b5 | 3 | |
d7f133d3 | 4 | # geninitrd mod: mdadm |
6e49b0b1 | 5 | USE_MD=${USE_MD:-yes} |
d7f133d3 ER |
6 | |
7 | # if we should init md (softraid) at boot | |
8 | have_md=no | |
9 | ||
c124d0cf ER |
10 | # setup geninitrd module |
11 | # @access public | |
12 | setup_mod_md() { | |
13 | mdassemble=$(find_tool $initrd_dir/mdassemble /sbin/initrd-mdassemble) | |
fb5f781c AM |
14 | if [ ! -x "$mdassemble" ]; then |
15 | USE_MD=no | |
16 | fi | |
17 | mdadm=$(find_tool /sbin/mdadm $initrd_dir/mdadm /sbin/initrd-mdadm) | |
18 | if [ ! -x "$mdadm" ]; then | |
c124d0cf ER |
19 | USE_MD=no |
20 | fi | |
21 | } | |
22 | ||
d7f133d3 ER |
23 | # return true if mdadm is set on $devpath |
24 | # @param string $devpath device node to be examined | |
25 | # @access public | |
26 | is_md() { | |
27 | local devpath="$1" | |
28 | ||
29 | # mdadm disabled | |
30 | if ! is_yes "$USE_MD"; then | |
31 | return 1 | |
32 | fi | |
33 | ||
34 | if [[ "$devpath" == /dev/md* ]]; then | |
35 | return 0 | |
36 | fi | |
37 | ||
38 | return 1 | |
39 | } | |
40 | ||
41 | # find md modules for $devpath | |
42 | # @param $devpath device to be examined | |
43 | # @return false if $devpath is not on md | |
44 | # @access public | |
45 | find_modules_md() { | |
46 | local found raidlevel | |
47 | ||
48 | if [ -f /etc/mdadm.conf ]; then | |
02ba8ab7 | 49 | verbose "Finding RAID details using mdadm for rootdev=$1" |
fb5f781c | 50 | eval `($mdadm -v --examine --scan --config=/etc/mdadm.conf 2> /dev/null;$mdadm -v --detail --scan --config=/etc/mdadm.conf 2> /dev/null) | awk -v rootdev="$1" ' |
d7f133d3 ER |
51 | BEGIN { |
52 | found = "no"; | |
53 | dev_list = ""; | |
54 | raidlevel = "" | |
cd539caa | 55 | rootdev_new = rootdev |
fe818d91 | 56 | rootdev_alias = rootdev; |
57 | # alternative name: normalize from /dev/md/X to /dev/mdX | |
58 | if (rootdev_alias ~ /\/dev\/md\/[0-9]+/) { | |
59 | gsub(/\/dev\/md\//,"/dev/md",rootdev_alias); | |
d7f133d3 | 60 | } |
fe818d91 | 61 | # alternative name: normalize from /dev/mdXpY to /dev/mdX |
62 | if (rootdev_alias ~/\/dev\/md[0-9]+p[0-9]+/) { | |
db8e92d6 | 63 | gsub(/p[0-9]+/,"",rootdev_alias); |
a9e41537 | 64 | } |
d7f133d3 ER |
65 | } |
66 | ||
67 | /^ARRAY/ { | |
8d49d94b AM |
68 | arr_device = $2 |
69 | # normalize to /dev/mdX form | |
176371ad | 70 | if (arr_device ~ /\/dev\/md\/[0-9]+/) { |
8d49d94b AM |
71 | gsub(/\/dev\/md\//,"/dev/md",arr_device); |
72 | } | |
fe818d91 | 73 | if ((arr_device == rootdev) || (arr_device == rootdev_alias)) { |
d7f133d3 | 74 | raidlevel=$3; |
e09e0bbd | 75 | rootdev_new=arr_device |
d7f133d3 ER |
76 | gsub(/level=/,NUL,raidlevel); |
77 | if (raidlevel ~ /^raid([0-6]|10)/) { | |
78 | gsub(/raid/,NUL,raidlevel); | |
79 | }; | |
80 | found="yes"; | |
81 | getline x; | |
82 | if (x ~ /devices=/) { | |
83 | dev_list = x; | |
84 | gsub(".*devices=", NUL, dev_list); | |
85 | gsub(",", " ", dev_list); | |
86 | } | |
87 | } | |
88 | } | |
89 | ||
90 | END { | |
e09e0bbd | 91 | print "rootdev_new=" rootdev_new; |
d7f133d3 ER |
92 | print "have_md=" found; |
93 | print "raidlevel=" raidlevel; | |
94 | print "dev_list=\"" dev_list "\""; | |
95 | }'` | |
96 | fi | |
97 | ||
98 | if [ "$have_md" != "yes" -a -f /etc/raidtab ]; then | |
99 | die "raidtools are not longer supported. Please migrate to mdadm setup!" | |
100 | fi | |
101 | ||
102 | if is_yes "$have_md"; then | |
103 | case "$raidlevel" in | |
104 | [01]|10) | |
105 | find_module "raid$raidlevel" | |
106 | ;; | |
107 | [456]) | |
108 | find_module "-raid$raidlevel" | |
109 | find_module "-raid456" | |
110 | ;; | |
111 | linear) | |
112 | find_module "linear" | |
113 | ;; | |
114 | *) | |
115 | warn "raid level $number (in mdadm config) not recognized" | |
116 | ;; | |
117 | esac | |
118 | else | |
119 | die "RAID devices not found for \"$1\", check your configuration!" | |
120 | fi | |
121 | ||
02ba8ab7 | 122 | verbose "md: found rootdev=$1 on device $rootdev_new with devices list ${dev_list}" |
a0eba8e9 | 123 | |
d7f133d3 | 124 | rootdev_nr=$(( $rootdev_nr + 1 )) |
e09e0bbd | 125 | eval "rootdev${rootdev_nr}=\"$rootdev_new\"" |
d7f133d3 ER |
126 | eval "dev_list${rootdev_nr}=\"${dev_list}\"" |
127 | ||
128 | for device in $dev_list; do | |
129 | find_modules_for_devpath $device | |
130 | done | |
131 | } | |
132 | ||
133 | ||
134 | # generate initrd fragment for md | |
135 | # @access public | |
136 | initrd_gen_md() { | |
1b481849 ER |
137 | if ! is_yes "$have_md"; then |
138 | return | |
139 | fi | |
02ba8ab7 | 140 | verbose "Setting up mdadm..." |
d7f133d3 | 141 | |
684d5d2a | 142 | inst_exec $mdassemble /bin/mdassemble |
d7f133d3 ER |
143 | |
144 | # LVM on RAID case | |
684d5d2a | 145 | local dev_list_extra ex_dev |
d7f133d3 | 146 | dev_list_extra=$(awk '/^DEVICE / { for (i=2; i<=NF; i++) { printf "%s ", $i; }; } ' /etc/mdadm.conf | xargs) |
5764872b AM |
147 | new_dev_list_extra="" |
148 | for ex_dev in $dev_list_extra; do | |
149 | if [ "$ex_dev" = "partitions" ]; then | |
150 | echo "DEVICE partitions" >> "$DESTDIR/etc/mdadm.conf" | |
151 | # FIXME: find and copy partition devices from /proc/partitions | |
152 | # - best if done at runtime, now initrd gen time | |
153 | continue | |
154 | fi | |
155 | echo "DEVICE $ex_dev" >> "$DESTDIR/etc/mdadm.conf" | |
156 | new_dev_list_extra="$new_dev_list_extra $ex_dev" | |
157 | done | |
158 | dev_list_extra=$new_dev_list_extra | |
684d5d2a ER |
159 | |
160 | local cr_rootdev cr_dev_list do_md0=1 nr cr_dev_list_md f cr_md_conf | |
d7f133d3 ER |
161 | for nr in `seq 1 $rootdev_nr`; do |
162 | eval cr_rootdev="\$rootdev${nr}" | |
163 | eval cr_dev_list="\$dev_list${nr}" | |
02ba8ab7 | 164 | verbose "Setting up array ($cr_rootdev = $cr_dev_list)" |
d7f133d3 ER |
165 | |
166 | [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0 | |
167 | ||
168 | echo "DEVICE $cr_dev_list" >> "$DESTDIR/etc/mdadm.conf" | |
169 | cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ +/,",",$0); print $0; }')" | |
fb5f781c | 170 | cr_md_conf=$($mdadm --detail --brief --config=/etc/mdadm.conf $cr_rootdev | awk ' { gsub(/spares=[0-9]+/, "", $0); print $0; }') |
d7f133d3 ER |
171 | if [ -n "$cr_md_conf" ]; then |
172 | echo "$cr_md_conf" >> "$DESTDIR/etc/mdadm.conf" | |
173 | else | |
174 | echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> "$DESTDIR/etc/mdadm.conf" | |
175 | fi | |
176 | ||
177 | for f in $cr_dev_list $cr_rootdev $dev_list_extra; do | |
178 | # mkdir in case of devfs name | |
179 | inst_d $(dirname $f) | |
180 | [ -e "$DESTDIR/$f" ] && continue | |
181 | # this works fine with and without devfs | |
182 | inst $f $f | |
183 | done | |
184 | done | |
185 | ||
beb71958 ER |
186 | add_linuxrc <<-EOF |
187 | mdassemble | |
d7f133d3 | 188 | |
afc41173 | 189 | if [ "$DEBUGINITRD" ]; then |
beb71958 | 190 | [ -e /proc/mdstat ] && echo "/proc/mdstat contents:" && cat /proc/mdstat |
afc41173 | 191 | fi |
beb71958 | 192 | EOF |
afc41173 | 193 | |
d7f133d3 ER |
194 | # needed to determine md-version |
195 | if [ "$do_md0" -eq 1 ]; then | |
196 | mknod $DESTDIR/dev/md0 b 9 0 | |
197 | fi | |
198 | } |