]> git.pld-linux.org Git - projects/geninitrd.git/blob - mod-md.sh
- drop USERAIDSTART (autodetected)
[projects/geninitrd.git] / mod-md.sh
1 #!/bin/sh
2 #
3 # geninitrd mod: mdadm
4
5 # if we should init md (softraid) at boot
6 have_md=no
7
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
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
120         inst_exec $mdassemble /bin/mdassemble
121
122         # LVM on RAID case
123         local dev_list_extra ex_dev
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
134
135         local cr_rootdev cr_dev_list do_md0=1 nr cr_dev_list_md f cr_md_conf
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 }
This page took 0.066024 seconds and 4 git commands to generate.