Fedora Server で FC-SAN ターゲットを構築（Qlogic HBA）

## はじめに

Proxmox VEでFC-SANストレージの接続試験を行うために、
Fedora Server 41 上で Fibre Channel (FC) ターゲットを構築し、LUN を提供してみました。
2台のProxmox VEから同時接続を行うために、2ポート実装のQlogicの FC HBA を利用しました。

> **参考情報:** [Fibre Channel in the Homelab (kenmoini.com)](https://kenmoini.com/post/2024/05/fibre-channel-in-the-homelab/)
> Qlogic HBA をターゲットモードで動かす方法などを含んでいます。

## 検証環境

| 項目           | 内容                                     |
|----------------|------------------------------------------|
| OS            | Fedora Server 41                          |
| HBA           | Qlogic 2662                        |
| ターゲット設定    | LIO (`targetcli`) を使用                      |
| 接続プロトコル     | Fibre Channel (FC)                       |
| ストレージ領域     | LVM ボリューム `/dev/fedora/fc_lun1` (500GB 例) |

---

## 1. HBA の認識を確認

まず、FC HBA が OS に正しく認識されているかを確認します。

### 確認
```bash
lspci | grep -i fibre
lsmod | grep -i qla
```

```bash
[flathill@localhost ~]$ lspci | grep -i fibre
01:00.0 Fibre Channel: QLogic Corp. ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (rev 02)
01:00.1 Fibre Channel: QLogic Corp. ISP8324-based 16Gb Fibre Channel to PCI Express Adapter (rev 02)
[flathill@localhost ~]$ lsmod | grep -i qla
qla2xxx              1212416  0
nvme_fc                69632  1 qla2xxx
scsi_transport_fc     126976  1 qla2xxx
```

Qlogic のドライバ `qla2xxx` がロードされていれば OK です。認識されていない場合は、`modprobe qla2xxx` でロードしてください。

---

## 2. HBA をターゲットモードに設定

FC HBA では、イニシエータモードを無効化してターゲットモードを有効にする設定が必要です。

### Qlogic (qla2xxx) ドライバの場合

1. **lpfc モジュール設定ファイルの編集**  
Fedora では `/usr/lib/modprobe.d/qla2xxx.conf` のようなファイルを作成し、以下を記載します。
   
```bash
options qla2xxx qlini_mode="disabled"
```
   
```bash
[root@localhost ~]# cat /usr/lib/modprobe.d/qla2xxx.conf
options qla2xxx qlini_mode="disabled"
```

2. **initramfs の更新**  
設定を反映させるため、dracut で initramfs を再生成します。
   
```bash
dracut -f
```

```bash
[root@localhost ~]# dracut -f
dracut[E]: Module 'systemd-pcrphase' depends on 'tpm2-tss', which can't be installed
dracut[E]: Module 'systemd-pcrphase' depends on 'tpm2-tss', which can't be installed
```

3. **再起動**  
```bash
reboot
```
再起動後、`qla2xxx` ドライバがターゲットモードになっているかを確認します。

4. **ターゲットモジュールのロード**  
   起動後に以下のコマンドを実行し、必要なモジュールがロードされているか確認します。
   
```bash
lsmod | grep lpfc
```

```bash
[root@localhost flathill]# modprobe configfs
[root@localhost flathill]# modprobe target_core_mod
[root@localhost flathill]# modprobe tcm_fc
[root@localhost flathill]# lsmod | grep qla2xxx
qla2xxx              1212416  0
nvme_fc                69632  1 qla2xxx
scsi_transport_fc     126976  2 qla2xxx,libfc
```

---

## 3. `targetcli` のインストール

FC ターゲットを作成するには、`targetcli` を利用します。
Fedora では以下のようにインストールします。

```bash
dnf install targetcli sysfsutils
```

```bash
[root@localhost flathill]# dnf install targetcli sysfsutils
Updating and loading repositories:
 Fedora 41 - x86_64 - Updates                                                 100% |   4.3 MiB/s |  10.8 MiB |  00m02s
 Fedora 41 openh264 (From Cisco) - x86_64                                     100% |   4.3 KiB/s |   6.0 KiB |  00m01s
 Fedora 41 - x86_64                                                           100% |   9.5 MiB/s |  35.4 MiB |  00m04s
Repositories loaded.
Package                                Arch       Version                                Repository               Size
Installing:
 sysfsutils                            x86_64     2.1.1-8.fc41                           fedora              100.6 KiB
 targetcli                             noarch     2.1.58-3.fc41                          fedora              275.7 KiB
省略
```

インストール後、以下のコマンドでqla2xxxが含まれているか確認します。

```bash
targetcli ls
```

```bash
[root@localhost flathill]# targetcli ls
o- / ........................................................................................................... [...]
  o- backstores ................................................................................................ [...]
  | o- block .................................................................................... [Storage Objects: 0]
  | o- fileio ................................................................................... [Storage Objects: 0]
  | o- pscsi .................................................................................... [Storage Objects: 0]
  | o- ramdisk .................................................................................. [Storage Objects: 0]
  o- iscsi .............................................................................................. [Targets: 0]
  o- loopback ........................................................................................... [Targets: 0]
  o- qla2xxx ............................................................................................ [Targets: 0]
  o- vhost .............................................................................................. [Targets: 0]
```

この結果から、QlogicのHBAがtargetとして利用出来ることが分かります。

---

## 4. バックストアの作成

LVM で 500GB の論理ボリュームを作成し、それをバックストアとして提供する例です。

### LVM ボリュームの作成 (例)
```bash
lvcreate -L 200G -n fc_lun1 fedora
lvs
```

- ボリュームグループ名を `fedora`、論理ボリューム名を `fc_lun1` としています。

```bash
[root@localhost flathill]# lvcreate -L 200G -n fc_lun1 fedora
  Logical volume "fc_lun1" created.
[root@localhost flathill]# lvs
  LV      VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  fc_lun1 fedora -wi-a----- 200.00g
  root    fedora -wi-ao----  15.00g
```

### `targetcli` でバックストア登録

```bash
targetcli /backstores/block create name=fc_lun1 dev=/dev/fedora/fc_lun1
```

- `name` には任意のバックストア名を指定
- `dev` には先ほど作成した LVM ボリュームを指定

```bash
[root@localhost flathill]# targetcli /backstores/block create name=fc_lun1 dev=/dev/fedora/fc_lun1
Created block storage object fc_lun1 using /dev/fedora/fc_lun1.
```

登録後に以下を実行し、バックストアが作成されたか確認します。

```bash
targetcli /backstores/block ls
```

```bash
[root@localhost flathill]# targetcli /backstores/block ls
o- block ........................................................................................ [Storage Objects: 1]
  o- fc_lun1 ................................................. [/dev/fedora/fc_lun1 (200.0GiB) write-thru deactivated]
    o- alua ......................................................................................... [ALUA Groups: 1]
      o- default_tg_pt_gp ............................................................. [ALUA state: Active/optimized]
```

---

## 5. WWPNの登録

QLogic HBAが2ポート構成のため、それぞれのWWPNをFCターゲットとして設定し、同じbackstore (/backstores/block/fc_lun1) にアサインすることで、マルチパス構成を実現します。

### **1. HBAのWWPNを確認**
まず、QLogic HBAの各ポートのWWPNを取得します。

```bash
cat /sys/class/fc_host/host*/port_name
```

```bash
[root@localhost ~]# cat /sys/class/fc_host/host*/port_name
0x2100000e1efd7802
0x2100000e1efd7803
```

ここで取得した2つのWWPN (`0x2100000e1efd7802`, `0x2100000e1efd7803`) をターゲットに設定します。

---

### **2. `targetcli` でFCターゲットを作成**
`targetcli` を開きます。

```bash
targetcli
```

```bash
[root@localhost ~]# targetcli
targetcli shell version 2.1.58
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
```

#### **(1) `qla2xxx` にFCターゲットを作成**
```targetcli
/> cd /qla2xxx
/qla2xxx> create 0x2100000e1efd7802
Created target naa.2100000e1efd7802.
/qla2xxx> create 0x2100000e1efd7803
Created target naa.2100000e1efd7803.
```
→ 2つのポートをFCターゲットとして登録

#### **(2) それぞれのターゲットに LUN をアタッチ**
```targetcli
/qla2xxx> cd /qla2xxx/naa.2100000e1efd7802/luns
/qla2xxx/naa....1efd7802/luns> ls
o- luns .................................................................................................... [LUNs: 0]
/qla2xxx/naa....1efd7802/luns> create /backstores/block/fc_lun1
Created LUN 0.
/qla2xxx/naa....1efd7802/luns> ls
o- luns .................................................................................................... [LUNs: 1]
  o- lun0 ................................................... [block/fc_lun1 (/dev/fedora/fc_lun1) (default_tg_pt_gp)]
/qla2xxx/naa....1efd7802/luns> cd /qla2xxx/naa.2100000e1efd7803/luns
/qla2xxx/naa....1efd7803/luns> ls
o- luns .................................................................................................... [LUNs: 0]
/qla2xxx/naa....1efd7803/luns> create /backstores/block/fc_lun1
Created LUN 0.
/qla2xxx/naa....1efd7803/luns> ls
o- luns .................................................................................................... [LUNs: 1]
  o- lun0 ................................................... [block/fc_lun1 (/dev/fedora/fc_lun1) (default_tg_pt_gp)]
```
→ 両方のポートに `/backstores/block/fc_lun1` をアサイン

---

### **3. ACL（イニシエータWWPN）を設定**
2台のイニシエータ（ホスト）側のWWPNを取得し、ACLとして登録します。

(イニシエータ（ホスト）側のWWPN取得方法)
```bash
cat /sys/class/fc_host/host*/port_name
```

```bash
root@d-1697:~# cat /sys/class/fc_host/host5/port_name
0x10000090fad99630
root@d-1698:~# cat /sys/class/fc_host/host*/port_name
0x10000090fad995fe
```

(取得したWWPNをターゲットに登録)
```targetcli
/qla2xxx/naa....1efd7802/luns> cd /qla2xxx/naa.2100000e1efd7802/acls
/qla2xxx/naa....1efd7802/acls> create 0x10000090fad99630
Created Node ACL for naa.10000090fad99630
Created mapped LUN 0.
/qla2xxx/naa....1efd7802/acls> create 0x10000090fad995fe
Created Node ACL for naa.10000090fad995fe
Created mapped LUN 0.
/qla2xxx/naa....1efd7802/acls> cd /qla2xxx/naa.2100000e1efd7803/acls
/qla2xxx/naa....1efd7803/acls> create 0x10000090fad99630
Created Node ACL for naa.10000090fad99630
Created mapped LUN 0.
/qla2xxx/naa....1efd7803/acls> create 0x10000090fad995fe
Created Node ACL for naa.10000090fad995fe
Created mapped LUN 0.
```
→ ホスト側のWWPNをターゲットのACLに登録

---

### **4. 設定を保存**
ルートディレクトリに戻ってから設定を保存します。

```targetcli
/qla2xxx/naa....1efd7803/acls> cd /
/> saveconfig
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
```

---

### **5. ターゲットサービスの再起動**
```bash
systemctl restart target
```

```bash
[root@localhost ~]# systemctl restart target
[root@localhost ~]# systemctl status target
● target.service - Restore LIO kernel target configuration
     Loaded: loaded (/usr/lib/systemd/system/target.service; disabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             mq10-timeout-abort.conf
     Active: active (exited) since Fri 2025-02-28 11:25:28 JST; 4s ago
 Invocation: 0a8e2dc95a574fe2b72f1b6692dab0f4
    Process: 2352 ExecStart=/usr/bin/targetctl restore (code=exited, status=0/SUCCESS)
   Main PID: 2352 (code=exited, status=0/SUCCESS)
   Mem peak: 8.2M
        CPU: 79ms

 2月 28 11:25:20 localhost.localdomain systemd[1]: Starting target.service - Restore LIO kernel target configuration.>
 2月 28 11:25:28 localhost.localdomain systemd[1]: Finished target.service - Restore LIO kernel target configuration.
```

---

### **6. 設定の確認**
```bash
targetcli ls
```

```
[root@localhost ~]# targetcli ls
o- / ........................................................................................................... [...]
  o- backstores ................................................................................................ [...]
  | o- block .................................................................................... [Storage Objects: 1]
  | | o- fc_lun1 ............................................... [/dev/fedora/fc_lun1 (200.0GiB) write-thru activated]
  | |   o- alua ..................................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ......................................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................................... [Storage Objects: 0]
  | o- pscsi .................................................................................... [Storage Objects: 0]
  | o- ramdisk .................................................................................. [Storage Objects: 0]
  o- iscsi .............................................................................................. [Targets: 0]
  o- loopback ........................................................................................... [Targets: 0]
  o- qla2xxx ............................................................................................ [Targets: 2]
  | o- naa.2100000e1efd7802 ............................................................................... [gen-acls]
  | | o- acls .............................................................................................. [ACLs: 2]
  | | | o- naa.10000090fad99630 ..................................................................... [Mapped LUNs: 1]
  | | | | o- mapped_lun0 ................................................................... [lun0 block/fc_lun1 (rw)]
  | | | o- naa.10000090fad995fe ..................................................................... [Mapped LUNs: 1]
  | | |   o- mapped_lun0 ................................................................... [lun0 block/fc_lun1 (rw)]
  | | o- luns .............................................................................................. [LUNs: 1]
  | |   o- lun0 ............................................. [block/fc_lun1 (/dev/fedora/fc_lun1) (default_tg_pt_gp)]
  | o- naa.2100000e1efd7803 ............................................................................... [gen-acls]
  |   o- acls .............................................................................................. [ACLs: 2]
  |   | o- naa.10000090fad99630 ..................................................................... [Mapped LUNs: 1]
  |   | | o- mapped_lun0 ................................................................... [lun0 block/fc_lun1 (rw)]
  |   | o- naa.10000090fad995fe ..................................................................... [Mapped LUNs: 1]
  |   |   o- mapped_lun0 ................................................................... [lun0 block/fc_lun1 (rw)]
  |   o- luns .............................................................................................. [LUNs: 1]
  |     o- lun0 ............................................. [block/fc_lun1 (/dev/fedora/fc_lun1) (default_tg_pt_gp)]
  o- vhost .............................................................................................. [Targets: 0]
```
---

## **7. イニシエータ（ホスト）側の確認**
2台のホスト側でターゲットが見えているかを確認します。

```bash
lsblk
```

```bash
root@d-1697:~# lsblk | grep sdb
sdb                  8:16   0   200G  0 disk
root@d-1698:~# lsblk | grep sdb
sdb                  8:16   0   200G  0 disk
```

最初に作成した、200Gのlvが見えていることが分かります。

---

## **まとめ**
- `targetcli` でQLogic HBAの2ポート (`qla2xxx`) をターゲットに登録
- 両ポートに `fc_lun1` をアタッチ
- イニシエータ（ホスト）のWWPNをACLに追加
- 設定を保存し、`target` サービスを再起動
- ホスト側で `lsscsi` で確認

以上の構成により、ターゲット側HBAの2ポートを活用し、2台のイニシエータ側HBAから単一の `fc_lun1` に対してアクセスが可能になります。