#!/bin/bash
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
# ex: ts=8 sw=4 sts=4 et filetype=sh
check( ) {
local _rootdev
# No mdadm? No mdraid support.
type -P mdadm >/dev/null || return 1
check_mdraid( ) {
local dev = $1 fs = $2 holder DEVPATH MD_UUID
[ [ " $fs " = " ${ fs %%_raid_member } " ] ] && return 1
MD_UUID = $( /sbin/mdadm --examine --export $dev \
| while read line; do
[ [ ${ line #MD_UUID } = $line ] ] && continue
eval " $line "
echo $MD_UUID
break
done )
[ [ ${ MD_UUID } ] ] || return 1
if ! [ [ $kernel_only ] ] ; then
echo " rd.md.uuid= ${ MD_UUID } " >> " ${ initdir } /etc/cmdline.d/90mdraid.conf "
fi
return 0
}
[ [ $hostonly ] ] || [ [ $mount_needs ] ] && {
for_each_host_dev_fs check_mdraid || return 1
}
return 0
}
depends( ) {
echo rootfs-block
return 0
}
installkernel( ) {
instmods = drivers/md
}
install( ) {
dracut_install cat
dracut_install -o mdmon
inst $( command -v partx) /sbin/partx
inst $( command -v mdadm) /sbin/mdadm
# XXX: mdmon really needs to run as non-root?
# If so, write only the user it needs in the initrd's /etc/passwd (and maybe /etc/group)
# in a similar fashion to modules.d/95nfs. Do not copy /etc/passwd and /etc/group from
# the system into the initrd.
# dledford has hardware to test this, so he should be able to clean this up.
# inst /etc/passwd
# inst /etc/group
inst_rules 64-md-raid.rules
# remove incremental assembly from stock rules, so they don't shadow
# 65-md-inc*.rules and its fine-grained controls, or cause other problems
# when we explicitly don't want certain components to be incrementally
# assembled
sed -i -r -e '/RUN\+?="[[:alpha:]/]*mdadm[[:blank:]]+(--incremental|-I)[[:blank:]]+(\$env\{DEVNAME\}|\$tempnode)"/d' " ${ initdir } ${ udevdir } /rules.d/64-md-raid.rules "
inst_rules " $moddir /65-md-incremental-imsm.rules "
# guard against pre-3.0 mdadm versions, that can't handle containers
if ! mdadm -Q -e imsm /dev/null & > /dev/null; then
inst_hook pre-trigger 30 " $moddir /md-noimsm.sh "
fi
if ! mdadm -Q -e ddf /dev/null & > /dev/null; then
inst_hook pre-trigger 30 " $moddir /md-noddf.sh "
fi
if [ [ $hostonly ] ] || [ [ $mdadmconf = "yes" ] ] ; then
if [ -f /etc/mdadm.conf ] ; then
inst /etc/mdadm.conf
else
[ -f /etc/mdadm/mdadm.conf ] && inst /etc/mdadm/mdadm.conf /etc/mdadm.conf
fi
fi
inst_hook pre-udev 30 " $moddir /mdmon-pre-udev.sh "
inst_hook pre-trigger 30 " $moddir /parse-md.sh "
inst_hook pre-mount 10 " $moddir /mdraid-waitclean.sh "
inst_hook shutdown 30 " $moddir /md-shutdown.sh "
inst_script " $moddir /mdraid-cleanup.sh " /sbin/mdraid-cleanup
inst_script " $moddir /mdraid_start.sh " /sbin/mdraid_start
}