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