自作PCを使って宅内SANを構築する

## 背景
ファイバーチャネルに関しての知識が全く無かったので、自宅に環境を作ってみることにした。ディスクアレイを置くのは騒音や廃棄の面で不安があったので、PCを組んでターゲットとする。全くの素人が手探りでやったことではあるが、備忘録を兼ねて記録を残す。

## 目標
新しく構築したPCをストレージとして、FC経由でProxmoxから見えるようにSANを構築する。

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990337/e184bae0-1f2e-4258-8e14-92b925bff185.png)

### ターゲットノード
- 自作PC(Ubuntu 24.04.2)
    - CPU:Ryzen 2400G
    - メモリ:DDR4 16GB
    - SSD:250GB
    - HDD:4TB ★これをProxmox側で見えるようにする
    - HBA:QLE2460
### イニシエータノード
- ワークステーション(Proxmox 8.2.2)
    - CPU:i7-7700
    - メモリ:32GB
    - SSD:250GB
    - HBA:ISP2532
### ケーブル
- OM3 LC-LC
## 作業
以降基本的にはターゲット側での操作
### HBAのドライバの設定
qla2xxxはデフォルトでイニシィエータモードで動作するので、ターゲットモードに変更する。
`vi /etc/modprobe.d/qla2xxx.conf`でファイルを新規作成して、以下を追記。
```
# options qla2xxx qlini_mode="disabled"
```

### initramfsの更新をして再起動
```
# update-initramfs -u
# reboot
```


### パーティションの作成
#### ディスクの確認
```
# fdisk -l
Disk /dev/sda: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: Fanxiang S101Q 2
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 0865405D-9CFD-423C-BC64-**********

Device       Start       End   Sectors   Size Type
/dev/sda1     2048   2203647   2201600     1G EFI System
/dev/sda2  2203648   6397951   4194304     2G Linux filesystem
/dev/sda3  6397952 500115455 493717504 235.4G Linux filesystem


Disk /dev/sdb: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors   ★新しく追加したHDD
Disk model: WDC WD40EZAX-00C
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```
/dev/sdbとして4TBのディスクを認識している。

