Linux存储共享配置(NFS、iSCSI)
NFS 配置
NFS服务端
安装服务端
sudo yum install -y nfs-utils

创建文件夹
mkdir nfs
# 赋予适当的权限,确保客户端写入时不会遇到 Permission denied
sudo chmod 755 nfs
#筛选出NFS 服务的系统用户信息。
cat /etc/passwd | grep -E 'nfs|nobody'
#将nfs的所有者和用户组修改为系统内置的nobody账户。
sudo chown nobody:nobody nfs
#检查权限是否正确(应该显示为 nobody nobody)
ls -ld nfs

编辑 NFS 的核心配置文件
sudo vi /etc/exports
#添加以下内容
/nfs 192.168.10.0/24(rw,sync,no_subtree_check,root_squash)
# 热挂载刷新
exportfs -arv

| 参数 | 说明 | 作用 |
|---|---|---|
/nfs | 服务端本地需要共享出去的绝对路径目录。 | 必须是真实存在的物理目录,且建议所有者设为 nobody:nobody。 |
192.168.10.0/24 | 限制允许挂载该目录的客户端网段/IP。 | 只有在这个网段内的机器才有资格挂载,起到第一层网络安全隔离作用。 |
rw | Read-Write(读写模式)。允许客户端对该目录进行读取和写入操作。 | 如果只想让客户端看、不想让其修改,可以改为 ro(Read-Only,只读)。 |
sync | 同步写入。数据必须真正落入服务端的磁盘后,才向客户端返回确认。 | 数据最安全:防止因服务端突然断电导致客户端以为“已写入”的数据丢失。对应的参数是 async(异步,性能高但断电易丢数据)。 |
no_subtree_check | 禁用子树检查。当客户端请求一个文件时,NFS 服务器不检查该文件是否属于被导出目录的某个特定子树。 | 极大提升性能与稳定性:虽然略微降低了一点点安全性,但能有效避免在客户端频繁删除/重命名文件时引发的各种诡异报错。 |
root_squash | Root 权限压制(默认开启)。当客户端以 root 身份在挂载点写入文件时,服务端会将其强行降权映射为匿名用户(nobody)。 | 安全核心:防止外部客户端的 root 用户直接掌控服务端宿主机的物理目录,避免恶意软件利用 root 权限污染服务端。 |
放行防火墙
# 允许防火墙放行 nfs、rpc-bind 和 mountd 服务
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
#重新加载防火墙规则让其立刻生效
firewall-cmd --reload

启动服务并设置开机自启动
systemctl enable --now rpcbind nfs-server
# 本地探测
showmount -e 192.168.10.21

NFS客户端
sudo yum install -y nfs-utils

探测服务端共享状态
showmount -e 192.168.10.21

创建本地挂载点并手动挂载
mkdir /nfs
# 显式指定 nfs4 协议挂载
mount -t nfs4 192.168.10.20:/nfs /nfs/
#校验
df -h

开机自动挂载
sudo vi /etc/fstab
#添加以下内容
192.168.10.20:/nfs /nfs/ nfs4 defaults,_netdev,nofail,x-systemd.automount 0 0
#验证文件
mount -a
#校验
df -h

| 参数 | 说明 | 作用 |
|---|---|---|
defaults | 包含一组默认的本地硬盘常规权限(rw, suid, dev, exec, auto, nouser, async)。 | 适用于本地磁盘;若网络存储只用此参数,极易在断网时导致系统开机卡死。 |
_netdev | 明确标记该设备为网络文件系统。通知系统在网卡完全启动、获取到 IP 地址之前,不要尝试挂载此目录。 | 防止开机卡顿:避免系统在网络尚未就绪时盲目连接远端存储导致超时报错。 |
nofail | 允许该设备挂载失败。即使远端 NFS 服务器离线或网络彻底不通,系统也会跳过报错继续开机。 | 保障业务高可用:避免因存储服务器故障导致客户端整机无法开机或掉入紧急修复模式(Emergency Mode)。 |
x-systemd.automount | 由 systemd 接管,开启按需动态挂载(懒加载)。开机时不建立连接,只有在用户、脚本或容器真正访问该目录时才触发挂载。 | 解耦网络依赖:极大提升系统启动速度;在容器环境(Docker/K8s)中能有效防止因存储响应慢导致容器初始化失败。 |
iSCSI 配置
iSCSI服务端
安装并设置开机自启
# 安装 targetcli
sudo yum install -y targetcli
# 启动并设置开机自启
sudo systemctl enable --now target

使用 targetcli 交互式命令行配置存储
targetcli
# 进入后端块设备目录,创建一个名为 "iscsi_storage" 的存储对象,绑定物理盘 /dev/sdb
cd /backstores/block
create name=iscsi_storage dev=/dev/sdb
# 创建一个 iSCSI Target(目标终端),IQN 格式为 iqn.年-月.域名反写:自定义标识
cd /iscsi
create iqn.2026-06.com.iscsi:server
# 创建 LUN(逻辑单元号),将前面的物理块设备与刚才创建的 Target 绑定
cd iqn.2026-06.com.iscsi:server/tpg1/luns
create /backstores/block/iscsi_storage
# 配置 ACL(访问控制列表),限制【只有】指定 IQN 的客户端才能挂载(非常重要!)
cd ../acls
create iqn.2026-06.com.iscsi:client
# 保存配置并退出
cd /
saveconfig
exit

放行防火墙端口
# 允许防火墙放行 target 服务
firewall-cmd --permanent --add-service=iscsi-target
#重新加载防火墙规则让其立刻生效
firewall-cmd --reload

iSCSI客户端
安装 iSCSI 客户端工具
sudo yum install -y iscsi-initiator-utils
更改客户端的 IQN(必须与服务端 ACL 一致)
#编辑客户端的 initiatorname 配置文件:
sudo vi /etc/iscsi/initiatorname.iscsi
#修改为刚才在服务端 ACL 里放行的那个名字:
InitiatorName=iqn.2026-06.com.iscsi:client
修改完成后,重启客户端 iSCSI 服务让名称生效:
sudo systemctl restart iscsid
发现(Discovery)存储服务端
#让客户端去网络上侦测服务端有哪些可用的 Target:
iscsiadm -m discovery -t sendtargets -p 192.168.10.20:3260
登录(Login)连接块设备
#执行登录命令,正式把硬盘通过网络“插”到本地:
iscsiadm -m node -T iqn.2026-06.com.iscsi:server -p 192.168.10.20:3260 -l
验证是否多了硬盘
lsblk
