はじめに
Linuxサーバを運用していると、ストレージ障害対策や可用性向上のために「Multipath(マルチパス)」という技術を扱う場面があります。特にSANストレージ環境では、サーバとストレージの間に複数の経路(パス)を持たせることで、NIC障害やケーブル断などが発生してもI/Oを継続できる構成が一般的です。
しかし、実際にMultipathを学ぼうとすると、
- なぜ同じディスクが複数見えるのか
- dm-multipathとは何なのか
- Device Mapperとどう関係しているのか
- multipathdは何をしているのか
といった点で混乱しやすい技術でもあります。
そこで本記事では、VirtualBox + AlmaLinux環境を使い、iSCSIベースのMultipath環境を構築しながら仕組みを理解していきます。
本記事で扱う内容は以下です。
- iSCSI
- Device Mapper Multipath
- multipathd
- WWID
- フェイルオーバ
- LVM連携
実機SAN環境ではありませんが、Multipathの基本動作やフェイルオーバ検証は十分に学習可能です。
Multipathとは
Multipathとは、ひとつLUN(※)に対して複数の通信経路(パス)を持たせる仕組みです。
通常、OSはストレージへ単一経路でアクセスします。しかし単一路線構成では、以下のような障害が発生するとストレージアクセス不能になります。
- NIC障害
- ケーブル断
- SANスイッチ障害
- HBA障害
そこで、あらかじめ複数経路を構成しておき、障害時に別経路へ自動切り替えすることで可用性を向上させます。また、環境によっては負荷分散を行い、I/O性能向上に利用されることもあります。
※LUNとはLogical Unit Numberの略で、iSCSIやSANで公開する論理ディスクの番号です。ストレージ側で切り出した “仮想ディスク”を示しています。
Multipathが必要な理由
単一障害点の排除
ストレージ接続はシステムの生命線です。例えばDBサーバでは、ストレージアクセス不能は即サービス停止につながります。Multipathを構成することで、片系障害時でもI/O継続が可能になります。
デバイス名の安定化
Linuxではディスク認識順によって /dev/sdX 名が変化します。
例えば、
- reboot後に /dev/sdb が /dev/sdc になる
- iSCSI再接続で順番が変わる
といったことが発生します。
MultipathではWWID(World Wide Identifier)を使ってLUNを一意識別するため、安定したデバイス管理が可能になります。
WWIDはストレージ装置がLUNごとに発行する世界的に一意な識別子です。Linuxは複数のパスが同じWWIDを持っていることを確認することで、「これは同じLUNへの別経路である」と判断します。
※似たようなIDとしてUUIDがありますので、違いを理解しておきましょう。
| 項目 | WWID | UUID |
|---|---|---|
| 説明 | LUN(ディスク)を識別するID | ファイルシステムを識別するID |
| 発行元 | ストレージ装置 | mkfs |
| Multipathで使用 | ○ | × |
| mountで使用 | △ | ○ |
(補足)WWID確認方法
multipath -ll コマンドでWWIDを確認することができます。以下の例だと “3600140590ebee7c1e41493fa3ef302a3” がWWIDに相当します。
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=enabled
| `- 4:0:0:0 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=50 status=active
`- 5:0:0:0 sdc 8:32 active ready running
[root@initiator ~]#以下とおり、/dev/disk/by-id 配下のデバイス名にもWWIDが記載されています。
[root@initiator ~]# ls -l /dev/disk/by-id
~~Truncated~~
lrwxrwxrwx. 1 root root 10 May 30 09:02 dm-uuid-mpath-3600140590ebee7c1e41493fa3ef302a3 -> ../../dm-2
~~Truncated~~
lrwxrwxrwx. 1 root root 10 May 30 09:02 scsi-3600140590ebee7c1e41493fa3ef302a3 -> ../../dm-2
※ /dev/disk/by-id は、udevが生成する永続的なデバイス名(Persistent Device Naming) を格納するディレクトリです。Linuxでは /dev/sda や /dev/sdb のようなデバイス名は起動順や認識順によって変化する可能性があります。そのため、デバイス固有の識別情報を使って安定的にアクセスできるようにしたものが /dev/disk/by-id です。
Multipathの構成案
今回の検証に用いた構成は以下のとおりです。