#### LVM ボリュームの作成
今回はfdiskを使用したが、partedのほうが現代的らしい。fdiskはGPT(GUIDパーティションテーブル)に対応していないので、2TB以上のディスクを使用する場合、2TB以上のパーティションが作れないと警告が出る。
```
# fdisk /dev/sdb

Welcome to fdisk (util-linux 2.39.3).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
The size of this disk is 3.6 TiB (4000787030016 bytes). 
DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).
★↑が先述した警告。

Created a new DOS (MBR) disklabel with disk identifier 0x11e5bc1f.

Command (m for help): m   ★ヘルプの表示

Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag

  Generic
   d   delete a partition
   F   list free unpartitioned space
   l   list known partition types
   n   add a new partition
   p   print the partition table
   t   change a partition type
   v   verify the partition table
   i   print information about a partition

  Misc
   m   print this menu
   u   change display/entry units
   x   extra functionality (experts only)

  Script
   I   load disk layout from sfdisk script file
   O   dump disk layout to sfdisk script file

  Save & Exit
   w   write table to disk and exit
   q   quit without saving changes

  Create a new label
   g   create a new empty GPT partition table
   G   create a new empty SGI (IRIX) partition table
   o   create a new empty MBR (DOS) partition table
   s   create a new empty Sun partition table


Command (m for help): n   ★パーティションの追加
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p   ★primaryパーティション
Partition number (1-4, default 1): 1   ★1つ目なので1でよさそう
First sector (2048-4294967295, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4294967295, default 4294967295): +1000G   ★今回は1000Gのパーティションを作成

Created a new partition 1 of type 'Linux' and of size 1000 GiB.

Command (m for help): t   ★パーティションタイプの変更
Selected partition 1
Hex code or alias (type L to list all): L   ★選択肢の表示

00 Empty            27 Hidden NTFS Win  82 Linux swap / So  c1 DRDOS/sec (FAT-
01 FAT12            39 Plan 9           83 Linux            c4 DRDOS/sec (FAT-
02 XENIX root       3c PartitionMagic   84 OS/2 hidden or   c6 DRDOS/sec (FAT-
03 XENIX usr        40 Venix 80286      85 Linux extended   c7 Syrinx         
04 FAT16 <32M       41 PPC PReP Boot    86 NTFS volume set  da Non-FS data    
05 Extended         42 SFS              87 NTFS volume set  db CP/M / CTOS / .
06 FAT16            4d QNX4.x           88 Linux plaintext  de Dell Utility   
07 HPFS/NTFS/exFAT  4e QNX4.x 2nd part  8e Linux LVM        df BootIt         
08 AIX              4f QNX4.x 3rd part  93 Amoeba           e1 DOS access     
09 AIX bootable     50 OnTrack DM       94 Amoeba BBT       e3 DOS R/O        
0a OS/2 Boot Manag  51 OnTrack DM6 Aux  9f BSD/OS           e4 SpeedStor      
0b W95 FAT32        52 CP/M             a0 IBM Thinkpad hi  ea Linux extended 
0c W95 FAT32 (LBA)  53 OnTrack DM6 Aux  a5 FreeBSD          eb BeOS fs        
0e W95 FAT16 (LBA)  54 OnTrackDM6       a6 OpenBSD          ee GPT            
0f W95 Ext'd (LBA)  55 EZ-Drive         a7 NeXTSTEP         ef EFI (FAT-12/16/
10 OPUS             56 Golden Bow       a8 Darwin UFS       f0 Linux/PA-RISC b
11 Hidden FAT12     5c Priam Edisk      a9 NetBSD           f1 SpeedStor      
12 Compaq diagnost  61 SpeedStor        ab Darwin boot      f4 SpeedStor      
14 Hidden FAT16 <3  63 GNU HURD or Sys  af HFS / HFS+       f2 DOS secondary  
16 Hidden FAT16     64 Novell Netware   b7 BSDI fs          f8 EBBR protective
17 Hidden HPFS/NTF  65 Novell Netware   b8 BSDI swap        fb VMware VMFS    
18 AST SmartSleep   70 DiskSecure Mult  bb Boot Wizard hid  fc VMware VMKCORE 
1b Hidden W95 FAT3  75 PC/IX            bc Acronis FAT32 L  fd Linux raid auto
1c Hidden W95 FAT3  80 Old Minix        be Solaris boot     fe LANstep        
1e Hidden W95 FAT1  81 Minix / old Lin  bf Solaris          ff BBT            
24 NEC DOS        

Aliases:
   linux          - 83
   swap           - 82
   extended       - 05
   uefi           - EF
   raid           - FD
   lvm            - 8E
   linuxex        - 85
Hex code or alias (type L to list all): 8e   ★LVMにしたいので
Changed type of partition 'Linux' to 'Linux LVM'.

Command (m for help): w   ★保存
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

#### パーティションが作成できたことを確認
```
# fdisk -l
Disk /dev/sdb: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: WDC WD40EZAX-00C
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x11e*****

Device     Boot Start        End    Sectors  Size Id Type
/dev/sdb1        2048 2097154047 2097152000 1000G 8e Linux LVM   ★作成したパーティション


Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 100 GiB, 107374182400 bytes, 209715200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```

### 物理ボリュームの作成
先ほど作成したパーティション、sdb1に物理ボリュームを作成。
```
# pvcreate /dev/sdb1   ★物理ボリュームの作成
  Physical volume "/dev/sdb1" successfully created.
# pvdisplay   ★確認
  "/dev/sdb1" is a new physical volume of "1000.00 GiB"   ★作成した物理ボリューム
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               1000.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               mZJVRF-ZtD0-Bk9l-rcJV-LX3g-b3ca-*****
```

### ボリュームグループの作成
lvg-shareという名前でボリュームグループを作成。
```
# vgcreate lvg-share /dev/sdb1   ★ボリュームグループの作成
  Volume group "lvg-share" successfully created
