NFS 服务器
一、NFS 服务介绍
NFS 是 Network File System 的缩写,即网络文件系统,最早由 Sun 公司开发,用来在 UNIX&Linux 系统间实现磁盘文件共享的一种方法。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。
NFS 客户端(一般为应用服务器,例如 web)可以通过挂载(mount)的方式将 NFS 服务端共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从 NFS 客户端的机器本地看,NFS 服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的 NFS 服务端的目录。
在企业集群架构的工作场景中,NFS 网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在 NFS 共享里,例如,BBS 产品的图片、附件、头像,特别是中小网站公司应用频率更高。
NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS 的功能所对应的端口没有固定住,而是随机取用一些未被使用的小于 1024 的端口提供服务。但如此一来客户端如何获得服务器端的相关端口呢?
此时我们就得需要远程过程调用(RPC)的服务!RPC 最主要的功能是注册每个 NFS 功能所对应的端口,并且汇报给客户端,让客户端可以连结到正确的端口。RPC 定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。
NFS 工作原理
-
NFS 客户端:用户进程 -> 本地文件访问 -> RPC 服务(portmap)-> TCP/IP 协议栈 -> 本地磁盘
-
NFS 服务器端:TCP/IP 协议栈 -> RPC 服务(portmap)-> NFS 服务 -> 本地文件访问 -> 本地磁盘
核心角色说明
-
NFS 服务器:导出文件系统目录及其内容。
-
NFS 客户端:挂载服务器导出的文件系统到本地。
二、NFS 服务部署
配置服务端
NFS 服务由nfs-utils
软件包提供,RHEL8 默认安装了该软件包。以下是完整部署步骤:
bash
# 1.安装软件包
[root@webapp ~ 15:55:32]# yum install -y nfs-utils
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 4.4 kB 00:00:00
epel-debuginfo/x86_64/metalink | 3.6 kB 00:00:00
* epel: ftp-stud.hs-esslingen.de
* epel-debuginfo: ftp-stud.hs-esslingen.de
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
软件包 1:nfs-utils-1.3.0-0.68.el7.2.x86_64 已安装并且是最新版本
# 2. 准备服务用到的各种材料,例如用户、目录等
[root@webapp ~ 17:19:31]# mkdir -p /shares/webapp
[root@webapp ~ 17:22:53]# echo Hello World From Nginx > /shares/webapp/index.html
# 客户端nginx用户的UID为998,客户端nginx用户可以读写该目录
[root@webapp ~ 17:22:53]# echo Hello World From Nginx > /shares/webapp/index.html
[root@webapp ~ 17:23:05]# chown 998 /shares/webapp
[root@webapp ~ 17:23:36]# ll -d /shares/webapp/
drwxrwxr-x 2 chrony root 24 9月 26 10:30 /shares/webapp/
# 3. 配置服务器(修改配置文件)
[root@webapp ~ 17:26:19]# vim /etc/exports.d/webapp.exports
/shares/webapp 192.168.237.0/24(rw)
# 4. 启用并启动服务
[root@webapp ~ 17:26:39]# systemctl enable nfs-server.service --now
[root@webapp ~ 17:26:58]# systemctl is-active nfs-server.service
active
# 5. 配置防火墙
[root@webapp ~ 17:27:04]# systemctl is-active firewalld.service
unknown
配置客户端
bash
# 1. 准备web服务器
[root@backup ~ 15:59:37]# yum install -y nginx
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 4.4 kB 00:00:00
epel-debuginfo/x86_64/metalink | 3.6 kB 00:00:00
* epel: ftp-stud.hs-esslingen.de
* epel-debuginfo: ftp-stud.hs-esslingen.de
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
软件包 1:nginx-1.20.1-10.el7.x86_64 已安装并且是最新版本
# 2. 安装NFS客户端
[root@backup ~ 17:28:51]# yum install -y nfs-utils
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* epel: ftp-stud.hs-esslingen.de
* epel-debuginfo: ftp-stud.hs-esslingen.de
软件包 1:nfs-utils-1.3.0-0.68.el7.2.x86_64 已安装并且是最新版本
# 3. 查看共享并挂载
[root@backup ~ 17:29:06]# showmount -e 192.168.237.106
Export list for 192.168.237.106:
/shares/webapp 192.168.237.0/24
[root@backup ~ 17:29:34]# mount 192.168.237.106:/shares/webapp /usr/share/nginx/html
[root@backup ~ 17:30:01]# df -h /usr/share/nginx/html
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 3.3G 44G 7% /
# 4. 测试web服务器页面
[root@webapp ~ 17:27:19]# curl 192.168.237.107
Hello World From Nginx
# 5. 持久化挂载
[root@webapp ~ 17:31:14]# vim /etc/fstab
#最后添加一条记录
192.168.237.106:/shares/webapp /user/share/nginx/html nfs defaults 0 0
挂载选项补充说明:
客户端的root对于服务器端来说 啥也不是。
默认情况,服务端共享的目录,客户端的root是只具备other用户的权限。
默认共享选项包含root_squash,压缩root权限为nobody。
可以使用选项no_root_squash
iSCSI 服务器
一、iSCSI 服务介绍
1. 核心概念定义
-
SCSI:Small Computer System Interface(小型计算机系统接口),是用于计算机与智能设备(硬盘、软驱、光驱、打印机、扫描仪等)之间连接的标准。
-
iSCSI:Internet Small Computer System Interface(Internet 小型计算机系统接口),又称 IP SAN,由 IBM 公司研发的 IP SAN 技术。该技术将现有 SCSI 接口与以太网技术结合,基于 TCP/IP 协议连接 iSCSI 服务端(Target)和客户端(Initiator),使封装后的 SCSI 数据包可在互联网传输,最终实现 iSCSI 服务端为客户端提供存储服务。
配置 iSCSI 存储
配置服务端
bash
# 1. 安装软件包
[root@webapp ~ 20:44:40]# yum install -y targetcli targetd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 4.4 kB 00:00:00
epel-debuginfo/x86_64/metalink | 3.6 kB 00:00:00
* epel: ftp-stud.hs-esslingen.de
* epel-debuginfo: ftp-stud.hs-esslingen.de
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
软件包 targetcli-2.1.53-1.el7_9.noarch 已安装并且是最新版本
软件包 targetd-0.8.6-1.el7.noarch 已安装并且是最新版本
# 2. 启用并启动服务
[root@webapp ~ 20:48:43]# systemctl enable target --now
# 3. 准备共享块设备
server端添加一个200G SATA接口硬盘
创建分区1 100G 空间分享给客户端
[root@webapp ~ 20:49:08]# parted /dev/sdb mklabel gpt
警告: The existing disk label on /dev/sdb will be destroyed and all data on this
disk will be lost. Do you want to continue?
是/Yes/否/No? y
错误: Partition(s) 1 on /dev/sdb have been written, but we have been unable to
inform the kernel of the change, probably because it/they are in use. As a
result, the old partition(s) will remain in use. You should reboot now before
making further changes.
忽略/Ignore/放弃/Cancel? Ignore
信息: You may need to update /etc/fstab.
[root@webapp ~ 20:49:59]# parted /dev/sdb unit MiB mkpart dbapp 1 102401
信息: You may need to update /etc/fstab.
[root@webapp ~ 20:50:06]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 200G 0 disk
└─sdb1 8:17 0 100G 0 part
# 4. 配置共享块存储
[root@webapp ~ 20:50:20]# targetcli
/> ls
o- / ................................................................................... [...]
o- backstores ........................................................................ [...]
| o- block ............................................................ [Storage Objects: 0]
| o- fileio ........................................................... [Storage Objects: 0]
| o- pscsi ............................................................ [Storage Objects: 0]
| o- ramdisk .......................................................... [Storage Objects: 0]
o- iscsi ...................................................................... [Targets: 0]
o- loopback ................................................................... [Targets: 0
# /backstores 提供后端存储
# /iscsi 配置如何共享后端存储
## 后端存储添加块设备
/> /backstores/block create dev=/dev/sdb1 name=db01
Created block storage object db01 using /dev/sdb1.
/> ls /backstores/block/
o- block ................................................................ [Storage Objects: 1]
o- db01 ...................................... [/dev/sdb1 (100.0GiB) write-thru deactivated]
o- alua ................................................................. [ALUA Groups: 1]
o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized
## 配置如何共享后端存储
# 创建target,后续客户端 会扫描 target
target名称使用IQN来表示
不管是客户端还是服务端都通过IQN来表示自己。
/> /iscsi/ create iqn.2025-09.cloud.zlx.server.x8664:db
Created target iqn.2025-09.cloud.laoma.server.x8664:db.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/> ls /iscsi/
o- iscsi ........................................................................ [Targets: 1]
o- iqn.2025-09.cloud.zlx.server.x8664:db ....................................... [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
# 切换相应目录
/> cd /iscsi/iqn.2025-09.cloud.laoma.zlx.x8664:db/tpg1/
/iscsi/iqn.20...x8664:db/tpg1> ls
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
# 配置放行客户端(iqn.2025-09.cloud.zlx.server.x8664:db)
/iscsi/iqn.20...x8664:db/tpg1> acls/ create iqn.2025-09.cloud.laoma.server.x8664:webapp
Created Node ACL for iqn.2025-09.cloud.laoma.server.x8664:webapp
Created mapped LUN 0.
# 配置客户端可以访问的设备
/iscsi/iqn.20...x8664:db/tpg1> luns/ create /backstores/block/db01
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2025-09.cloud.laoma.server.x8664:webapp
# 验证配置
/iscsi/iqn.20...x8664:db/tpg1> ls
o- tpg1 ............................................................... [no-gen-acls, no-auth]
o- acls .......................................................................... [ACLs: 1]
| o- iqn.2025-09.cloud.zlx.server.x8664:webapp .............................. [Mapped LUNs: 1]
| o- mapped_lun0 .................................................. [lun0 block/db01 (rw)]
o- luns .......................................................................... [LUNs: 1]
| o- lun0 ...................................... [block/db01 (/dev/sdb1) (default_tg_pt_gp)]
o- portals .................................................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................................................... [OK]
# 退出配置
/iscsi/iqn.20...x8664:db/tpg1> exit
配置客户端
bash
# 1. 安装软件包
[root@backup ~ 20:45:02]# yum install -y iscsi-initiator-utils
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
epel/x86_64/metalink | 4.4 kB 00:00:00
epel-debuginfo/x86_64/metalink | 3.6 kB 00:00:00
* epel: ftp-stud.hs-esslingen.de
* epel-debuginfo: ftp-stud.hs-esslingen.de
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
软件包 iscsi-initiator-utils-6.2.0.874-22.el7_9.x86_64 已安装并且是最新版本
无须任何处理
# 2. 设置客户端的IQN
[root@backup ~ 20:55:56]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2025-09.cloud.zlx.webapp.x8664:webapp
# 3. 扫描目标
[root@backup ~ 20:57:10]# iscsiadm -m discovery -t st -p 192.168.237.106
192.168.237.106:3260,1 iqn.2025-09.cloud.zlx.webapp.x8664.db
# 4. 挂载设备
[root@backup ~ 20:57:59]# iscsiadm -m node -Tiqn.2025-09.cloud.zlx.webapp.x8664.db -l
Logging in to [iface: default, target: iqn.2025-09.cloud.zlx.webapp.x8664.db, portal: 192.168.237.110,3260] (multiple)
# 5. 识别为本地硬盘 sdb
[root@backup ~ 20:59:01]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part
├─centos-root 253:0 0 47G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
└─mpatha 253:2 0 100G 0 mpath
sr0 11:0 1 4.4G 0 rom
# 6. 使用存储
[root@backup ~ 20:59:04]# mkfs.xfs /dev/sdb
[root@backup ~ 20:59:23]# vim /etc/fstab
#最后添加一条记录
/dev/mapper/mpatha /usr/share/nginx/html xfs _netdev 0 0
[root@backup ~ 20:59:37]# mount -a
[root@backup ~ 21:00:17]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 49250820 3426940 45823880 7% /
[root@backup ~ 21:00:35]# echo Hello data From iSCSI for nginx > /usr/share/nginx/html/index.html
[root@backup ~ 21:00:50]# curl http://192.168.237.107/
Hello data From iSCSI for nginx