]>
Commit | Line | Data |
---|---|---|
d7f133d3 ER |
1 | #!/bin/sh |
2 | # | |
3 | # geninitrd mod: mdadm | |
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() { | |
11 | mdassemble=$(find_tool $initrd_dir/mdassemble /sbin/initrd-mdassemble) | |
12 | if [ -x /sbin/mdadm -a -x "$mdassemble" ]; then | |
13 | USE_MD=yes | |
14 | else | |
15 | USE_MD=no | |
16 | fi | |
17 | } | |
18 | ||
d7f133d3 ER |
19 | # return true if mdadm is set on $devpath |
20 | # @param string $devpath device node to be examined | |
21 | # @access public | |
22 | is_md() { | |
23 | local devpath="$1" | |
24 | ||
25 | # mdadm disabled | |
26 | if ! is_yes "$USE_MD"; then | |
27 | return 1 | |
28 | fi | |
29 | ||
30 | if [[ "$devpath" == /dev/md* ]]; then | |
31 | return 0 | |
32 | fi | |
33 | ||
34 | return 1 | |
35 | } | |
36 | ||
37 | # find md modules for $devpath | |
38 | # @param $devpath device to be examined | |
39 | # @return false if $devpath is not on md | |
40 | # @access public | |
41 | find_modules_md() { | |
42 | local found raidlevel | |
43 | ||
44 | if [ -f /etc/mdadm.conf ]; then | |
45 | debug "Finding RAID details using mdadm for rootdev=$1" | |
46 | eval `(/sbin/mdadm -v --examine --scan --config=/etc/mdadm.conf;/sbin/mdadm -v --detail --scan --config=/etc/mdadm.conf) | awk -v rootdev="$1" ' | |
47 | BEGIN { | |
48 | found = "no"; | |
49 | dev_list = ""; | |
50 | raidlevel = "" | |
51 | rootdev_devfs = rootdev; | |
52 | if (rootdev ~ /\/dev\/md\/[0-9]/) { | |
53 | gsub(/\/dev\/md\//,"/dev/md",rootdev_devfs); | |
54 | } | |
55 | } | |
56 | ||
57 | /^ARRAY/ { | |
58 | if (($2 == rootdev) || ($2 == rootdev_devfs)) { | |
59 | raidlevel=$3; | |
60 | gsub(/level=/,NUL,raidlevel); | |
61 | if (raidlevel ~ /^raid([0-6]|10)/) { | |
62 | gsub(/raid/,NUL,raidlevel); | |
63 | }; | |
64 | found="yes"; | |
65 | getline x; | |
66 | if (x ~ /devices=/) { | |
67 | dev_list = x; | |
68 | gsub(".*devices=", NUL, dev_list); | |
69 | gsub(",", " ", dev_list); | |
70 | } | |
71 | } | |
72 | } | |
73 | ||
74 | END { | |
75 | print "have_md=" found; | |
76 | print "raidlevel=" raidlevel; | |
77 | print "dev_list=\"" dev_list "\""; | |
78 | }'` | |
79 | fi | |
80 | ||
81 | if [ "$have_md" != "yes" -a -f /etc/raidtab ]; then | |
82 | die "raidtools are not longer supported. Please migrate to mdadm setup!" | |
83 | fi | |
84 | ||
85 | if is_yes "$have_md"; then | |
86 | case "$raidlevel" in | |
87 | [01]|10) | |
88 | find_module "raid$raidlevel" | |
89 | ;; | |
90 | [456]) | |
91 | find_module "-raid$raidlevel" | |
92 | find_module "-raid456" | |
93 | ;; | |
94 | linear) | |
95 | find_module "linear" | |
96 | ;; | |
97 | *) | |
98 | warn "raid level $number (in mdadm config) not recognized" | |
99 | ;; | |
100 | esac | |
101 | else | |
102 | die "RAID devices not found for \"$1\", check your configuration!" | |
103 | fi | |
104 | ||
105 | rootdev_nr=$(( $rootdev_nr + 1 )) | |
106 | eval "rootdev${rootdev_nr}=\"$1\"" | |
107 | eval "dev_list${rootdev_nr}=\"${dev_list}\"" | |
108 | ||
109 | for device in $dev_list; do | |
110 | find_modules_for_devpath $device | |
111 | done | |
112 | } | |
113 | ||
114 | ||
115 | # generate initrd fragment for md | |
116 | # @access public | |
117 | initrd_gen_md() { | |
118 | debug "Setting up mdadm..." | |
119 | ||
684d5d2a | 120 | inst_exec $mdassemble /bin/mdassemble |
d7f133d3 ER |
121 | |
122 | # LVM on RAID case | |
684d5d2a | 123 | local dev_list_extra ex_dev |
d7f133d3 ER |
124 | dev_list_extra=$(awk '/^DEVICE / { for (i=2; i<=NF; i++) { printf "%s ", $i; }; } ' /etc/mdadm.conf | xargs) |
125 | if [ "$dev_list_extra" = "partitions" ]; then | |
126 | # FIXME: handle this case (see man mdadm.conf) | |
127 | echo "DEVICE partitions" >> "$DESTDIR/etc/mdadm.conf" | |
128 | dev_list_extra="" | |
129 | else | |
130 | for ex_dev in $dev_list_extra; do | |
131 | echo "DEVICE $ex_dev" >> "$DESTDIR/etc/mdadm.conf" | |
132 | done | |
133 | fi | |
684d5d2a ER |
134 | |
135 | local cr_rootdev cr_dev_list do_md0=1 nr cr_dev_list_md f cr_md_conf | |
d7f133d3 ER |
136 | for nr in `seq 1 $rootdev_nr`; do |
137 | eval cr_rootdev="\$rootdev${nr}" | |
138 | eval cr_dev_list="\$dev_list${nr}" | |
139 | debug echo "Setting up array ($cr_rootdev = $cr_dev_list)" | |
140 | ||
141 | [ "$cr_rootdev" = "/dev/md0" ] && do_md0=0 | |
142 | ||
143 | echo "DEVICE $cr_dev_list" >> "$DESTDIR/etc/mdadm.conf" | |
144 | cr_dev_list_md="$(echo "$cr_dev_list" | xargs | awk ' { gsub(/ +/,",",$0); print $0; }')" | |
145 | cr_md_conf=$(/sbin/mdadm --detail --brief --config=/etc/mdadm.conf $cr_rootdev | awk ' { gsub(/spares=[0-9]+/, "", $0); print $0; }') | |
146 | if [ -n "$cr_md_conf" ]; then | |
147 | echo "$cr_md_conf" >> "$DESTDIR/etc/mdadm.conf" | |
148 | else | |
149 | echo "ARRAY $cr_rootdev devices=$cr_dev_list_md" >> "$DESTDIR/etc/mdadm.conf" | |
150 | fi | |
151 | ||
152 | for f in $cr_dev_list $cr_rootdev $dev_list_extra; do | |
153 | # mkdir in case of devfs name | |
154 | inst_d $(dirname $f) | |
155 | [ -e "$DESTDIR/$f" ] && continue | |
156 | # this works fine with and without devfs | |
157 | inst $f $f | |
158 | done | |
159 | done | |
160 | ||
161 | echo "mdassemble" | add_linuxrc | |
162 | ||
163 | # needed to determine md-version | |
164 | if [ "$do_md0" -eq 1 ]; then | |
165 | mknod $DESTDIR/dev/md0 b 9 0 | |
166 | fi | |
167 | } |