Skip to content

DM-Multipath Configuration

This guide covers configuring Linux Device-Mapper Multipathing (multipathd) for redundant SAN paths, automatic failover, and I/O load balancing across dual-controller iSCSI storage arrays.

Terminal window
# Install multipath-tools
apt-get install -y multipath-tools
# Load kernel modules
modprobe dm-multipath
modprobe dm-round-robin
modprobe dm-service-time
# Start multipathd
systemctl enable --now multipathd
Terminal window
# Create multipath configuration
cat > /etc/multipath.conf <<EOF
defaults {
user_friendly_names yes
find_multipaths smart
path_checker tur
path_grouping_policy group_by_prio
prio alua
failback immediate
no_path_retry queue
}
blacklist {
devnode "^sd[a-z]"
devnode "^hd[a-z]"
devnode "^cciss.*"
}
devices {
device {
vendor "LIO-ORG"
product "*"
path_checker tur
hardware_handler "1 alua"
path_grouping_policy group_by_prio
prio alua
failback immediate
no_path_retry 10
}
}
EOF
# Restart multipathd
systemctl restart multipathd
Terminal window
# On iSCSI target (LIO)
targetcli /iscsi/iqn.2024-01.hu.pilab:iscsiman.target-01/tpg1 set attribute alua_support=1
# Create ALUA group
targetcli /iscsi/iqn.2024-01.hu.pilab:iscsiman.target-01/tpg1/alua create name=default_alua
# Set ALUA state
targetcli /iscsi/iqn.2024-01.hu.pilab:iscsiman.target-01/tpg1/alua/default_alua set alua_access_state=0
Terminal window
# multipath.conf
devices {
device {
vendor "LIO-ORG"
product "*"
hardware_handler "1 alua"
prio alua
path_grouping_policy group_by_prio
}
}
Terminal window
# multipath.conf
defaults {
path_grouping_policy multibus
path_selector "round-robin 0"
rr_min_io_rq 100
}
Terminal window
# multipath.conf
defaults {
path_grouping_policy group_by_prio
path_selector "service-time 0"
}
Terminal window
# multipath.conf
defaults {
path_grouping_policy group_by_prio
path_selector "queue-length 0"
}
Terminal window
# multipath.conf
defaults {
failback immediate
}
Terminal window
# multipath.conf
defaults {
failback manual
}
Terminal window
# multipath.conf
defaults {
failback 30 # 30 second delay
}
Terminal window
# multipath.conf
defaults {
path_checker tur
}
Terminal window
# multipath.conf
defaults {
path_checker directio
}
Terminal window
# multipath.conf
defaults {
path_checker readsector0
}
Terminal window
# List multipath devices
multipath -ll
# Output example:
# mpatha (360050764008181c60000000000000001) dm-0 LIO-ORG,iscsiman.target-01
# size=100G features='0' hwhandler='1 alua' wp=rw
# |-+- policy='service-time 0' prio=50 status=active
# | `- 6:0:0:0 sdb 8:16 active ready running
# `-+- policy='service-time 0' prio=10 status=enabled
# `- 7:0:0:0 sdc 8:32 active ready running
Terminal window
# Check path status
multipath -l | grep -A10 "mpatha"
# Check individual paths
multipathd show paths
Terminal window
# Check I/O stats
iostat -x /dev/dm-0 1
# Check throughput
fio --name=multipath-test --ioengine=libaio --iodepth=16 \
--rw=randread --bs=4k --direct=1 --size=1G \
--filename=/dev/dm-0
Terminal window
# Check iscsi sessions
iscsiadm -m session -P3
# Check multipathd status
systemctl status multipathd
# Check multipathd logs
journalctl -u multipathd -f
# Reconfigure multipath
multipathd reconfigure
Terminal window
# Check path status
multipath -ll | grep failed
# Check path checker
multipathd show paths | grep failed
# Check logs
journalctl -u multipathd -f | grep -i fail
Terminal window
# Check path priorities
multipathd show paths
# Check path grouping
multipath -l | grep "policy="
# Check I/O scheduler
cat /sys/block/dm-0/queue/scheduler

Always use ALUA for optimal path selection:

Terminal window
# multipath.conf
devices {
device {
hardware_handler "1 alua"
prio alua
}
}

Configure appropriate failover policy:

Terminal window
# multipath.conf
defaults {
failback immediate
no_path_retry queue
}

Regularly monitor path status:

Terminal window
# Check path status
multipath -ll
# Set up monitoring
echo "*/5 * * * * root multipath -ll | grep failed" >> /etc/crontab

Regularly test failover scenarios:

Terminal window
# Disable path
echo offline > /sys/block/sdb/device/state
# Check multipath
multipath -ll
# Re-enable path
echo running > /sys/block/sdb/device/state