この構成では、同じLUNに対して2つのiSCSIパスを持たせています。Linuxから見ると、一時的には複数の /dev/sdX デバイスとして認識されます。例えば /dev/sdc、/dev/sddのような形でパスは2つ存在しますが、実際には同一のLUNといった構成です。
そこでMultipathがこれらを統合し、単一デバイス /dev/mapper/mpathaとして扱えるようにします。
LinuxにおけるMultipathの仕組み
続いてLinuxにおけるMultipathの仕組みを説明していきます。Device Mapperおよびmultipathdという機能を理解する必要がありますのでそれぞれ説明していきます。
Device Mapperとは
Multipathを理解するうえで重要なのがDevice Mapperです。Device Mapperは、Linuxカーネルが提供する仮想ブロックデバイス機能です。
Multipathでは、複数の物理パスをDevice Mapperが1つの仮想デバイスへ統合します。つまり、「MultipathはDevice Mapper技術の一種」と理解することができます。
なお、Device Mapperは、Multipath以外にもLVMやdm-cryptなどを適用する際に使用される機能となります。
multipathdの役割
multipathdはMultipath管理デーモンです。主な役割は以下となります。
- パス監視
- 障害検知
- 自動フェイルオーバ
- パス復旧監視
例えば片系NIC断が発生した場合、multipathdが障害を検知して正常パスへI/Oを切り替えます。
multipathd確認コマンド
multipathdの状態、設定を確認するコマンドを記載します。
multipath -ll
Multipathデバイスの構成と各パスの状態を確認するための最も基本的なコマンドです。
Multipath環境で障害調査を行う際には、まずこのコマンドを実行することが一般的です。WWID、Device Mapperデバイス名、パス選択ポリシー、ALUA優先度、各パスの状態などをまとめて確認できます。
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=enabled
| `- 4:0:0:0 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=50 status=active
`- 5:0:0:0 sdc 8:32 active ready runningmultipathd show paths
Multipathが管理している各パスの状態を一覧表示するコマンドです。
[root@initiator ~]# multipathd show paths
hcil dev dev_t pri dm_st chk_st dev_st next_check
4:0:0:0 sdd 8:48 50 active ready running XXXXXXXX.. 17/20
5:0:0:0 sdc 8:32 50 active ready running XXXXXXXX.. 16/20
[root@initiator ~]#multipathd show maps
Multipathデバイス(Map)の一覧を表示するコマンドです。
multipath -ll が詳細表示なのに対し、こちらは管理対象のMultipathデバイスをコンパクトに確認する用途で利用します。
[root@initiator ~]# multipathd show maps
name sysfs uuid
mpatha dm-2 3600140590ebee7c1e41493fa3ef302a3
[root@initiator ~]#検証環境構築
それでは実際に、multipath構成においてフェイルオーバの検証を実施してみましょう。
検証構成
今回はVirtualBox上で検証を行います。検証構成は以下の通りです。

VM1:iSCSI Target
- AlmaLinux 9
- targetcli
VM2:Multipath Client
- AlmaLinux 9
- multipath-tools
- iSCSI Initiator
ネットワーク構成
NICを2系統構成し、それぞれ別NICとして通信します。
- 192.168.56.0/24
- 192.168.57.0/24
VirtualBoxを使っている場合は、以下の通りHost-only Adapterを設定してください。


