
NFS /iSCSI 实战笔记NFS 服务器NFS 服务介绍在计算机网络存储领域NFS (Network File System, 网络文件系统) 是一种实现不同计算机之间文件共享的经典技术。它允许网络中的客户端计算机像访问本地文件一样透明地访问远程服务器上的文件资源极大地简化了跨设备的数据共享与管理流程。NFS 的起源与发展NFS 技术诞生于 20 世纪 80 年代由太阳微系统公司 (Sun Microsystems) 率先开发。最初的设计目标是解决 UNIX 系统之间的文件共享问题凭借其简洁的架构和良好的跨平台性迅速成为网络文件共享的主流标准之一。随着技术的演进NFS 经历了多个版本的迭代。其中NFSv3 是应用最为广泛的版本之一它在早期版本的基础上增强了性能和可靠性支持更大的文件尺寸和更多的功能。而 NFSv4 则是较新的版本引入了更强的安全性 (如支持 Kerberos 认证)、状态化连接以及更完善的文件锁机制进一步提升了 NFS 在复杂网络环境中的适用性。NFS 的核心架构NFS 采用客户端 - 服务器 (Client-Server) 架构主要由两部分组成:NFS 服务器: 负责存储文件资源并通过 NFS 协议将这些资源共享给授权的客户端。服务器上运行着 NFS 守护进程用于监听客户端的请求、处理文件访问操作以及维护共享目录的权限控制。NFS 客户端: 通过 NFS 协议访问服务器上的共享文件。客户端需要挂载 (Mount) 服务器的共享目录到本地文件系统之后就可以像操作本地文件一样对远程文件进行读写、创建、删除等操作。NFS 的工作原理1.注册阶段:NFS 服务端启动服务时向 RPC 服务注册服务端口。2.建立连接阶段: 客户端向 RPC 服务器查询 NFS 服务器服务端口然后再向 NFS 服务器的服务端口发起挂载请求。3.挂载阶段: 服务器验证客户端的身份和权限如果通过验证则允许客户端将共享目录挂载到本地指定的挂载点。4.文件访问阶段: 挂载成功后客户端对远程文件的操作 (如读取、写入) 会通过 RPC 协议转换为对服务器的远程过程调用。服务器接收到请求后执行相应的文件操作并将结果返回给客户端。5.权限控制:NFS 通过文件系统的权限机制 (如 UNIX 的用户 ID 和组 ID) 来控制客户端对文件的访问。服务器会根据客户端的身份以及共享目录的权限设置决定是否允许客户端的操作。NFS 的数据传输特点无状态性 (部分版本):NFSv3 及之前的版本属于无状态协议服务器不保存客户端的连接状态信息。这意味着如果服务器或网络出现故障客户端重新连接后即可继续操作无需恢复复杂的状态信息简化了协议的实现和容错处理。基于 UDP 和 TCP:NFS 可以使用 UDP (用户数据报协议) 或 TCP (传输控制协议) 进行数据传输。UDP 具有较低的开销适用于对实时性要求较高但对可靠性要求相对较低的场景TCP 则提供可靠的面向连接的传输适用于数据传输量大、对可靠性要求高的场景在现代网络中应用更为广泛。NFS 的优势透明性: 客户端访问远程文件的方式与访问本地文件几乎一致用户无需关注文件的实际存储位置降低了使用复杂度。跨平台性:NFS 支持多种操作系统如 UNIX、Linux、macOS 等能够实现不同操作系统之间的文件共享。高效性: 通过优化的数据传输机制和缓存策略NFS 能够提供较高的文件访问性能满足多数网络环境下的文件共享需求。易于管理:NFS 的配置相对简单管理员可以通过修改配置文件轻松设置共享目录、访问权限等便于集中管理网络中的文件资源。NFS 的局限性安全性较弱 (早期版本):NFSv3 及之前的版本在安全性方面存在不足缺乏强大的身份认证和数据加密机制容易受到网络监听、身份伪造等攻击。虽然 NFSv4 引入了更多安全特性但在一些对安全性要求极高的场景中仍需配合其他安全措施 (如 VPN、防火墙) 使用。对网络依赖性强:NFS 的性能和可用性高度依赖网络状况网络延迟、丢包等问题会直接影响文件访问的速度和稳定性。文件锁机制复杂: 在多客户端同时访问同一文件时NFS 的文件锁机制相对复杂处理不当可能导致数据不一致的问题。NFS 的典型应用场景企业内部文件共享: 在企业局域网中NFS 可以用于共享办公文档、软件安装包等资源方便员工在不同的计算机上访问和协作。服务器集群存储: 在 Web 服务器集群、数据库集群等场景中NFS 可以为集群中的所有节点提供统一的共享存储确保各节点访问的数据一致性。嵌入式系统: 在一些嵌入式设备 (如网络存储设备、路由器等) 中NFS 可以作为简单的文件共享解决方案实现设备与外部计算机的数据交互。NFS 服务最佳实践节点名称 ip 地址 作用nfs-server 10.1.8.20/24 提供共享存储nfs-client1 10.1.8.21/24 NFS 客户端nfs-client2 10.1.8.22/24 NFS 客户端使用 centos7 模板克隆出三台分别命名为 nfs-server,nfs-client1,nfs-client2nfs-server 主机配置命令[rootlocalhost ~]# hostnamectl set-hostname nfs-server [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33nfs-client1 主机配置命令[rootlocalhost ~]# hostnamectl set-hostname nfs-client1 [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 10.1.8.21/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33nfs-client2 主机配置命令[rootlocalhost ~]# hostnamectl set-hostname nfs-client2 [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 10.1.8.22/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33部署服务安装软件包服务端执行 [rootnfs-server ~]# yum install -y nfs-utils [rootnfs-server ~]# yum install -y httpd 准备共享目录 [rootnfs-server ~]# mkdir -p /shares/webapp [rootnfs-server ~]# chown apache /shares/webapp/ 启用并启动服务 [rootnfs-server ~]# systemctl enable nfs-server --now 关闭防火墙服务 [rootnfs-server ~]# systemctl stop firewalld配置 NFS 导出[rootnfs-server ~]# vim /etc/exports /shares/webapp 10.1.8.0/24(rw) [rootnfs-server ~]# systemctl reload nfs-server监视 NFS 导出简单查看当前导出目录 [rootnfs-server ~]# exportfs /shares/webapp 10.1.8.0/24 详细查看导出全部参数 exportfs -v /shares/webapp 10.1.8.0/24(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,root_squash,no_all_squash)客户端挂载安装软件包 [rootnfs-client1 ~]# yum install -y nfs-utils httpd 查看 apache 用户 ID [rootnfs-client1 ~]# id apache uid48(apache) gid48(apache) groups48(apache) 启动 httpd 服务 [rootnfs-client1 ~]# systemctl enable httpd --now 关闭防火墙 [rootnfs-client1 ~]# systemctl stop firewalld 查看服务端提供的共享 [rootnfs-client1 ~]# showmount -e 10.1.8.20 Export list for 10.1.8.20: /shares/webapp 10.1.8.0/24 手动挂载 NFS 共享 [rootnfs-client1 ~]# mount -t nfs 10.1.8.20:/shares/webapp /var/www/html 验证挂载结果 [rootnfs-client1 ~]# df -h | grep www 10.1.8.20:/shares/webapp 50G 4.4G 46G 9% /var/www/html root用户创建文件权限拒绝 [rootnfs-client1 ~]# touch /var/www/html/root-f1 touch: cannot touch ‘/var/www/html/root-f1’: Permission denied 切换apache用户创建文件正常 [rootnfs-client1 ~]# su -l -s /bin/bash apache -bash-4.2$ echo apache website /var/www/html/web1.html服务端修改配置开启 no_root_squash修改 exports 配置 [rootnfs-server ~]# vim /etc/exports /shares/webapp 10.1.8.0/24(rw,no_root_squash) 重载配置 [rootnfs-server ~]# exportfs -r [rootnfs-server ~]# exportfs -v 客户端重新测试 root 创建文件 [rootnfs-client1 ~]# touch /var/www/html/root-f1 [rootnfs-client1 ~]# ls /var/www/html root-f1 web1.htmlnfs-client2 客户端配置安装软件包 [rootnfs-client2 ~]# yum install -y nfs-utils httpd 查看 apache 用户 ID [rootnfs-client2 ~]# id apache uid48(apache) gid48(apache) groups48(apache) 启动 httpd 服务 [rootnfs-client2 ~]# systemctl enable httpd --now 关闭防火墙 [rootnfs-client2 ~]# systemctl stop firewalld 查询服务端共享 [rootnfs-client2 ~]# showmount -e 10.1.8.20 Export list for 10.1.8.20: /shares/webapp 10.1.8.0/24 挂载共享目录 [rootnfs-client2 ~]# mount -t nfs 10.1.8.20:/shares/webapp /var/www/html 验证挂载 [rootnfs-client2 ~]# df -h | grep www 10.1.8.20:/shares/webapp 50G 4.4G 46G 9% /var/www/html多客户端共享数据互通测试client1 创建测试文件 [rootnfs-client1 ~]# touch /var/www/html/xiyangyang client2 查看可同步看到文件证明共享存储统一 [rootnfs-client2 ~]# ls /var/www/html/ root-f1 web1.html xiyangyang 集群网站统一页面实战测试 client1 创建首页文件 [rootnfs-client1 ~]# echo heihei /var/www/html/index.html client1、client2 访问网页内容完全一致开机自动持久化挂载 /etc/fstabnfs-client1 设置开机挂载 [rootnfs-client1 ~]# vim /etc/fstab 10.1.8.20:/shares/webapp /var/www/html nfs defaults 0 0 nfs-client2 设置开机挂载 [rootnfs-client2 ~]# vim /etc/fstab 10.1.8.20:/shares/webapp /var/www/html nfs defaults 0 0 重启验证iSCSI 服务器iSCSI 服务介绍SCSISmall Computer System Interface小型计算机系统接口一种用于计算机和智能设备之间硬盘、软驱、光驱、打印机、扫描仪等连接标准。iSCSIInternet Small Computer System InterfaceInternet 小型计算机系统接口)又称为IPSAN是IBM公司研究开发的IP SAN技术该技术是将现有SCSI接口与以太网络(Ethernet)技术结合基于TCP/IP的协议连接iSCSI服务端Target和客户端(Initiator)使得封装后的SCSI数据包可以在互联网传输最终实现iSCSI服务端提供存储给客户端。通常iSCSI使用专用的10 Gb以太网或更好的网络以最大程度地提高性能。从物理服务器到存储的电缆通常封闭在数据中心内并且理想情况下不直接连接到LAN网络所以SAN流量通常不加密以最大程度地提高性能。 为了实现WAN安全iSCSI管理员可以使用IPsec加密流量。iSCSI 架构iSCSI 服务是 C/S 架构。访问的 iSCSI 目标在客户端系统上显示为本地且未格式化的 SCSI 快设备等同于通过 SCSI 布线、FC 直连或 FC 交换光线连接的设备。InitiatoriSCSI 客户端通常以软件方式部署也可以使用 iSCSI Host Bus Adapters (HBAs)(HBA) 硬件。Initiator 必须具有唯一的名称请参见 IQN。TargetiSCSI 服务器上的 iSCSI 存储资源。Target 必须具有唯一的名称请参见 IQN。每个目标都提供一个或多个块设备或逻辑单元LUN‑logical units。在大多数情况下Target 只提供一个设备但一台服务器可以提供多个目标。IQNiSCSI Qualified Name全球唯一的名称用于标识发起者和目标。IQN 具有以下格式iqn.YYYY‑MM.com.reversed.domain:name_stringYYYY‑MM年和月。示例2020 年 6 月为 2020‑06。该日期有助于确保 IQN 唯一性。com.reversed.domain反向域名。例如storage.laogao.cloud 的反向域名为 cloud.laogao.storage。name_string用于标识您管理的特定目标。如果服务器只具有一个目标则有时会省略此名称。Portal指定服务器监听的地址和端口例如172.25.250.50:3260。LUNLogical Unit Number代表 Target 提供的块设备。每个目标可以提供一个或多个 LUN。ACLAccess Control List使用 Initiator 的 IQN 限制客户端访问 Target。TPGTarget Portal Group是目标的完整配置包括 PortalLUN 和 ACL。几乎所有目标都使用一个 TPG但是高级配置有时可能会定义多个 TPG。discovery查询服务器上有 Target 列表。login向 Target 验证验证通过后即可以使用 Target 服务器提供的块设备。配置 iSCSI Targets使用centos7模板克隆出iscsi-server,iscsi-clientiscsi‑server: [rootlocalhost ~]# hostnamectl set‑hostname iscsi‑server [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33 [rootlocalhost ~]# systemctl disable firewalld --now [rootlocalhost ~]# setenforce 0 iscsi‑client: [rootlocalhost ~]# hostnamectl set‑hostname iscsi‑client [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33 [rootlocalhost ~]# systemctl disable firewalld --now [rootlocalhost ~]# setenforce 0配置iscsi-servertargetd服务端软件。targetclitargetd服务配置工具。安装软件 [rootiscsi-server ~]# yum install -y targetd targetcli 启用并启动服务 [rootiscsi-server ~]# systemctl enable target --now 关闭防火墙 [rootiscsi-server ~]# systemctl stop firewalld当您不带任何选项运行targetcli时该命令将进入交互模式。[rootiscsi-server ~]# targetcli / cd /backstores/block /backstores/block create myblock1 /dev/sdb Created block storage object myblock1 using /dev/sdb. 配置 Target IQN /backstores/block cd /iscsi /iscsi create iqn.2026-04.cloud.laogao.iscsi-server:disk1 Created target iqn.2026-04.cloud.laogao.iscsi-server:disk1. Created TPG 1. Global pref auto_add_default_portaltrue Created default portal listening on all IPs (0.0.0.0), port 3260. /iscsi /iscsi ls o- iscsi .......................................................... [Targets: 1] o- iqn.2026-04.cloud.laogao.iscsi-server:disk1 ..................... [TPGs: 1] o- tpg1 ............................................. [no-gen-acls, no-auth] o- acls ........................................................ [ACLs: 0] o- luns ........................................................ [LUNs: 0] o- portals .................................................. [Portals: 1] o- 0.0.0.0:3260 ................................................... [OK] /iscsi 配置 LUN # 把提前做好的后端存储 myblock1也就是/dev/sdb绑定成LUN对外共享 /iscsi cd /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/luns /iscsi/iqn.20...sk1/tpg1/luns create /backstores/block/myblock1 Created LUN 0 配置 ACL /iscsi/iqn.20...sk1/tpg1/luns cd /iscsi/iqn.2026-04.cloud.laogao.iscsi server:disk1/tpg1/acls /iscsi/iqn.20...sk1/tpg1/acls create iqn.2026-04.cloud.laogao.iscsi-client Created Node ACL for iqn.2026-04.cloud.laogao.iscsi-client Created mapped LUN 0. 配置 Portal /iscsi/iqn.20...sk1/tpg1/acls cd /iscsi/iqn.2026-04.cloud.laogao.iscsi server:disk1/tpg1/portals/ /iscsi/iqn.20.../tpg1/portals delete 0.0.0.0 3260 Deleted network portal 0.0.0.0:3260 /iscsi/iqn.20.../tpg1/portals create 10.1.8.10 3260 Using default IP port 3260 Created network portal 10.1.8.10:3260. 保存配置 /iscsi/iqn.20.../tpg1/portals exit Global pref auto_save_on_exittrue Configuration saved to /etc/target/saveconfig.json非交互式管理 Targets-继续[rootiscsi-server ~]# targetcli /backstores/block create myblock2 /dev/sdc Created block storage object myblock2 using /dev/sdc. [rootiscsi-server ~]# targetcli /iscsi create iqn.2026-04.cloud.laogao.iscsi-server:disk2 Created target iqn.2026-04.cloud.laogao.iscsi-server:disk2. Created TPG 1. Default portal not created, TPGs within a target cannot share ip:port. rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk2/tpg1/luns create /backstores/block/myblock2 Created LUN 0. [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk2/tpg1/acls create iqn.2026-04.cloud.laogao.iscsi-client Created Node ACL for iqn.2026-04.cloud.laogao.iscsi-client Created mapped LUN 0. [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk2/tpg1/portals delete 0.0.0.0 3260 No such NetworkPortal in configfs: /sys/kernel/config/target/iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk2/tpgt_1/np/0.0.0.0:3260 [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk2/tpg1/portals create 10.1.8.10 3260 Using default IP port 3260 Created network portal 10.1.8.10:3260. [rootiscsi-server ~]# targetcli saveconfig Last 10 configs saved in /etc/target/backup/. Configuration saved to /etc/target/saveconfig.json访问 iSCSI 存储安装客户端 [rootiscsi-client ~]# yum install -y iscsi-initiator-utils [rootiscsi-client ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorNameiqn.2026-04.cloud.laogao.iscsi-client 连接 iSCSI 目标首先需要发现目标 [rootiscsi-client ~]# iscsiadm -m discovery -t st -p 10.1.8.10 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk1 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk2 [rootiscsi-client ~]# iscsiadm -m node -T iqn.2026-04.cloud.laogao.iscsi-server:disk1 -l Logging in to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi server:disk1, portal: 10.1.8.10,3260] (multiple) Login to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] successful.格式化 iSCSI 设备# 假设客户端发现的设备名称是/dev/sdb [rootiscsi-client ~]# mkfs.xfs /dev/sdb meta-data/dev/sdb isize512 agcount4, agsize1310720 blks sectsz512 attr2, projid32bit1 crc1 finobt0, sparse0 data bsize4096 blocks5242880, imaxpct25 sunit0 swidth0 blks naming version 2 bsize4096 ascii-ci0 ftype1 log internal log bsize4096 blocks2560, version2 sectsz512 sunit0 blks, lazy‑count1 realtime none extsz4096 blocks0, rtextents0 # 挂载测试 [rootiscsi-client ~]# mkdir /sdb [rootiscsi-client ~]# mount /dev/sdb /sdb [rootiscsi-client ~]# echo xixihaha /sdb/test [rootiscsi-client ~]# cat /sdb/test xixihaha [rootiscsi-client ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 199G 0 part ├─centos‑root 253:0 0 50G 0 lvm / ├─centos‑swap 253:1 0 7.9G 0 lvm [SWAP] └─centos‑home 253:2 0 141.1G 0 lvm /home sdb 8:16 0 20G 0 disk /sdb sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64持久化挂载[rootiscsi-client ~]# vim /etc/fstab UUID0461e240-7743-47fe-876b-6df8b8e7ebf8 /sdb xfs defaults,_netdev 0 0 还需要确保服务iscsi开机自动启动该服务默认是开机自动启动的。 [rootiscsi-client ~]# systemctl enable iscsi 重启观察现象 [rootiscsi-client ~]# reboot [rootiscsi-client ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 199G 0 part ├─centos‑root 253:0 0 50G 0 lvm / ├─centos‑swap 253:1 0 7.9G 0 lvm [SWAP] └─centos‑home 253:2 0 141.1G 0 lvm /home sdb 8:16 0 20G 0 disk /sdb sdc 8:32 0 20G 0 disk 断开目标连接 [rootiscsi-client ~]# umount /sdb [rootiscsi-client ~]# iscsiadm -m node -T iqn.2026-04.cloud.laogao.iscsi-server:disk1 -p 10.1.8.10:3260 -u Logging out of session [sid: 1, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] Logout of [sid: 1, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] successful. [rootiscsi-client ~]# iscsiadm -m session tcp: [2] 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk2 (non-flash) [rootiscsi-client ~]# iscsiadm -m node 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk1 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk2 删除 iSCSI 目标的本地记录以使启动器在引导过程中不会自动登录到目标。 [rootiscsi-client ~]# iscsiadm -m node -T iqn.2026-04.cloud.laogao.iscsi-server:disk1 -p 10.1.8.10:3260 -o delete [rootiscsi-client ~]# iscsiadm -m node 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk2可能出现的故障如果发现成功但是启动器登录到发现的目标时遇到问题则该问题很可能与访问控制或身份验证有关。客户端上的IQN与服务器上的IQN不匹配会导致目标登录失败。可能是客户端上的启动器IQN不正确引起的请在客户端的/etc/iscsi/initiatorname.iscsi文件中修复IQN然后重新启动iscsid服务以使更改生效。[rootiscsi-client ~]# vim /etc/iscsi/initiatorname.iscsi # 重启 iscsid 服务释放之前客户端扫描时使用的IQN。 [rootiscsi-client ~]# systemctl restart iscsid # 重新发现 [rootiscsi-client ~]# iscsiadm -m discovery -t st -p 10.1.8.10 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk1 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk2 # 重新登录 [rootiscsi-client ~]# iscsiadm -m node -T iqn.2026-04.cloud.laogao.iscsi-server:disk1 -l Logging in to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] (multiple) Login to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10] successful.多路径访问什么是多路径多路径是指服务器和存储阵列存在多个物理连接方式使用虚拟设备这种方式可以提供更加弹性的存储连接一个路径down掉不会影响连接性也可以聚合存储带宽提供性能。多路径由dm-multipath子系统提供使用内核device mapper系统获得虚拟设备有multipathd进程和multipath命令行工具管理。软件包device-mapper-multipath提供必要的binaries daemon和kernel modules。安装、配置、启动后多路径设备节点会创建在两个位置。出于管理目的multipath设备创建在/dev/mapper如果选择了user-friendly名称这些设备也可以命名为mpathN[pM]或者配置在World Wide IDWWID之后。管理员也可以自定义多路径设备名这些自定义名称在multipaths配置文件的multipaths部分使用alias选项定义。多路径设备也会创建在/dev目录格式/dev/dm-N与/dev/mapper下的文件匹配。这些设备提供给系统内部使用禁止管理目的直接使用。重要多路径提供存储访问路径down情况的保护。如果存储本身不可用访问访问存储也会不可用。创建多路径设备不同的路径将会合并到组中取决于/etc/multipath.conf配置。典型情况同一时刻只能激活一个组一个组可以包含多个路径。当某个组故障多路径进程将切换流量到不同组中。准备工作iscsi-server: [rootlocalhost ~]# hostnamectl set-hostname iscsi-server [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33 [rootlocalhost ~]# nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.10/24 autoconnect yes [rootlocalhost ~]# nmcli connection up ens36 iscsi-client: [rootlocalhost ~]# hostnamectl set-hostname iscsi-client [rootlocalhost ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes [rootlocalhost ~]# nmcli connection up ens33 [rootlocalhost ~]# nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.11/24 autoconnect yes [rootlocalhost ~]# nmcli connection up ens36 验证连通性 [rootiscsi-client ~]# ping -c2 10.1.1.10 PING 10.1.1.10 (10.1.1.10) 56(84) bytes of data. 64 bytes from 10.1.1.10: icmp_seq1 ttl64 time0.435 ms 64 bytes from 10.1.1.10: icmp_seq2 ttl64 time0.319 ms --- 10.1.1.10 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev 0.319/0.377/0.435/0.058 ms [rootiscsi-client ~]# ping -c2 10.1.8.10 PING 10.1.8.10 (10.1.8.10) 56(84) bytes of data. 64 bytes from 10.1.8.10: icmp_seq1 ttl64 time0.502 ms 64 bytes from 10.1.8.10: icmp_seq2 ttl64 time0.258 ms --- 10.1.8.10 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev 0.258/0.380/0.502/0.122 msiscis环境准备[rootiscsi-server ~]# yum install -y targetd targetcli [rootiscsi-server ~]# systemctl enable target --now [rootiscsi-server ~]# firewall-cmd --add-serviceiscsi-target [rootiscsi-server ~]# firewall-cmd --add-serviceiscsi-target --permanent [rootiscsi-server ~]# setenforce 0 [rootiscsi-server ~]# targetcli /backstores/block create myblock1 /dev/sdb [rootiscsi-server ~]# targetcli /iscsi create iqn.2026-04.cloud.laogao.iscsi-server:disk1 [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/luns create /backstores/block/myblock1 [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/acls create iqn.2026-04.cloud.laogao.iscsi-client [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/portals delete 0.0.0.0 3260 [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/portals create 10.1.8.10 3260 [rootiscsi-server ~]# targetcli /iscsi/iqn.2026-04.cloud.laogao.iscsi-server:disk1/tpg1/portals create 10.1.1.10 3260 [rootiscsi-server ~]# targetcli saveconfig配置多路径 [rootiscsi-client ~]# yum install -y device-mapper-multipath [rootiscsi-client ~]# yum install -y iscsi-initiator-utils 启用多路径 创建配置文件 /etc/multipath.conf 最简单的方法是使用mpathconf工具 如果文件不存在使用以下命令生成配置文件。 [rootiscsi-client ~]# mpathconf --enable 启动服务 [rootiscsi-client ~]# systemctl enable multipathd --now 发现设备 [rootiscsi-client ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorNameiqn.2026-04.cloud.laogao.iscsi-client [rootiscsi-client ~]# iscsiadm -m discovery -t st -p 10.1.8.10 10.1.8.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk1 10.1.1.10:3260,1 iqn.2026-04.cloud.laogao.iscsi-server:disk1 [rootiscsi-client ~]# iscsiadm -m node -L all Logging in to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] (multiple) Logging in to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.1.10,3260] (multiple) Login to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.8.10,3260] successful. Login to [iface: default, target: iqn.2026-04.cloud.laogao.iscsi-server:disk1, portal: 10.1.1.10,3260] successful. [rootiscsi-client ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 199G 0 part ├─centos-root 253:0 0 50G 0 lvm / ├─centos-swap 253:1 0 7.9G 0 lvm [SWAP] └─centos-home 253:2 0 141.1G 0 lvm /home sdb 8:16 0 20G 0 disk └─mpatha 253:3 0 20G 0 mpath sdc 8:32 0 20G 0 disk └─mpatha 253:3 0 20G 0 mpath 确定设备是同一设备 [rootiscsi-client ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb 360014052fc732600aa0433fae1758a1a [rootiscsi-client ~]# /usr/lib/udev/scsi_id -g -u /dev/sdc 360014052fc732600aa0433fae1758a1a 监控多路径 [rootiscsi-client ~]# multipath -ll mpatha (360014052fc732600aa0433fae1758a1a) dm-3 LIO-ORG ,myblock1 size20G features0 hwhandler0 wprw |-- policyservice-time 0 prio1 statusactive #statusactive-当前活动路径主路径 | - 3:0:0:0 sdb 8:16 active ready running #sdb是主路径(当前I/O走这条) -- policyservice-time 0 prio1 statusenabled #statusenabled-备用可用路径从路径 - 4:0:0:0 sdc 8:32 active ready running #sdc是备路径(冗余备用) 使用设备 [rootiscsi-client ~]# parted /dev/mapper/mpatha mklabel gpt [rootiscsi-client ~]# parted /dev/mapper/mpatha unit MiB mkpart webapp 1 10241 Warning: The resulting partition is not properly aligned for best performance. Ignore/Cancel? Ignore [rootiscsi-client ~]# mkdir /mpatha1 [rootiscsi-client ~]# mkfs.xfs /dev/mapper/mpatha1 [rootiscsi-client ~]# mount /dev/mapper/mpatha1 /mpatha1 [rootiscsi-client ~]# df -h /mpatha1/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/mpatha1 10G 33M 10G 1% /mpatha1 持久化挂载 [rootiscsi-client ~]# vim /etc/fstab # 最后增加一条 /dev/mapper/mpatha1 /mpatha1 xfs _netdev 0 0 [rootiscsi-client ~]# umount /mpatha1 [rootiscsi-client ~]# mount -a [rootiscsi-client ~]# df -h /mpatha1/ Filesystem Size Used Avail Use% Mounted on /dev/mapper/mpatha1 10G 33M 10G 1% /mpatha1高可用性测试# 确定哪个网卡是主链路备份链路 [rootiscsi-client ~]# iscsiadm -m session -P3 测试1断开iscsi-server端第二块网卡(备份路径) [rootiscsi-server ~]# nmcli device disconnect ens36 [rootiscsi-client ~]# multipath -ll mpatha (360014052fc732600aa0433fae1758a1a) dm-3 LIO‑ORG ,myblock1 size20G features0 hwhandler0 wprw |-- policyservice‑time 0 prio1 statusactive | - 3:0:0:0 sdb 8:16 active ready running -- policyservice‑time 0 prio0 statusenabled - 4:0:0:0 sdc 8:32 failed faulty running #failed faulty 多路径检测发现这条链路异常已经标记为故障路径不再下发 IO现在业务只跑 sdb 这条链路冗余丢失 测试2恢复iscsi-server端第二块网卡sdc再次成为备份路径 # 恢复路径 [rootiscsi-server ~]# nmcli device connect ens36 # 再次查看 [rootiscsi-client ~]# multipath -ll mpatha (360014052fc732600aa0433fae1758a1a) dm-3 LIO‑ORG ,myblock1 size20G features0 hwhandler0 wprw |-- policyservice‑time 0 prio1 statusactive | - 3:0:0:0 sdb 8:16 active ready running -- policyservice‑time 0 prio1 statusenabled - 4:0:0:0 sdc 8:32 active ready running 测试3断开iscsi-server端第一块网卡(主路径) [rootiscsi-server ~]# nmcli device disconnect ens33 [rootiscsi-client ~]# multipath -ll mpatha (360014052fc732600aa0433fae1758a1a) dm-3 LIO‑ORG ,myblock1 size20G features0 hwhandler0 wprw |-- policyservice‑time 0 prio0 statusenabled | - 3:0:0:0 sdb 8:16 failed faulty running -- policyservice‑time 0 prio1 statusactive #主链路故障备链路切换为主链路 - 4:0:0:0 sdc 8:32 active ready running 测试4恢复iscsi-server端第一块网卡 [rootiscsi-server ~]# nmcli device connect ens33 [rootiscsi-client ~]# multipath -ll mpatha (360014052fc732600aa0433fae1758a1a) dm-3 LIO‑ORG ,myblock1 size20G features0 hwhandler0 wprw |-- policyservice‑time 0 prio1 statusenabled | - 3:0:0:0 sdb 8:16 active ready running -- policyservice‑time 0 prio1 statusactive - 4:0:0:0 sdc 8:32 active ready running