module-setup.sh000075500000010134151075045550007534 0ustar00#!/usr/bin/bash is_mpath() { local _dev=$1 [ -e /sys/dev/block/"$_dev"/dm/uuid ] || return 1 [[ $(cat /sys/dev/block/"$_dev"/dm/uuid) =~ mpath- ]] && return 0 return 1 } majmin_to_mpath_dev() { local _dev for i in /dev/mapper/*; do [[ $i == /dev/mapper/control ]] && continue _dev=$(get_maj_min "$i") if [ "$_dev" = "$1" ]; then echo "$i" return fi done } # called by dracut check() { [[ $hostonly ]] || [[ $mount_needs ]] && { for_each_host_dev_and_slaves is_mpath || return 255 } # if there's no multipath binary, no go. require_binaries multipath || return 1 require_binaries kpartx || return 1 return 0 } # called by dracut depends() { echo rootfs-block echo dm return 0 } # called by dracut cmdline() { for m in scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm_multipath; do if grep -m 1 -q "$m" /proc/modules; then printf 'rd.driver.pre=%s ' "$m" fi done } # called by dracut installkernel() { local _arch=${DRACUT_ARCH:-$(uname -m)} local _funcs='scsi_register_device_handler|dm_dirty_log_type_register|dm_register_path_selector|dm_register_target' if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then _s390drivers="=drivers/s390/scsi" fi hostonly='' dracut_instmods -o -s "$_funcs" "=drivers/scsi" "=drivers/md" ${_s390drivers:+"$_s390drivers"} } mpathconf_installed() { command -v mpathconf &> /dev/null } # called by dracut install() { local -A _allow local config_dir add_hostonly_mpath_conf() { if is_mpath "$1"; then local _dev _dev=$(majmin_to_mpath_dev "$1") [ -z "$_dev" ] && return _allow["$_dev"]="$_dev" fi } local k v while read -r k v; do if [[ $k == "config_dir" ]]; then v="${v#\"}" config_dir="${v%\"}" break fi done < <(multipath -t 2> /dev/null) [[ -d $config_dir ]] || config_dir=/etc/multipath/conf.d inst_multiple \ "$systemdsystemunitdir"/multipathd.service \ pkill \ pidof \ kpartx \ dmsetup \ multipath \ multipathd inst_multiple -o \ mpath_wait \ mpathconf \ mpathpersist \ xdrgetprio \ xdrgetuid \ /etc/xdrdevices.conf \ /etc/multipath.conf \ /etc/multipath/* \ "$config_dir"/* mpathconf_installed \ && [[ $hostonly ]] && [[ $hostonly_mode == "strict" ]] && { for_each_host_dev_and_slaves_all add_hostonly_mpath_conf if ((${#_allow[@]} > 0)); then local -a _args local _dev for _dev in "${_allow[@]}"; do _args+=("--allow" "$_dev") done mpathconf "${_args[@]}" --outfile "${initdir}"/etc/multipath.conf fi } inst "$(command -v partx)" /sbin/partx inst_libdir_file "libmultipath*" "multipath/*" inst_libdir_file 'libgcc_s.so*' if [[ $hostonly_cmdline ]]; then local _conf _conf=$(cmdline) [[ $_conf ]] && echo "$_conf" >> "${initdir}/etc/cmdline.d/90multipath.conf" fi if dracut_module_included "systemd"; then if mpathconf_installed; then inst_simple "${moddir}/multipathd-configure.service" "${systemdsystemunitdir}/multipathd-configure.service" $SYSTEMCTL -q --root "$initdir" enable multipathd-configure.service fi inst_simple "$moddir/multipathd-dracut.conf" "$systemdsystemunitdir/multipathd.service.d/multipathd-dracut.conf" $SYSTEMCTL -q --root "$initdir" enable multipathd.service else inst_hook pre-trigger 02 "$moddir/multipathd.sh" inst_hook cleanup 02 "$moddir/multipathd-stop.sh" fi inst_hook cleanup 80 "$moddir/multipathd-needshutdown.sh" inst_hook shutdown 20 "$moddir/multipath-shutdown.sh" inst_rules 40-multipath.rules 56-multipath.rules \ 62-multipath.rules 65-multipath.rules \ 66-kpartx.rules 67-kpartx-compat.rules \ 11-dm-mpath.rules 11-dm-parts.rules } multipath-shutdown.sh000075500000000261151075045550010771 0ustar00#!/usr/bin/sh for i in $(multipath -l -v1); do if ! dmsetup table "$i" | sed -n '/.*queue_if_no_path.*/q1'; then dmsetup message "$i" 0 fail_if_no_path fi done multipathd-configure.service000064400000001210151075045550012261 0ustar00[Unit] Description=Device-Mapper Multipath Default Configuration Before=iscsi.service iscsid.service lvm2-activation-early.service Wants=systemd-udev-trigger.service systemd-udev-settle.service local-fs-pre.target After=systemd-udev-trigger.service systemd-udev-settle.service Before=local-fs-pre.target multipathd.service DefaultDependencies=no Conflicts=shutdown.target ConditionKernelCommandLine=rd.multipath=default ConditionPathExists=!/etc/multipath.conf [Service] Type=oneshot ExecStartPre=-/usr/bin/mkdir -p /etc/multipath/multipath.conf.d ExecStart=/usr/sbin/mpathconf --enable --user_friendly_names n [Install] WantedBy=sysinit.target multipathd-needshutdown.sh000075500000000244151075045550011772 0ustar00#!/usr/bin/sh for i in $(multipath -l -v1); do if dmsetup table "$i" | sed -n '/.*queue_if_no_path.*/q1'; then need_shutdown break fi done multipathd-stop.sh000075500000000411151075045550010244 0ustar00#!/usr/bin/sh if [ -e /etc/multipath.conf ]; then pkill multipathd > /dev/null 2>&1 if pidof multipathd > /dev/null 2>&1; then sleep 0.2 fi if pidof multipathd > /dev/null 2>&1; then pkill -9 multipathd > /dev/null 2>&1 fi fi multipathd.service000064400000001421151075045550010306 0ustar00[Unit] Description=Device-Mapper Multipath Device Controller Before=lvm2-activation-early.service Before=local-fs-pre.target blk-availability.service shutdown.target Wants=systemd-udevd-kernel.socket After=systemd-udevd-kernel.socket After=multipathd.socket systemd-remount-fs.service Before=initrd-cleanup.service DefaultDependencies=no Conflicts=shutdown.target Conflicts=initrd-cleanup.service ConditionKernelCommandLine=!nompath ConditionKernelCommandLine=!rd.multipath=0 ConditionKernelCommandLine=!multipath=off ConditionVirtualization=!container [Service] Type=notify NotifyAccess=main ExecStartPre=-/sbin/modprobe dm-multipath ExecStart=/sbin/multipathd -d -s ExecReload=/sbin/multipathd reconfigure TasksMax=infinity [Install] WantedBy=sysinit.target Also=multipathd.socket multipathd.sh000075500000000623151075045550007266 0ustar00#!/usr/bin/sh if [ "$(getarg rd.multipath)" = "default" ] && [ ! -e /etc/multipath.conf ]; then mkdir -p /etc/multipath/multipath.conf.d mpathconf --enable --user_friendly_names n fi if getargbool 1 rd.multipath && [ -e /etc/multipath.conf ]; then modprobe dm-multipath multipathd -B || multipathd need_shutdown else rm -- /etc/udev/rules.d/??-multipath.rules 2> /dev/null fi multipathd-dracut.conf000064400000000062151075045550011053 0ustar00[Unit] ConditionKernelCommandLine=!rd.multipath=0