Linux Multipathを徹底解説|iSCSI構築からWWID・Device Mapper・フェイルオーバまで

はじめに

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がありますので、違いを理解しておきましょう。

項目WWIDUUID
説明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 running

multipathd 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 down

multipath状態変化の確認

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環境では欠かせない技術です。本記事を参考に実際に構築・検証を行い、その動作を体験しながら理解を深めてみてください。

コメント