]> git.ipfire.org Git - thirdparty/dracut.git/blob - modules.d/90mdraid/parse-md.sh
docs: update NEWS.md and AUTHORS
[thirdparty/dracut.git] / modules.d / 90mdraid / parse-md.sh
1 #!/bin/sh
2 # we really need to use `expr substr` with dash
3 # shellcheck disable=SC2003
4
5 MD_UUID=$(getargs rd.md.uuid -d rd_MD_UUID=)
6 # normalize the uuid
7 MD_UUID=$(str_replace "$MD_UUID" "-" "")
8 MD_UUID=$(str_replace "$MD_UUID" ":" "")
9
10 if { [ -z "$MD_UUID" ] && ! getargbool 0 rd.auto; } || ! getargbool 1 rd.md -d -n rd_NO_MD; then
11 info "rd.md=0: removing MD RAID activation"
12 udevproperty rd_NO_MD=1
13 else
14 # rewrite the md rules to only process the specified raid array
15 if [ -n "$MD_UUID" ]; then
16 for f in /etc/udev/rules.d/65-md-incremental*.rules; do
17 [ -e "$f" ] || continue
18 while read -r line || [ -n "$line" ]; do
19 if [ "${line%%UUID CHECK}" != "$line" ]; then
20 for uuid in $MD_UUID; do
21 printf 'ENV{ID_FS_UUID}=="%s", GOTO="md_uuid_ok"\n' "$(expr substr "$uuid" 1 8)-$(expr substr "$uuid" 9 4)-$(expr substr "$uuid" 13 4)-$(expr substr "$uuid" 17 4)-$(expr substr "$uuid" 21 12)"
22 done
23 # shellcheck disable=SC2016
24 printf 'IMPORT{program}="/sbin/mdadm --examine --export $tempnode"\n'
25 for uuid in $MD_UUID; do
26 printf 'ENV{MD_UUID}=="%s", GOTO="md_uuid_ok"\n' "$(expr substr "$uuid" 1 8):$(expr substr "$uuid" 9 8):$(expr substr "$uuid" 17 8):$(expr substr "$uuid" 25 8)"
27 done
28 printf 'GOTO="md_end"\n'
29 printf 'LABEL="md_uuid_ok"\n'
30 else
31 echo "$line"
32 fi
33 done < "${f}" > "${f}.new"
34 mv "${f}.new" "$f"
35 done
36 for uuid in $MD_UUID; do
37 uuid="$(expr substr "$uuid" 1 8):$(expr substr "$uuid" 9 8):$(expr substr "$uuid" 17 8):$(expr substr "$uuid" 25 8)"
38 wait_for_dev "/dev/disk/by-id/md-uuid-${uuid}"
39 done
40 fi
41 fi
42
43 if [ -e /etc/mdadm.conf ] && getargbool 1 rd.md.conf -d -n rd_NO_MDADMCONF; then
44 udevproperty rd_MDADMCONF=1
45 rm -f -- "$hookdir"/pre-pivot/*mdraid-cleanup.sh
46 fi
47
48 if ! getargbool 1 rd.md.conf -d -n rd_NO_MDADMCONF; then
49 rm -f -- /etc/mdadm/mdadm.conf /etc/mdadm.conf
50 ln -s "$(command -v mdraid-cleanup)" "$hookdir"/pre-pivot/31-mdraid-cleanup.sh 2> /dev/null
51 fi
52
53 # noiswmd nodmraid for anaconda / rc.sysinit compatibility
54 # note nodmraid really means nobiosraid, so we don't want MDIMSM then either
55 if ! getargbool 1 rd.md.imsm -d -n rd_NO_MDIMSM -n noiswmd -n nodmraid; then
56 info "no MD RAID for imsm/isw raids"
57 udevproperty rd_NO_MDIMSM=1
58 fi
59
60 # same thing with ddf containers
61 if ! getargbool 1 rd.md.ddf -n rd_NO_MDDDF -n noddfmd -n nodmraid; then
62 info "no MD RAID for SNIA ddf raids"
63 udevproperty rd_NO_MDDDF=1
64 fi