summaryrefslogtreecommitdiffstats
path: root/modules.d/90multipath
diff options
context:
space:
mode:
Diffstat (limited to 'modules.d/90multipath')
-rwxr-xr-xmodules.d/90multipath/module-setup.sh154
-rwxr-xr-xmodules.d/90multipath/multipath-shutdown.sh7
-rw-r--r--modules.d/90multipath/multipathd-configure.service21
-rwxr-xr-xmodules.d/90multipath/multipathd-needshutdown.sh10
-rwxr-xr-xmodules.d/90multipath/multipathd-stop.sh15
-rw-r--r--modules.d/90multipath/multipathd.service27
-rwxr-xr-xmodules.d/90multipath/multipathd.sh17
7 files changed, 251 insertions, 0 deletions
diff --git a/modules.d/90multipath/module-setup.sh b/modules.d/90multipath/module-setup.sh
new file mode 100755
index 0000000..9c3e629
--- /dev/null
+++ b/modules.d/90multipath/module-setup.sh
@@ -0,0 +1,154 @@
+#!/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 \
+ pkill \
+ kpartx \
+ dmsetup \
+ multipath \
+ multipathd
+
+ inst_multiple -o \
+ mpath_wait \
+ mpathconf \
+ mpathpersist \
+ xdrgetprio \
+ xdrgetuid \
+ /etc/xdrdevices.conf \
+ /etc/multipath.conf \
+ /etc/multipath/* \
+ "$config_dir"/* \
+ "$tmpfilesdir/multipath.conf"
+
+ 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.service" "${systemdsystemunitdir}/multipathd.service"
+ $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
+}
diff --git a/modules.d/90multipath/multipath-shutdown.sh b/modules.d/90multipath/multipath-shutdown.sh
new file mode 100755
index 0000000..220da8f
--- /dev/null
+++ b/modules.d/90multipath/multipath-shutdown.sh
@@ -0,0 +1,7 @@
+#!/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
diff --git a/modules.d/90multipath/multipathd-configure.service b/modules.d/90multipath/multipathd-configure.service
new file mode 100644
index 0000000..a2baec7
--- /dev/null
+++ b/modules.d/90multipath/multipathd-configure.service
@@ -0,0 +1,21 @@
+[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
+RemainAfterExit=yes
+# mpathconf requires /etc/multipath to already exist
+ExecStartPre=-/usr/bin/mkdir -p /etc/multipath
+ExecStart=/usr/sbin/mpathconf --enable
+
+[Install]
+WantedBy=sysinit.target
diff --git a/modules.d/90multipath/multipathd-needshutdown.sh b/modules.d/90multipath/multipathd-needshutdown.sh
new file mode 100755
index 0000000..6dc68bb
--- /dev/null
+++ b/modules.d/90multipath/multipathd-needshutdown.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+type need_shutdown > /dev/null 2>&1 || . /lib/dracut-lib.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
diff --git a/modules.d/90multipath/multipathd-stop.sh b/modules.d/90multipath/multipathd-stop.sh
new file mode 100755
index 0000000..05181b4
--- /dev/null
+++ b/modules.d/90multipath/multipathd-stop.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+type pidof > /dev/null 2>&1 || . /lib/dracut-lib.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
diff --git a/modules.d/90multipath/multipathd.service b/modules.d/90multipath/multipathd.service
new file mode 100644
index 0000000..1680cdf
--- /dev/null
+++ b/modules.d/90multipath/multipathd.service
@@ -0,0 +1,27 @@
+[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=!rd_NO_MULTIPATH
+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
diff --git a/modules.d/90multipath/multipathd.sh b/modules.d/90multipath/multipathd.sh
new file mode 100755
index 0000000..1e26c1d
--- /dev/null
+++ b/modules.d/90multipath/multipathd.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+type getarg > /dev/null 2>&1 || . /lib/dracut-lib.sh
+
+if [ "$(getarg rd.multipath)" = "default" ] && [ ! -e /etc/multipath.conf ]; then
+ # mpathconf requires /etc/multipath to already exist
+ mkdir -p /etc/multipath
+ mpathconf --enable
+fi
+
+if getargbool 1 rd.multipath -d -n rd_NO_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