# vgdisplay   ★確認
  --- Volume group ---
  VG Name               lvg-share   ★作成したボリュームグループ
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <1000.00 GiB
  PE Size               4.00 MiB
  Total PE              255999
  Alloc PE / Size       0 / 0   
  Free  PE / Size       255999 / <1000.00 GiB
  VG UUID               pLaazO-2R0g-l7Rf-kFyG-S2W6-EG2G-******
```
`vgscan`コマンドでも確認可能
```
# vgscan
  Found volume group "lvg-share" using metadata type lvm2   ★作成したボリュームグループ
  Found volume group "ubuntu-vg" using metadata type lvm2
```

### 論理ボリュームの作成
今回は名前をproxmox、サイズを500GBで作成。
```
# lvcreate --name proxmox --size 500GB lvg-share   ★論理ボリュームの作成。
  Logical volume "proxmox" created.
# lvdisplay   ★確認
  --- Logical volume ---
  LV Path                /dev/lvg-share/proxmox   ★作成した論理ボリューム
  LV Name                proxmox
  VG Name                lvg-share
  LV UUID                UxbmCi-V7jG-GkNy-KJXE-n3Lx-iMEs-*****
  LV Write Access        read/write
  LV Creation host, time Storage, 2025-03-11 12:51:34 +0000
  LV Status              available
  # open                 0
  LV Size                500.00 GiB
  Current LE             128000
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1
```

### ファイルシステムの作成
今回はLinuxで一般的に使用されている、ext4を使用。
```
# mkfs.ext4 /dev/lvg-share/proxmox   ★ext4ファイルシステムを作成
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 131072000 4k blocks and 32768000 inodes
Filesystem UUID: bdc4bbb2-a5d6-49e0-afe3-**********
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done     
#
```

### LIO(LinuxIO)の設定
/dev/mapper/以下に先ほど作成したボリュームグループと論理グループ名がついたリンクが作成されている。
```
# ls /dev/mapper/
control  lvg--share-proxmox ★これ  ubuntu--vg-ubuntu--lv
```
#### targetcliのインストール
iSCSI管理ツールであるtargetcliをインストールする。
```
# apt install targetcli-fb -y
```
#### backstoreの登録
先ほど確認した/dev/mapper/以下のリンクを参考に以下のコマンドを入力
`targetcli /backstores/block create name=[登録名] dev=/dev/mapper/[リンク名]`
```
# targetcli /backstores/block create name=proxmox dev=/dev/mapper/lvg--share-proxmox
Created block storage object proxmox using /dev/mapper/lvg--share-proxmox.
```
確認する。
```
# sudo targetcli ls /backstores
o- backstores ................................................................................................................ [...]
  o- block .................................................................................................... [Storage Objects: 1]
  | o- proxmox★................................................. [/dev/mapper/lvg--share-proxmox (500.0GiB) write-thru deactivated]
  |   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]
# 
```
星印の場所に作成されていることが確認できた。

### FCターゲットとしてWWNを設定
使用しているHBAのWWNを確認する。
```
# targetcli /qla2xxx info
Fabric module name: qla2xxx
ConfigFS path: /sys/kernel/config/target/qla2xxx
Allowed WWN types: naa
Allowed WWNs list: naa.21000024ff0*****   ★これがWWN
Fabric module features: acls
Corresponding kernel module: tcm_qla2xxx
# 
```
qla2xxxにFCターゲットを作成
```
# targetcli /qla2xxx create naa.21000024ff*****
targetcli /qla2xxx create naa.21000024ff0*****
Created target naa.21000024ff0*****.

# targetcli /qla2xxx ls   ★確認
o- qla2xxx ............................................................................................................ [Targets: 1]
  o- naa.21000024ff***** ............................................................................................... [gen-acls]
    o- acls .............................................................................................................. [ACLs: 0]
    o- luns .............................................................................................................. [LUNs: 0]
