NFS 服务器iSCSI 服务器
NFS 服务器
NFS 服务介绍
NFS 是 Network File System 的缩写,即网络文件系统,最早由 Sun 公司开发,用来在 UNIX&Linux 系统间实现磁盘文件共享的一种方法。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS 客户端 (一般为应用服务器,例如 web) 可以通过挂载(mount)的方式将 NFS 服务端共享的数据目录挂载到 NFS 客户端本地系统中 (就是某一个挂载点下)。从 NFS 客户端的机器本地看,NFS 服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的 NFS 服务端的目录1。
在企业集群架构的工作场景中,NFS 网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在 NFS 共享里,例如,BBS 产品的图片、附件、头像,特别是中小网站公司应用频率更高2。
NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS 的功能所对应的端口没有固定住,而是随机取用一些未被使用的小于 1024 的端口提供服务3。此时需要远程过程调用(RPC)的服务,RPC 最主要的功能是注册每个 NFS 功能所对应的端口,并且汇报给客户端,让客户端可以连结到正确的端口。RPC 定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息4。
- NFS 服务器:导出文件系统目录及其内容5。
- NFS 客户端:挂载服务器导出的文件系统到本地6。
部署服务
NFS 服务由 nfs-utils 软件包提供,RHEL8 默认安装了该软件包7。
配置服务端
-
安装软件包
[root@server ~ 16:54:26]# yum install -y nfs-utils
-
准备服务用到的各种材料,例如用户、目录等
[root@server ~ 16:56:06]# mkdir -p /shares/webapp/ [root@server ~ 16:57:28]# echo Hello World From Nginx > /shares/webapp/index.html # 客户端nginx用户的UID为998,客户端nginx用户可以读写该目录 [root@server ~ 16:58:33]# chown 998 /shares/webapp [root@server ~ 16:59:51]# ll -d /shares/webapp drwxr-xr-x 2 998 root 42 9月 26 10:31 /shares/webapp
-
配置服务器(修改配置文件)
[root@server ~ 17:03:45]# vim /etc/exports.d/webapp.exports
-
启用并启动服务
[root@server ~ 17:05:21]# systemctl enable nfs-server.service --now [root@server ~ 17:05:33]# systemctl is-active nfs-server.service active
-
配置防火墙
[root@server ~ 17:06:05]# systemctl is-active firewalld.service unknown
-
配置客户端
-
准备web服务器
[root@webapp ~ 15:57:36]# yum install -y nginx[root@webapp ~ 17:08:29]# id nginx uid=998(nginx) gid=996(nginx) 组=996(nginx) [root@webapp ~ 17:08:48]# systemctl enable nginx.service --now Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
-
安装NFS客户端
[root@webapp ~ 17:09:39]# yum install -y nfs-utils
-
查看共享并挂载
```bash[root@webapp ~ 17:09:56]# showmount -e 10.1.8.10Export list for 10.1.8.10:/shares/webapp 10.1.8.0/24[root@webapp ~ 17:11:16]# mount 10.1.8.10:/shares/webapp /usr/share/nginx/html[root@webapp ~ 17:12:09]# df -h /usr/share/nginx/html文件系统 容量 已用 可用 已用% 挂载点10.1.8.10:/shares/webapp 50G 1.6G 49G 4% /usr/share/nginx/html```
-
测试web服务器页面
[root@webapp ~ 17:13:23]# curl 10.1.8.11 Hello World From Nginx
-
持久化挂载
[root@webapp ~ 17:13:32]# vim /etc/fstab # 最后添加一条记录 10.1.8.10:/shares/webapp /usr/share/nginx/html nfs defaults 0 0
6.重启服务器验证
挂载选项补充说明:
客户端的root对于服务器端来说 啥也不是。
默认情况,服务端共享的目录,客户端的root是只具备other用户的权限。
默认共享选项包含root_squash,压缩root权限为nobody。
可以使用选项no_root_squash
配置 iSCSI 存储
iSCSI 服务器
iSCSI 服务介绍
SCSI(Small Computer System Interface,小型计算机系统接口)是一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)连接的标准。
iSCSI(Internet Small Computer System Interface,Internet 小型计算机系统接口),又称为 IP SAN,是 IBM 公司研究开发的 IP SAN 技术。该技术将现有 SCSI 接口与以太网络(Ethernet)技术结合,基于 TCP/IP 协议连接 iSCSI 服务端(Target)和客户端(Initiator),使得封装后的 SCSI 数据包可在互联网传输,最终实现 iSCSI 服务端为客户端提供存储资源。
- 通常,iSCSI 使用专用的 10Gb 以太网或更高速的网络,以最大化性能。
- 从物理服务器到存储的电缆通常封闭在数据中心内,且理想情况下不直接连接到 LAN 网络,因此 SAN 流量通常不加密(以最大化性能)。若需实现 WAN 安全,iSCSI 管理员可使用 IPsec 加密流量。
iSCSI 架构
iSCSI 服务采用 C/S 架构,客户端系统上访问的 iSCSI 目标会显示为本地未格式化的 SCSI 块设备,等同于通过 SCSI 布线、FC 直连或 FC 交换光线连接的设备。
核心组件说明
组件 | 说明 |
---|---|
Initiator | iSCSI 客户端,通常以软件方式部署,也可使用 iSCSI Host Bus Adapters(HBAs)硬件;必须具有唯一名称(IQN) |
Target | iSCSI 服务器上的存储资源,必须具有唯一名称(IQN);每个目标提供一个或多个块设备(LUN),一台服务器可提供多个目标 |
IQN(iSCSI Qualified Name) | 全球唯一名称,用于标识发起者和目标,格式:iqn.YYYY-MM.com.reversed.domain:name_string - YYYY-MM :年和月(如 2020 年 6 月为 2020-06,确保唯一性)- com.reversed.domain :反向域名(如 server.redhat.fun 的反向域名为 cloud.laoma.www)- name_string :标识特定目标,若服务器仅一个目标可省略 |
Portal | 指定服务器监听的地址和端口(如 172.25.250.50:3260) |
LUN(Logical Unit Number) | 代表 Target 提供的块设备,每个目标可提供一个或多个 LUN |
ACL(Access Control List) | 使用 Initiator 的 IQN 限制客户端访问 Target |
TPG(Target Portal Group) | 目标的完整配置,包含 Portal、LUN 和 ACL;几乎所有目标使用一个 TPG,高级配置可定义多个 |
discovery | 查询服务器上的 Target 列表 |
login | 向 Target 验证,验证通过后可使用 Target 提供的块设备 |
配置服务端
[root@server ~ 17:24:14]# yum install -y targetcli targetd
-
启用并启动服务
[root@server ~ 17:26:10]# systemctl enable target --now Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
-
准备共享块设备
server端添加一个200G SATA接口硬盘
创建分区1 100G 空间分享给客户端[root@server ~ 17:28:09]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 99G 0 part ├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 2G 0 lvm [SWAP]└─centos-home 253:2 0 47G 0 lvm /home sdb 8:16 0 200G 0 disk sr0 11:0 1 4.4G 0 rom [root@server ~ 17:29:38]# parted /dev/sdb mklabel gpt 信息: You may need to update /etc/fstab.[root@server ~ 17:30:59]# parted /dev/sdb unit MiB mkpart dbapp 1 102401 信息: You may need to update /etc/fstab.[root@server ~ 17:32:53]# 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@server ~ 17:39:51]# targetc targetcli targetclid targetctl [root@server ~ 17:39:51]# targetcli Warning: Could not load preferences file /root/.targetcli/prefs.bin. targetcli shell version 2.1.53 Copyright 2011-2013 by Datera, Inc and others. For help on commands, type 'help'./> 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/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] /> /iscsi/ create iqn.2025-09.cloud.laoma.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.laoma.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.server.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] /iscsi/iqn.20...x8664:db/tpg1> acls/ create iqn.2025-09.cloud.wsc.server.x8664:webapp Created Node ACL for iqn.2025-09.cloud.wsc.server.x8664:webapp /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.wsc.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.wsc.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 Global pref auto_save_on_exit=true Configuration saved to /etc/target/saveconfig.json
配置客户端
-
安装软件包
[root@client ~ 17:23:11]# yum install -y iscsi-initiator-utils
-
设置客户端的IQN
[root@client ~ 18:01:32]# vim /etc/iscsi/initiatorname.iscsi
3.扫描目标
[root@client ~ 18:04:38]# iscsiadm -m discovery -t st -p 10.1.8.10
10.1.8.10:3260,1 iqn.2025-09.cloud.laoma.server.x8664:db#选项说明:
-m discovery 发现模式
-t st 找target(sendtarget)
-p 10.1.8.10 服务地址
4.挂载设备
[root@client ~ 18:11:15]# iscsiadm -m node -T iqn.2025-09.cloud.laoma.server.x8664:db -l
Logging in to [iface: default, target: iqn.2025-09.cloud.laoma.server.x8664:db, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2025-09.cloud.laoma.server.x8664:db, portal: 10.1.8.10,3260] successful.#选项说明:
-m node 登录模式
-T iqn.2025-09.cloud.laoma.server.x8664:db 服务器IQN
-l login
5.识别为本地硬盘 sdb
[root@client ~ 18:13:45]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part ├─centos-root 253:0 0 50G 0 lvm /├─centos-swap 253:1 0 2G 0 lvm [SWAP]└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
- 使用存储
[root@client ~ 18:14:18]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=6553600 blks= sectsz=512 attr=2, projid32bit=1= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26214400, imaxpct=25= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12800, version=2= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0[root@client ~ 18:14:36]# vim /etc/fstab
# 最后添加一条记录
/dev/sdb /usr/share/nginx/html xfs defaults 0 0[root@client ~ 18:18:05]# tail -n 1 /etc/fstab
/dev/sdb /usr/share/nginx/html xfs defaults [root@webapp ~ 18:23:49]# mount -a
[root@webapp ~ 18:24:23]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb 104806400 32992 104773408 1% /usr/share/nginx/html[root@webapp ~ 18:25:06]# echo Hello data From iSCSI for nginx > /usr/share/nginx/html/index.html
[root@webapp ~ 18:25:29]# curl http://10.1.8.11/
Hello data From iSCSI for nginx
oot@webapp ~ 18:23:49]# mount -a
[root@webapp ~ 18:24:23]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb 104806400 32992 104773408 1% /usr/share/nginx/html
[root@webapp ~ 18:25:06]# echo Hello data From iSCSI for nginx > /usr/share/nginx/html/index.html
[root@webapp ~ 18:25:29]# curl http://10.1.8.11/
Hello data From iSCSI for nginx