iSCSI (Internet SCSI) 讓伺服器透過 IP 網路將區塊級儲存空間提供給遠端主機,廣泛應用於虛擬化共享儲存、資料庫叢集、備份卸載。本文以 iscsitarget (Target 端) 與 open-iscsi (Initiator 端) 為例,完整記錄:軟體安裝、配置檔編輯、服務啟動、LUN 映射、CHAP 雙向認證 (Discovery/Session 兩層)、防火牆開放、多路徑掛載驗證、效能調優參數,適用 CentOS 6/7、RHEL、Debian/Ubuntu。
| 角色 | 軟體套件 | 核心功能 |
|---|---|---|
| Target (Server) | iscsitarget / tgt / LIO | 將本地區塊裝置 (/dev/sdb, LVM LV, 影像檔) 發布為 iSCSI LUN |
| Initiator (Client) | open-iscsi (iscsid, iscsiadm) | 發現 Target、建立 Session、將 LUN 掛載為本地 /dev/sdX |
現代 Linux 核心 (3.0+) 內建 LIO (Linux-IO Target),建議新部署直接使用 targetcli 管理 LIO,本文仍保留 iscsitarget 傳統流程供存量系統參考。
# 下載最新版 (SourceForge)
wget https://sourceforge.net/projects/iscsitarget/files/iscsitarget/1.4.20.3/iscsitarget-1.4.20.3.tar.gz
tar zxvf iscsitarget-*.tar.gz
cd iscsitarget-*
make && make install
安裝產物:iscsi_trgt.ko (核心模組)、ietd (守護進程)、ietadm (管理工具)、/etc/init.d/iscsi-target、/etc/ietd.conf、/etc/initiators.allow/deny、/etc/iet/targets.allow。
# 全域 CHAP (Discovery 階段)
IncomingUser iqn.1994-05.com.fedora:client1 1234567890ab
Target iqn.2001-04.com.example:storage.disk1.sys1
Lun 0 Path=/dev/sdb,Type=blockio
Alias DataDisk1
# Session 級 CHAP (針對此 Target)
IncomingUser iqn.1994-05.com.fedora:client1 1234567890
# 可選:OutgoingUser (Target 向 Initiator 驗證,雙向 CHAP)
# OutgoingUser target_user target_pass
關鍵參數:
Type=blockio:直接區塊裝置 I/O (效能最佳,適用 /dev/sdX, LVM LV)Type=fileio:影像檔回環 (適用 /var/lib/iscsi/disk.img)Alias:易讀名稱,供管理識別
/etc/init.d/iscsi-target start
chkconfig iscsi-target on
# 驗證
ietadm -l
# 輸出應顯示 Target IQN 與 Lun 0 狀態
# CentOS/RHEL
yum install -y iscsi-initiator-utils
# Debian/Ubuntu
apt-get install -y open-iscsi
# /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.fedora:client1
# /etc/iscsi/iscsid.conf (關鍵 CHAP 設定)
# Discovery 階段 CHAP
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = iqn.1994-05.com.fedora:client1
discovery.sendtargets.auth.password = 1234567890ab
# Session 階段 CHAP
node.session.auth.authmethod = CHAP
node.session.auth.username = iqn.1994-05.com.fedora:client1
node.session.auth.password = 1234567890
重啟 iscsid 使配置生效:systemctl restart iscsid (或 /etc/init.d/iscsid restart)
iscsiadm -m discovery -t sendtargets -p 192.168.1.100
# 輸出範例:
# 192.168.1.100:3260,1 iqn.2001-04.com.example:storage.disk1.sys1
若 CHAP 失敗會顯示 Login failed to authenticate with target。
iscsiadm -m node -T iqn.2001-04.com.example:storage.disk1.sys1 -p 192.168.1.100 --login
# 成功後可見 /dev/sdc (或下一可用 sdX)
fdisk -l /dev/sdc
mkfs.ext4 /dev/sdc1
mount /dev/sdc1 /mnt/iscsi_data
dd if=/dev/zero of=/mnt/iscsi_data/test_100M bs=1M count=100
| 層級 | 階段 | 配置位置 | 失敗現象 |
|---|---|---|---|
| Discovery CHAP | 發現 Target 列表 | Target: 全域 IncomingUser Initiator: discovery.sendtargets.auth.* | iscsiadm -m discovery 直接報錯,無法看到任何 Target |
| Session CHAP | 登入特定 Target | Target: Target 區塊內 IncomingUser Initiator: node.session.auth.* | Discovery 成功,但 --login 失敗,報 initiator reported error (15 - already exists) |
最佳實踐:生產環境務必同時啟用兩層 CHAP,並為每個 Target 設定不同 Session 密碼。
若 Target 雙網卡 (192.168.1.100, 192.168.2.100) 提供冗余路徑:
# Initiator 端啟用多路徑
yum install -y device-mapper-multipath
mpathconf --enable --with_multipathd y
systemctl start multipathd
# 發現兩個 Portal 後分別登入
iscsiadm -m discovery -t sendtargets -p 192.168.1.100
iscsiadm -m discovery -t sendtargets -p 192.168.2.100
iscsiadm -m node -T iqn.2001-04.com.example:storage.disk1.sys1 -p 192.168.1.100 --login
iscsiadm -m node -T iqn.2001-04.com.example:storage.disk1.sys1 -p 192.168.2.100 --login
# 驗證多路徑裝置
multipath -ll
# 應出現 mpatha (dm-0) 兩條 path: sdc, sdd
mkfs.ext4 /dev/mapper/mpatha
mount /dev/mapper/mpatha /mnt/iscsi_ha
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload
# iptables:
iptables -I INPUT -p tcp --dport 3260 -j ACCEPT
| 參數 | 建議值 | 說明 |
|---|---|---|
MaxRecvDataSegmentLength | 131072 (128K) | 最大接收資料段,提升吞吐 |
MaxXmitDataSegmentLength | 131072 | 最大傳送資料段 |
FirstBurstLength | 262144 | 首次突發長度 |
MaxBurstLength | 262144 | 最大突發長度 |
ImmediateData | Yes | 減少回合行程 |
InitialR2T | No | 配合 ImmediateData |
| Initiator 端 /etc/iscsi/iscsid.conf | node.conn[0].iscsi.MaxRecvDataSegmentLength = 131072 | 同步設定 |
# 安裝
yum install -y targetcli
# 互動式配置
targetcli
/> backstores/block create name=lun1 dev=/dev/sdb
/> iscsi/ create iqn.2001-04.com.example:storage.lun1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/luns create /backstores/block/lun1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/portals create 192.168.1.100
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/set attribute authentication=1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/set attribute generate_node_acls=1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/acls create iqn.1994-05.com.fedora:client1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/acls/iqn.1994-05.com.fedora:client1/set auth userid=iqn.1994-05.com.fedora:client1
/> iscsi/iqn.2001-04.com.example:storage.lun1/tpg1/acls/iqn.1994-05.com.fedora:client1/set auth password=1234567890
/> saveconfig
/> exit
LIO 為核心原生,效能優於 iscsitarget,且支援 ALUA、TPG、多路徑原生管理,強烈建議新專案採用。