告别U盘传文件!手把手教你用iSCSI在CentOS 7上搭建共享硬盘
每次看到同事拿着U盘在服务器间来回拷贝数据,我都忍不住想推荐iSCSI这个神器。想象一下,把远程服务器的硬盘直接挂载到本地,像操作本地磁盘一样读写文件,还能跨平台共享——这才是现代IT人该有的文件传输方式。
iSCSI特别适合需要频繁传输大文件的开发测试团队。相比传统的NFS或Samba,它直接工作在块设备层,性能更高、延迟更低。最近帮一个游戏工作室搭建了iSCSI环境,他们的美术资源动辄几十GB,现在团队成员都能直接编辑服务器上的素材库,再也不用担心版本混乱了。
1. 为什么选择iSCSI而不是其他共享方案?
在开始配置前,我们先理清几个关键概念。iSCSI本质上是通过网络传输SCSI指令,让客户端能够像访问本地硬盘一样操作远程存储。这与基于文件层的NFS/Samba有本质区别:
| 特性 | iSCSI | NFS/Samba |
|---|---|---|
| 协议层级 | 块设备层 | 文件层 |
| 性能 | 更高(直连磁盘) | 受文件系统开销影响 |
| 适用场景 | 数据库、虚拟机磁盘 | 普通文件共享 |
| 跨平台兼容性 | 优秀(标准协议) | 优秀 |
| 配置复杂度 | 中等 | 简单 |
实际测试中,在千兆网络环境下,iSCSI的连续读写速度能达到110MB/s,而NFS通常在90MB/s左右。更重要的是,iSCSI支持直接挂载为本地磁盘,这意味着:
- 可以对其分区、格式化
- 支持所有文件系统类型
- 能够运行chkdsk等磁盘工具
- 适合作为虚拟机的存储后端
2. 服务端配置全流程
2.1 环境准备与依赖安装
首先确保你的CentOS 7系统已经更新到最新:
yum update -y && reboot安装必要的工具链:
yum install -y targetcli lvm2提示:如果使用LVM管理存储,建议提前安装lvm2包。虽然本次演示使用原始磁盘,但LVM在生产环境中更灵活。
启动服务并设置开机自启:
systemctl enable target --now2.2 存储后端配置
假设我们有一块未使用的磁盘/dev/sdb,首先用fdisk查看状态:
fdisk -l /dev/sdb进入targetcli交互式配置界面:
targetcli创建块存储后端(这里演示原始磁盘用法,生产环境建议使用LVM):
/backstores/block create dev=/dev/sdb name=shared_disk2.3 iSCSI目标创建与访问控制
创建iSCSI目标标识符(遵循iqn命名规范):
/iscsi create iqn.2024-07.com.example:server.disk1将存储后端关联到目标:
/iscsi/iqn.2024-07.com.example:server.disk1/tpg1/luns create /backstores/block/shared_disk设置访问控制列表(ACL),只允许特定客户端连接:
/iscsi/iqn.2024-07.com.example:server.disk1/tpg1/acls create iqn.2024-07.com.example:client.node1配置监听地址(替换为你的服务器IP):
/iscsi/iqn.2024-07.com.example:server.disk1/tpg1/portals create 192.168.1.100最终配置结构应该类似:
o- / .......................................................................................................... [...] o- backstores ............................................................................................. [...] | o- block ................................................................................ [Storage Objects: 1] | | o- shared_disk ................................................... [/dev/sdb (0 bytes) write-thru activated] o- iscsi ................................................................................................ [Targets: 1] o- iqn.2024-07.com.example:server.disk1 ............................................................... [TPGs: 1] o- tpg1 ........................................................................................ [gen-acls, no-auth] o- acls ................................................................................................ [ACLs: 1] | o- iqn.2024-07.com.example:client.node1 ....................................................... [Mapped LUNs: 1] | o- mapped_lun0 ......................................................... [lun0 block/shared_disk (rw)] o- luns ................................................................................................ [LUNs: 1] | o- lun0 ................................................ [block/shared_disk (/dev/sdb) (default_tg_pt_gp)] o- portals .......................................................................................... [Portals: 1] o- 192.168.1.100:3260 ................................................................................... [OK]输入exit保存退出,然后重启服务使配置生效:
systemctl restart target2.4 防火墙与SELinux配置
开放iSCSI默认端口:
firewall-cmd --permanent --add-port=3260/tcp firewall-cmd --reload如果使用SELinux,需要调整策略:
setsebool -P iscsid_use_tcp_port=13. 客户端连接指南
3.1 客户端环境准备
在需要连接iSCSI存储的客户端机器上安装必要软件:
yum install -y iscsi-initiator-utils编辑initiator名称配置文件,必须与服务端ACL设置的名称一致:
echo "InitiatorName=iqn.2024-07.com.example:client.node1" > /etc/iscsi/initiatorname.iscsi启动服务:
systemctl enable iscsid --now3.2 发现与连接存储
发现目标存储:
iscsiadm -m discovery -t st -p 192.168.1.100建立连接:
iscsiadm -m node -T iqn.2024-07.com.example:server.disk1 -p 192.168.1.100 -l设置开机自动连接:
iscsiadm -m node -T iqn.2024-07.com.example:server.disk1 -p 192.168.1.100 --op update -n node.startup -v automatic验证磁盘是否可见:
lsblk你应该能看到新磁盘(通常是/dev/sdX,具体字母取决于现有磁盘数量)。
3.3 磁盘初始化与挂载
分区(如果需要):
fdisk /dev/sdX创建文件系统(以ext4为例):
mkfs.ext4 /dev/sdX1创建挂载点并设置自动挂载:
mkdir /mnt/iscsi_disk echo "/dev/sdX1 /mnt/iscsi_disk ext4 _netdev 0 0" >> /etc/fstab mount -a4. 常见问题排查指南
4.1 连接失败排查步骤
检查网络连通性:
ping 192.168.1.100 telnet 192.168.1.100 3260验证服务状态:
systemctl status target # 服务端 systemctl status iscsid # 客户端检查ACL名称匹配:
- 服务端:
targetcli ls /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/acls - 客户端:
cat /etc/iscsi/initiatorname.iscsi
- 服务端:
查看日志信息:
journalctl -u target -f # 服务端 journalctl -u iscsid -f # 客户端
4.2 性能优化建议
网络配置:
- 使用独立的网络接口用于iSCSI流量
- 启用Jumbo Frame(MTU=9000)
存储配置:
# 调整IO调度器为deadline echo 'ACTION=="add|change", KERNEL=="sd*", ATTR{queue/scheduler}="deadline"' > /etc/udev/rules.d/60-iscsi.rules客户端参数优化:
# 增加队列深度 echo "options scsi_mod cmd_per_lun=32" > /etc/modprobe.d/iscsi.conf
4.3 多路径配置(可选)
对于高可用环境,建议配置多路径IO:
yum install -y device-mapper-multipath mpathconf --enable --with_multipathd y配置示例(/etc/multipath.conf):
devices { device { vendor "LIO-ORG" product "*" path_grouping_policy "failover" path_selector "round-robin 0" rr_weight "uniform" } }5. 高级应用场景
5.1 作为虚拟机存储后端
在KVM环境中,可以直接使用iSCSI磁盘作为虚拟机存储:
<disk type='network' device='disk'> <driver name='qemu' type='raw'/> <source protocol='iscsi' name='iqn.2024-07.com.example:server.disk1/0'> <host name='192.168.1.100' port='3260'/> </source> <target dev='vdb' bus='virtio'/> </disk>5.2 自动化部署脚本
对于需要批量部署的场景,可以使用非交互式配置:
# 服务端自动化配置 targetcli /backstores/block create dev=/dev/sdb name=shared_disk targetcli /iscsi create iqn.2024-07.com.example:server.disk1 targetcli /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/luns create /backstores/block/shared_disk targetcli /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/acls create iqn.2024-07.com.example:client.node1 targetcli /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/portals create 192.168.1.1005.3 安全加固措施
启用CHAP认证:
/iscsi/iqn.2024-07.com.example:server.disk1/tpg1 set attribute authentication=1 /iscsi/iqn.2024-07.com.example:server.disk1/tpg1 set attribute generate_node_acls=0 /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/acls/iqn.2024-07.com.example:client.node1 set auth userid=username /iscsi/iqn.2024-07.com.example:server.disk1/tpg1/acls/iqn.2024-07.com.example:client.node1 set auth password=password网络隔离:
- 使用VLAN隔离iSCSI流量
- 配置防火墙只允许特定IP访问3260端口
定期更新:
yum update targetcli -y
在实际项目中,我发现iSCSI最令人惊喜的是它的稳定性——曾经有个配置好的iSCSI磁盘连续工作了600多天没有出现任何问题。对于需要频繁访问远程存储的场景,这绝对比U盘拷贝或NFS共享可靠得多。