#
```
### LUNを作成
```
# targetcli /qla2xxx/naa.21000024f*****/luns create /backstores/block/proxmox
Created LUN 0.
# 
```

### イニシエータのWWNを確認
Proxmox側のノードに移動して、こちらでもtargetcliのインストールをする。
```
# apt install targetcli-fb
```
```
# targetcli /qla2xxx info   ★WWNを確認
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
Fabric module name: qla2xxx
ConfigFS path: /sys/kernel/config/target/qla2xxx
Allowed WWN types: naa
Allowed WWNs list: naa.2101001b3*******, naa.2100001b3*******   ★イニシエータとなるWWN
Fabric module features: acls
Corresponding kernel module: tcm_qla2xxx
# 
```
今回使用したisp2532は2ポートあるのでWWNは2つ確認できる。
どちらも同じアドレスだったので、ケーブルの刺さっているポートかどうか等は
気にしなくても良さそう。

### ターゲット側でイニシエータの登録
アクセスリストにイニシエータを登録する。
```
# targetcli /qla2xxx/naa.21000024f******/acls create 2101001b32******
Created Node ACL for naa.2101001b3******
Created mapped LUN 0.
# targetcli / saveconfig   ★設定の保存
Last 10 configs saved in /etc/rtslib-fb-target/backup/.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json
# 
```

### ターゲットサービスの再起動
```
# systemctl restart target
# systemctl status target
```
### ターゲット側の設定の確認
```
# targetcli ls
o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 1]
  | | o- proxmox .................................................. [/dev/mapper/lvg--share-proxmox (500.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: 1]
  | o- naa.21000024ff****** ............................................................................................. [gen-acls]
  |   o- acls ............................................................................................................ [ACLs: 1]
  |   | o- naa.2101001b3******* ................................................................................... [Mapped LUNs: 1]
  |   |   o- mapped_lun0 ................................................................................. [lun0 block/proxmox (rw)]
  |   o- luns ............................................................................................................ [LUNs: 1]
  |     o- lun0 ................................................ [block/proxmox (/dev/mapper/lvg--share-proxmox) (default_tg_pt_gp)]
  o- vhost ............................................................................................................ [Targets: 0]
# 
```


### イニシエータ側の確認
ファイバーケーブルを刺して、
先ほど設定した領域がちゃんと見えているかどうかを確認。
```
# lsblk
NAME                                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda                                         8:0    0 238.5G  0 disk 
├─sda1                                      8:1    0  1007K  0 part 
├─sda2                                      8:2    0     1G  0 part /boot/efi
└─sda3                                      8:3    0 237.5G  0 part 
  ├─pve-swap                              252:0    0     8G  0 lvm  [SWAP]
  ├─pve-root                              252:1    0  69.4G  0 lvm  /
  ├─pve-data_tmeta                        252:2    0   1.4G  0 lvm  
  │ └─pve-data-tpool                      252:4    0 141.2G  0 lvm  
  │   ├─pve-data                          252:5    0 141.2G  1 lvm  
**************************省略********************************
  │   └─pve-vm--112--disk--0              252:41   0    10G  0 lvm  
  └─pve-data_tdata                        252:3    0 141.2G  0 lvm  
    └─pve-data-tpool                      252:4    0 141.2G  0 lvm  
      ├─pve-data                          252:5    0 141.2G  1 lvm  

**************************省略********************************

sdb★                                       8:16   0   500G  0 disk 
sr0                                        11:0    1  1024M  0 rom  
# 
```
ポートの確認。
```
# cat /sys/class/fc_host/host?
cat: /sys/class/fc_host/host4: Is a directory 
cat: /sys/class/fc_host/host5: Is a directory
#

# cat /sys/class/fc_host/host4/port_name 
0x2100001b3******
# cat /sys/class/fc_host/host5/port_name 
0x2101001b3******

# cat /sys/class/fc_host/host5/port_state
Online
# cat /sys/class/fc_host/host4/port_state
Linkdown
# 
```
host4と5として認識しているらしい。
WWNとリンク状態も確認できた。

### LVMの設定
以下はクラスターとかHA構成なら必要な設定かも。とりあえずやる。
```
# vi /etc/lvm/lvm.conf ★コメント解除と0を1に変更
-       # use_lvmlockd = 0
+       use_lvmlockd = 1
# vi /etc/lvm/lvmlocal.conf ★コメント解除と0を任意のID番号に変更
-       # host_id = 0
+       host_id = 1
# systemctl start lvmlockd
# vi lvmlockd.hostid
# systemctl restart lvmlockd
# systemctl status lvmlockd
```
### ボリュームの作成
ターゲット側で公開した領域上に物理ボリュームとボリュームグループを作成する。
```
# vgcreate --shared fc_vg /dev/sdb   ★fc_vgという名前で作成
  Enabling sanlock global lock
  Logical volume "lvmlock" created.
  Volume group "fc_vg" successfully created
  VG fc_vg starting sanlock lockspace
  Starting locking.  Waiting until locks are ready...
# vgdisplay   ★確認
  --- Volume group ---
  VG Name               fc_vg
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <500.00 GiB   ★ちゃんと500GB見えている
  PE Size               4.00 MiB
  Total PE              127999
  Alloc PE / Size       256 / 1.00 GiB
  Free  PE / Size       127743 / <499.00 GiB
  VG UUID               6UPN2V-BT2J-FN2x-cuh2-3io2-GHMN-*****
#
```
これもクラスターとかHA構成なら必要な設定かも。とりあえずやる。
```
vgchange --lock-start fc_vg
  Starting locking.  Waiting for sanlock may take 20 sec to 3 min...
# vgs -o +lock_type
  VG    #PV #LV #SN Attr   VSize    VFree    LockType
  fc_vg   1   0   0 wz--ns <500.00g <499.00g sanlock ★sanlockになっていればOK
  pve     1 105   0 wz--n-  237.47g   16.00g         
# 
```

### ProxmoxのGUIでの操作
左上のデータセンター>ストレージ>追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990337/cdc0dbcc-4f2a-4786-8910-796b876fc3cf.png)
LVM>IDを入力>ボリュームグループでfc_vg(先ほど作成したボリュームグループ)を選択>共有済みにチェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990337/e87136f9-efc1-4ff5-a82d-c77f840cd38c.png)
追加を押すと新たなディスクが作成されている。(fc_lvmは以前作成したものなので、IDがtestになっていません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990337/cc6b78f7-8fd4-4548-a7ac-b645f6297a5f.png)
ストレージ領域が増えていることが確認できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990337/6da51774-4460-4a45-a09a-7cd38d54bc33.png)



## まとめ
まず、ストレージとして外部に公開するための領域を切り出した。
流れとしては
1.パーティションの作成
2.物理ボリュームの作成
3.ボリュームグループの作成
4. 論理ボリュームの作成
5. ファイルシステムの作成

続いて、SANのターゲットとイニシエータの設定を行った。
6. backstoreに論理ボリュームをアタッチ
7. FCターゲットを作成
8. LUNを作成
9. イニシエータを登録

以降はイニシエータ側で設定。
10. イニシエータ側で物理ボリュームを作成
11. ボリュームグループの作成
12. GUIからLVMを作成


## 感想
意外とあっさり完成したので拍子抜けした部分もあったが、今までFCを触ったことがなかったので勉強になった。
ファイルシステムやディスク関連の知識が足りていないのでもう少し勉強したい。

## 参考
https://qiita.com/TsutomuNakamura/items/93c6333c8dd32aeb197a
https://qiita.com/flathill/items/89287b61f13eaa94ea15
https://waura.github.io/zi-zhai-sanstorage-area-networknogou-zhu.html
https://qiita.com/flathill/items/ddd67a358a4e510829c4
https://ameblo.jp/l-yotarou/entry-12799752138.html
https://gist.github.com/261shimizu/c5ab9cd712ef15d7a6223253e0eaed8a