続いて、サーバにログインしてIPアドレスを設定します。
[root@initiator ~]# nmcli con show
NAME UUID TYPE DEVICE
enp0s3 c8fb44c7-1e7a-3bf5-91ef-fe414b5bc76f ethernet enp0s3
Wired connection 1 4760f7f7-912e-3523-b8c9-a4e99cb6748b ethernet enp0s8
Wired connection 2 558557fa-9541-39f5-945f-80ab6c945573 ethernet enp0s9
lo 2e8c7106-76dc-46c5-b9fb-34fe7d03b464 loopback lo
[root@initiator ~]#
[root@initiator ~]# nmcli con mod "Wired connection 2" ipv4.addresses 192.168.57.101/24
[root@initiator ~]# nmcli con mod "Wired connection 2" ipv4.method manual
[root@initiator ~]# nmcli con down "Wired connection 2"
Connection 'Wired connection 1' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/12)
[root@initiator ~]# nmcli con up "Wired connection 2"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13
[root@initiator ~]#
[root@initiator ~]# ip a
~~Truncated~~
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:a0:6a:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.57.101/24 brd 192.168.57.255 scope global noprefixroute enp0s9
valid_lft forever preferred_lft forever
inet6 fe80::1431:a3a4:3d06:ea3d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@initiator ~]#検証構成図の通り、他のインターフェースについてもIPアドレスを設定してください。
パッケージインストール
・Target側
[root@target ~]# dnf install targetcli -y
Last metadata expiration check: 0:04:40 ago on Fri May 29 17:27:35 2026.
Dependencies resolved.
=============================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================
Installing:
targetcli noarch 2.1.57-3.el9 appstream 69 k
Installing dependencies:
python3-configshell noarch 1:1.1.30-1.el9 baseos 64 k
python3-kmod x86_64 0.9-32.el9 baseos 81 k
python3-pyparsing noarch 2.4.7-9.el9 baseos 149 k
python3-pyudev noarch 0.22.0-6.el9 baseos 76 k
python3-rtslib noarch 2.1.76-1.el9 appstream 89 k
python3-urwid x86_64 2.1.2-4.el9 baseos 768 k
target-restore noarch 2.1.76-1.el9 appstream 13 k
Transaction Summary
=============================================================================================================================
Install 8 Packages
Total download size: 1.3 M
Installed size: 5.3 M
Downloading Packages 533 kB/s | 89 kB 00:00
~~Truncated^~
8/8
Installed:
python3-configshell-1:1.1.30-1.el9.noarch python3-kmod-0.9-32.el9.x86_64 python3-pyparsing-2.4.7-9.el9.noarch
python3-pyudev-0.22.0-6.el9.noarch python3-rtslib-2.1.76-1.el9.noarch python3-urwid-2.1.2-4.el9.x86_64
target-restore-2.1.76-1.el9.noarch targetcli-2.1.57-3.el9.noarch
Complete!
[root@target ~]#・Initiator側
[root@target ~]# dnf install iscsi-initiator-utils device-mapper-multipath -y
~~Truncated~~
AlmaLinux 9 - AppStream 4.3 MB/s | 10 MB 00:02
AlmaLinux 9 - BaseOS 1.9 MB/s | 2.8 MB 00:01
AlmaLinux 9 - Extras 26 kB/s | 22 kB 00:00
Extra Packages for Enterprise Linux 9 - x86_64 7.4 MB/s | 21 MB 00:02
Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 1.6 kB/s | 2.5 kB 00:01
Dependencies resolved.
=============================================================================================================================
Package Architecture Version Repository Size
=============================================================================================================================
Installing:
device-mapper-multipath x86_64 0.8.7-45.el9 baseos 153 k
iscsi-initiator-utils x86_64 6.2.1.11-0.git4b3e853.el9 baseos 384 k
Upgrading:
kpartx x86_64 0.8.7-45.el9 baseos 49 k
Installing dependencies:
device-mapper-multipath-libs x86_64 0.8.7-45.el9 baseos 274 k
iscsi-initiator-utils-iscsiuio x86_64 6.2.1.11-0.git4b3e853.el9 baseos 80 k
isns-utils-libs x86_64 0.101-4.el9 baseos 99 k
Transaction Summary
=============================================================================================================================
Install 5 Packages
Upgrade 1 Package
Total download size: 1.0 M
Downloading Packages:
(1/6): device-mapper-multipath-0.8.7-45.el9.x86_64.rpm 909 kB/s | 153 kB 00:00
(2/6): device-mapper-multipath-libs-0.8.7-45.el9.x86_64.rpm 1.3 MB/s | 274 kB 00:00
(3/6): iscsi-initiator-utils-6.2.1.11-0.git4b3e853.el9.x86_64.rpm 1.7 MB/s | 384 kB 00:00
(4/6): iscsi-initiator-utils-iscsiuio-6.2.1.11-0.git4b3e853.el9.x86_64.rpm 1.3 MB/s | 80 kB 00:00
(5/6): isns-utils-libs-0.101-4.el9.x86_64.rpm 2.1 MB/s | 99 kB 00:00
(6/6): kpartx-0.8.7-45.el9.x86_64.rpm 1.4 MB/s | 49 kB 00:00
-----------------------------------------------------------------------------------------------------------------------------
Total 1.1 MB/s | 1.0 MB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Upgrading : kpartx-0.8.7-45.el9.x86_64 1/7
~~Truncated~~
Verifying : isns-utils-libs-0.101-4.el9.x86_64 5/7
Verifying : kpartx-0.8.7-45.el9.x86_64 6/7
Verifying : kpartx-0.8.7-35.el9.x86_64 7/7
Upgraded:
kpartx-0.8.7-45.el9.x86_64
Installed:
device-mapper-multipath-0.8.7-45.el9.x86_64 device-mapper-multipath-libs-0.8.7-45.el9.x86_64
iscsi-initiator-utils-6.2.1.11-0.git4b3e853.el9.x86_64 iscsi-initiator-utils-iscsiuio-6.2.1.11-0.git4b3e853.el9.x86_64
isns-utils-libs-0.101-4.el9.x86_64
Complete!
[root@target ~]#iSCSI Target構築
つづいて、iSCSI Targetを構築していきます。
targetcli起動
Target側の環境にてtargetcliを起動します。
[root@target ~]# systemctl enable --now target
Created symlink /etc/systemd/system/multi-user.target.wants/target.service → /usr/lib/systemd/system/target.service.
[root@target ~]#
[root@target ~]# systemctl status target
● target.service - Restore LIO kernel target configuration
Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; preset: disabled)
Active: active (exited) since Fri 2026-05-29 17:33:41 JST; 8s ago
Process: 23362 ExecStart=/usr/bin/targetctl restore (code=exited, status=0/SUCCESS)
Main PID: 23362 (code=exited, status=0/SUCCESS)
CPU: 104ms
May 29 17:33:40 target systemd[1]: Starting Restore LIO kernel target configuration...
May 29 17:33:41 target target[23362]: No saved config file at /etc/target/saveconfig.json, ok, exiting
May 29 17:33:41 target systemd[1]: Finished Restore LIO kernel target configuration.
[root@target ~]#
バックストア・LUN作成
検証用バックストアを作成します。バックストアとは、iSCSI Targetがクライアントへ公開するストレージの実体となります。どのストレージをLUNとして見せるかを定義します。
まず、iSCSIで公開するための仮想ディスクを作成します。
[root@target ~]# mkdir -p /iscsi_disks
[root@target ~]# dd if=/dev/zero of=/iscsi_disks/disk01.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.60148 s, 233 MB/s
[root@target ~]#
[root@target ~]# ll /iscsi_disks/disk01.img
-rw-r--r-- 1 root root 1073741824 May 29 17:26 /iscsi_disks/disk01.img
[root@target ~]#続いて、バックストアを作成していきます。
まず、targetcliを起動します。
[root@target ~]# targetcli
targetcli shell version 2.1.57
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/>続いて、iscsiターゲットを作成します。
/> /iscsi create iqn.2026-05.local.lab:storage.disk01
Created target iqn.2026-05.local.lab:storage.disk01.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/>デフォルトでは、iSCSI Targetが待ち受けるIPアドレス(Portal)が全NICとなっているので、特定NICからの待ち受けに変更します。
/> /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/portals delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/>
/> /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/portals create 192.168.56.102
Using default IP port 3260
Created network portal 192.168.56.102:3260.
/>
/> /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/portals create 192.168.57.102
Using default IP port 3260
Created network portal 192.168.57.102:3260.
/>バックストアを作成しただけでは、iSCSIクライアントから利用することはできません。luns create コマンドを実行することで、バックストアをLUNとしてTargetへ割り当てます。これにより、InitiatorはLUN0として認識し、iSCSI経由でストレージへアクセスできるようになります。
/> /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/luns create /backstores/fileio/disk01
Created LUN 0.
/>最後に、iSCSI Targetに接続できるクライアントを限定する設定を追加します。
その前に、Initiator側でIQN(iSCSI Qualified Name:iSCSIの世界で使われる一意な識別名)を確認してください。
[root@initiator ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:af1f40d2c093
[root@initiator ~]#ここで確認したIQNを指定してTarget側でACLを設定することで、接続できるクライアントを制限することができます。
/> /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/acls create iqn.1994-05.com.redhat:af1f40d2c093
Created Node ACL for iqn.1994-05.com.redhat:af1f40d2c093
Created mapped LUN 0.
/>Target側の設定は以上となります。最後に作成した設定を ls コマンドで確認してください。以下の通りとなっていれば正しく設定ができています。
/> ls /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1
o- tpg1 ........................................... [no-gen-acls, no-auth]
o- acls ...................................................... [ACLs: 1]
| o- iqn.1994-05.com.redhat:af1f40d2c093 .............. [Mapped LUNs: 1]
| o- mapped_lun0 ........................... [lun0 fileio/disk01 (rw)]
o- luns ...................................................... [LUNs: 1]
| o- lun0 . [fileio/disk01 (/iscsi_disks/disk01.img) (default_tg_pt_gp)]
o- portals ................................................ [Portals: 2]
o- 192.168.56.102:3260 .......................................... [OK]
o- 192.168.57.102:3260 .......................................... [OK]
/>iSCSI Initiator設定
それでは続いて、iSCSI Initiatorの設定を行っていきます。
iscsidサービスの起動
まずiscsidサービスを起動します。iscsidは、iSCSIの接続管理・セッション制御を行う常駐デーモンとなります。
[root@initiator ~]# systemctl enable --now iscsidb
Created symlink /etc/systemd/system/multi-user.target.wants/iscsid.service → /usr/lib/systemd/system/iscsid.service.
[root@initiator ~]# systemctl status iscsid
● iscsid.service - Open-iSCSI
Loaded: loaded (/usr/lib/systemd/system/iscsid.service; enabled; pre>
Active: active (running) since Sat 2026-05-30 07:38:46 JST; 7s ago
TriggeredBy: ○ iscsid.socket
Docs: man:iscsid(8)
man:iscsiuio(8)
man:iscsiadm(8)
Main PID: 25876 (iscsid)
Status: "Ready to process requests"
Tasks: 1 (limit: 23120)
Memory: 3.9M (peak: 3.9M)
CPU: 25ms
CGroup: /system.slice/iscsid.service
└─25876 /usr/sbin/iscsid -f
May 30 07:38:46 initiator systemd[1]: Starting Open-iSCSI...
May 30 07:38:46 initiator systemd[1]: Started Open-iSCSI.iSCSI Targetにログイン
続いて、discoveryコマンドを実行することで接続できる iSCSI Target を問合わせます。
以下の通り、同一のiSCSI Target(同一IQN)に対して、2つのPortal(通信経路)が登録されていることが確認できます。
[root@initiator ~]# iscsiadm -m discovery -t sendtargets -p 192.168.56.102
192.168.56.102:3260,1 iqn.2026-05.local.lab:storage.disk01
192.168.57.102:3260,1 iqn.2026-05.local.lab:storage.disk01
[root@initiator ~]#discoveryで見つけて登録済みのiSCSI Targetへログインします。ログインすることでSCSIデバイスが生成されます。
[root@initiator ~]# iscsiadm -m node --login
Login to [iface: default, target: iqn.2026-05.local.lab:storage.disk01, portal: 192.168.56.102,3260] successful.
Login to [iface: default, target: iqn.2026-05.local.lab:storage.disk01, portal: 192.168.57.102,3260] successful.
[root@initiator ~]#lsblkコマンドでSCSIデバイスファイルが作成されていることを確認します。以下の例では、sdc、sddが追加されていることが確認できました。まだmultipathの設定を追加していないので、2つのデバイスが見える状況になっています。
[root@initiator ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─almalinux-root 253:0 0 18G 0 lvm /
└─almalinux-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─almalinux-root 253:0 0 18G 0 lvm /
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sr0 11:0 1 1024M 0 rom
[root@initiator ~]#Multipath設定
パッケージ “device-mapper-multipath”によりMultipathを設定していきます。本パッケージがインストールされていないディストリビューションを使っている場合は、以下のコマンドでインストールしてください。
# dnf install device-mapper-multipath -y
設定ファイルを作成して、以下の通り設定を追加します。
[root@initiator ~]# mpathconf --enable
[root@initiator ~]#
[root@initiator ~]# vi /etc/multipath.conf
[root@initiator ~]# cat /etc/multipath.conf
# device-mapper-multipath configuration file
# For a complete list of the default configuration values, run either:
# # multipath -t
# or
# # multipathd show config
# For a list of configuration options with descriptions, see the
# multipath.conf man page.
defaults {
user_friendly_names yes
find_multipaths on
}
blacklist {
devnode "^sda" #Additional Setting
devnode "^sdb" #Additional Setting
}
[root@initiator ~]#・user_friendly_names
yesを設定することで、WWIDではなくmpatha、mpathbのような分かりやすい名前が付きます。
・find_multipaths on
同じWWIDを持つ複数パスが存在していた場合、自動でmultipath化を行う設定です。
・blacklist
Multipath対象から除外するデバイスを指定します。ここでは、OSディスクである sda と sdb を除外しています。blacklistを設定しないと、OSディスクまでmultipath対象になってboot時に障害が発生する可能性があります。
ただし、実運用環境ではデバイス名による除外は推奨されません。Linuxでは起動順や構成変更によって /dev/sdX の名前が変化する可能性があるためです。
商用環境ではWWIDを利用してMultipath対象デバイスを制御することが一般的です。例えば以下のように、特定のWWIDのみをMultipath対象とする構成がよく利用されます。
blacklist_exceptions {
wwid "3600140590ebee7c1e41493fa3ef302a3"
}今回の検証ではVirtualBoxによる構築となっており、WWIDではなくVirtualBox固有IDしか割り当てられていないため、デバイス名による除外設定としております。
ただし、RHEL8以降では find_multipaths on が推奨されており、Multipathとして認識すべきデバイスのみ自動的に管理対象となるため、従来のようにOSディスクをblacklistで除外する構成は減少しています。
ただしストレージベンダー要件や運用ポリシーによってはWWIDベースのblacklist/blacklist_exceptionsを併用する場合もあるので、覚えておいてもらえると良いかと思います。
Multipath有効化
Multipathの設定が終わったら、Multipathを起動します。
[root@initiator ~]# systemctl enable --now multipathd
[root@initiator ~]# systemctl status multipathd
● multipathd.service - Device-Mapper Multipath Device Controller
Loaded: loaded (/usr/lib/systemd/system/multipathd.service; enabled; preset: enabled)
Active: active (running) since Sat 2026-05-30 08:13:28 JST; 12s ago
TriggeredBy: ○ multipathd.socket
Process: 26230 ExecStartPre=/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath (code=exited, status=0/>
Process: 26232 ExecStartPre=/sbin/multipath -A (code=exited, status=0/SUCCESS)
Main PID: 26233 (multipathd)
Status: "up"
Tasks: 8
Memory: 18.8M (peak: 19.2M)
CPU: 247ms
CGroup: /system.slice/multipathd.service
└─26233 /sbin/multipathd -d -s
May 30 08:13:27 initiator systemd[1]: Starting Device-Mapper Multipath Device Controller...
May 30 08:13:27 initiator multipathd[26233]: --------start up--------
May 30 08:13:27 initiator multipathd[26233]: read /etc/multipath.conf
May 30 08:13:28 initiator multipathd[26233]: path checkers start up
May 30 08:13:28 initiator systemd[1]: Started Device-Mapper Multipath Device Controller.
[root@initiator ~]#multipath -v2 コマンドを実行すると、Multipath対象デバイスをスキャンし、必要に応じてMultipathデバイスを生成します。
※multipathd が動作している環境では自動的にデバイスが作成されるため、 必ずしも実行は必須ではありません。
[root@initiator ~]# multipath -v2
[root@initiator ~]# それでは、multipathの設定がうまくいっているかどうかを確認しましょう。multipath -ll コマンドを実行してください。
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 4:0:0:0 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=50 status=enabled
`- 5:0:0:0 sdc 8:32 active ready running
[root@initiator ~]#sdc、sddともに “active ready running” となっていることが確認できています。
status=active となっている sdd 側に現在のI/Oが流れています。status=enabledとなっている sdc 側は待機系となっています。
※今回の検証環境では、active の Path Group が優先利用され、enabled の Path Group は待機状態として扱われています。ただし、ストレージ製品やALUA設定によっては両パスを同時利用するActive/Active構成もありますMultipath側でもPath Policyを変更することで利用パスの選択方法をある程度制御することも可能です。
※ALUA(Asymmetric Logical Unit Access)は、ストレージ装置が各パスの優先度をOSへ通知する仕組みです。MultipathはALUA情報を利用して、最適なパス(Active/Optimized)を優先的に使用し、障害時には他のパスへ自動的に切り替えます
続いて、lsblkコマンドでブロックデバイスの情報を確認します。sdc、sddに対してmpathaというデバイス名が割り当てられていることが確認できます。
[root@initiator ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─almalinux-root 253:0 0 18G 0 lvm /
└─almalinux-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─almalinux-root 253:0 0 18G 0 lvm /
sdc 8:32 0 1G 0 disk
└─mpatha 253:2 0 1G 0 mpath
sdd 8:48 0 1G 0 disk
└─mpatha 253:2 0 1G 0 mpath
sr0 11:0 1 1024M 0 rom
[root@initiator ~]#(参考) LVM連携
multipath化したデバイスをLVMとして実際に使用できるようにするためには、PV作成、PG作成、LV作成、ファイルシステム作成の作業が必要です。参考までにコマンドを記載しておきますので参考にしてください。
[root@initiator ~]# pvcreate /dev/mapper/mpatha
Physical volume "/dev/mapper/mpatha" successfully created.
[root@initiator ~]#
[root@initiator ~]# vgcreate vg_data /dev/mapper/mpatha
Volume group "vg_data" successfully created
[root@initiator ~]#
[root@initiator ~]# lvcreate -n lv_data -l 100%FREE vg_data
Logical volume "lv_data" created.
[root@initiator ~]#
[root@initiator ~]# mkfs.xfs /dev/mapper/vg_data-lv_data
meta-data=/dev/mapper/vg_data-lv_data isize=512 agcount=4, agsize=65024 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1 nrext64=0
data = bsize=4096 blocks=260096, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=16384, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@initiator ~]#
[root@initiator ~]# mkdir /datamkdir /data
[root@initiator ~]#
[root@initiator ~]# mount /dev/vg_data/lv_data /data
[root@initiator ~]#
[root@initiator ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 732M 11M 721M 2% /run
/dev/mapper/almalinux-root 18G 12G 6.2G 66% /
/dev/sda1 960M 339M 622M 36% /boot
tmpfs 366M 0 366M 0% /run/user/0
tmpfs 366M 0 366M 0% /run/user/1000
/dev/mapper/vg_data-lv_data 952M 39M 914M 5% /data
[root@initiator ~]# LVM拡張について詳しく知りたい方は、以下の記事も参考にしてみてください。
Linux LVMディスク拡張を徹底解説|PV・VG・LV拡張からオンライン容量拡張まで
フェイルオーバ検証
検証環境の準備が整ったら、いよいよフェイルオーバの検証を実施してきましょう。
フェイルオーバ
正常時のパス状態確認
まず正常時のパス状態を確認します。両パスが active/ready になっていることを確認します。
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 4:0:0:0 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=50 status=enabled
`- 5:0:0:0 sdc 8:32 active ready running
[root@initiator ~]#I/O継続確認
別ターミナルで書き込みを開始します。フェイルオーバ中、処理が継続することを確認します。
[root@initiator ~]# dd if=/dev/zero of=/mnt/testfile bs=1M count=500
dd if=/dev/zero of=/mnt/testfile bs=1M count=500
NIC停止
Target側でNICを停止します。
[root@target ~]# ip link set enp0s8 downmultipath状態変化の確認
activ eである sdd の状態が、active i/o pending running 変わっています。
[root@initiator ~]#
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=0 status=active
| `- 4:0:0:0 sdd 8:48 active i/o pending running
`-+- policy='service-time 0' prio=50 status=enabled
`- 5:0:0:0 sdc 8:32 active ready runningそのあと sdd の状態が failed faulty running に変わり、sdc の status が enabled から active に変わっていることが確認できました。
[root@initiator ~]#
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| `- 4:0:0:0 sdd 8:48 failed faulty running
`-+- policy='service-time 0' prio=50 status=active
`- 5:0:0:0 sdc 8:32 active ready running
[root@initiator ~]#ログ確認
journal にログが出力されますので確認しましょう。
path 8:48 (/dev/sdd)にアクセスできなくなったことを検知したのち、残りのもう1つのパスでI/Oを継続しているということを意味しています。
[root@initiator ~]# journalctl -u multipathd
~~Truncated~~
May 30 08:51:09 initiator multipathd[26233]: checker failed path 8:48 in map mpatha
May 30 08:51:09 initiator multipathd[26233]: mpatha: remaining active paths: 1復旧
Target側のNICが復旧すると、自動的にマルチパス構成に復旧します。その様子を見てみましょう。
NIC起動
停止したNICを起動してください。
[root@target ~]# ip link set enp0s8 up
[root@target ~]# 復旧確認
一定時間が経過すると、自動でマルチパス構成に復旧されます。
以下の通り、sddの状態が active ready running となっていれば復旧完了です。
[root@initiator ~]# multipath -ll
mpatha (3600140590ebee7c1e41493fa3ef302a3) dm-2 LIO-ORG,disk01
size=1.0G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=enabled
| `- 4:0:0:0 sdd 8:48 active ready running
`-+- policy='service-time 0' prio=50 status=active
`- 5:0:0:0 sdc 8:32 active ready running
[root@initiator ~]# Journalのログを確認します。path is up となっており、sdd が復旧したことを検知しています。
[root@initiator ~]# journalctl -u multipathd
May 30 08:51:09 initiator multipathd[26233]: checker failed path 8:48 in map mpatha
May 30 08:51:09 initiator multipathd[26233]: mpatha: remaining active paths: 1
May 30 08:54:51 initiator multipathd[26233]: mpatha: sdd - tur checker reports path is down
May 30 08:54:57 initiator multipathd[26233]: mpatha: sdd - tur checker reports path is upタイムアウト設計
Multipath のタイムアウト設計において、障害検知時間と業務継続性のバランスが重要です。ストレージやアプリケーション要件に応じた値を設計することを意識してください。
したがってあくまで設定例とはなりますが、/etc/multipath.conf を以下のように設定すると良いでしょう。
defaults {
user_friendly_names yes
find_multipaths on
polling_interval 5
no_path_retry 5
devices {
device {
fast_io_fail_tmo 5
dev_loss_tmo 30
}
}各種パラメータ設定
それぞれのパラメータを説明します。
polling_interval
Multipathが各パスの状態を監視する間隔を指定するパラメータです。Multipathは定期的にパスへ疎通確認を行い、障害の有無を判定します。設定値を小さくすると障害検知は高速になりますが監視負荷が増加し、逆に大きくすると負荷は低減するものの障害検知が遅くなります。一般的な商用環境では5秒程度が採用されることが多く、検知速度と負荷のバランスが取れた設定とされています。
no_path_retry
すべてのパスが利用できなくなった場合に、MultipathがどのくらいI/Oを再試行するかを指定するパラメータです。ここでは5回を指定しているので、5回×5秒 = 約25秒、復旧を待機します。
リトライ回数が多すぎたり、無期限で待機する設定にすると、アプリケーションがハングしたり障害検知が遅れてしまうことがあるので、適切な値を設定することを推奨します。
fast_io_fail_tmo
ストレージパス障害発生後にI/O失敗を通知するまでの時間を指定するパラメータです。設定時間内にパスが復旧しない場合、Multipathは該当パスを利用不可と判断し、残存パスへのフェイルオーバを実施します。一般的な商用環境では5秒程度が採用されることが多く、障害検知速度と誤検知防止のバランスが取れています。
dev_loss_tmo
パス障害発生後にLinuxカーネルがSCSIデバイスを保持する時間を指定するパラメータです。障害発生後も一定時間はデバイスを維持するため、一時的なネットワーク断やストレージコントローラ切替などのイベントから自動復旧できます。一般的なiSCSI環境では30秒程度がよく利用されます。設定値が短すぎると、一時障害でもデバイスが消失する可能性があります。
Multipathでよくあるトラブルと確認ポイント
Multipath環境では、設定ミスやネットワーク障害によって期待通りにマルチパス構成が作成されないことがあります。ここでは、実際によく遭遇するトラブルと確認ポイントを紹介します。
iSCSI Discoveryに失敗する
まず最初に遭遇しやすいのが、iSCSI Targetを検出できないケースです。
例えば以下のようなエラーが表示されます。
[root@initiator ~]# iscsiadm -m discovery -t sendtargets -p 192.168.56.102
iscsiadm: cannot make connection to 192.168.56.102: No route to hostこの場合は以下を確認します。
- Targetサーバへping疎通できるか
- 3260/TCPが待ち受けているか
- firewalldで3260/TCPが許可されているか
- Target側でPortal設定が正しいか
Discoveryできるがログインできない
Discoveryは成功しているにもかかわらず、ログイン時に失敗するケースがあります。この場合はACL設定を確認します。
まず、Initiator側のIQNを確認します。
[root@initiator ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:af1f40d2c093
[root@initiator ~]#Target側で登録済みACLを確認します。
[root@target ~]# targetcli
targetcli shell version 2.1.57
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> ls /iscsi/iqn.2026-05.local.lab:storage.disk01/tpg1/acls
o- acls ........................................................................... [ACLs: 1]
o- iqn.1994-05.com.redhat:af1f40d2c093 ................................... [Mapped LUNs: 1]
o- mapped_lun0 ................................................ [lun0 fileio/disk01 (rw)]
/>OSディスクまでMultipath対象になってしまう
設定を誤るとOSディスクまでMultipath対象になることがあります。その結果、
- 起動遅延
- initramfsエラー
- ブート失敗
などが発生する可能性があります。
検証環境では以下のようにOSディスクを除外しました。
blacklist {
devnode "^sda" #Additional Setting
devnode "^sdb" #Additional Setting
}商用環境ではWWIDベースで除外する、あるいはfind_multipaths on を設定して自動認識させるようにしてください。
まとめ
本記事では、iSCSIを利用したMultipath環境を構築しながら、LinuxにおけるMultipathの仕組みとフェイルオーバ動作を確認しました。
Multipathは、複数のストレージパスを1つの論理デバイスとして扱うことで、高可用性を実現する技術です。LinuxではDevice Mapperがパスを統合し、multipathdがパス監視やフェイルオーバを担当します。
実運用では、WWIDによるデバイス管理や適切なタイムアウト設計が重要になります。また、障害発生時には multipath -ll や multipathd show paths を利用して、パス状態を確認できるようになっておくことが大切です。
MultipathはSAN環境では欠かせない技術です。本記事を参考に実際に構築・検証を行い、その動作を体験しながら理解を深めてみてください。


コメント