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