网络存储主要分为两种形式,一种是块存储,就是共享存储是以块设备的形式挂载到目标服务器之上的,代表就是iSCSI、ceph;另一种是文件存储,就是文件是以共享文件夹的形式来挂载到目标服务器之上,这方面的代表就是NFS和SMB,以及新兴的S3存储。
这里简单记录以下iSCSI和NFS的搭建。其他文件存储形式,后续再记录。

2024.07 摄于山东泰安·泰山·南天门

iSCSI

iSCSI是基于IP协议的技术标准,该技术允许用户通过TCP/IP网络来构建IP-SAN.

基本构成

  1. iSCSI会话的建立是通过启动器(Initiator)和目标器(Target)实现的
  2. Target为服务端,是一个或者多个LUN的集合
  3. Initiator则是客户端使用的工具,用来连接target
  4. Target和Initator都使用IQN来识别
  5. IQN是target的唯一标识符,命名标准为iqn.yyyy-mm.<倒过来的域名,全局唯一>[:识别名称]

配置流程

Target配置

  1. 安装target
  2. 创建target
  3. 为target添加lun
  4. 指定initiator

Initiator配置

  1. 安装initiator
  2. 发现target
  3. 连接target
  4. 分区格式化

实施过程

服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# 系统新增sdb sdc sdd三块硬盘作为预备的LUN
[root@share ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─rl-root 253:0 0 37G 0 lvm /
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
sdc 8:32 0 20G 0 disk
sdd 8:48 0 20G 0 disk

# 安装
dnf -y install targetcli
systemctl enable --now target

# 配置防火墙
firewall-cmd --permanent --add-service=iscsi-target
firewall-cmd --reload

# 配置
[root@share ~]# targetcli
targetcli shell version 2.1.57
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
# 创建后端指定硬盘
/> cd backstores/block
/backstores/block> create data1 /dev/sdb
Created block storage object data1 using /dev/sdb.
/backstores/block> ls /
o- / ............................................................................ [...]
o- backstores ................................................................. [...]
| o- block ..................................................... [Storage Objects: 1]
| | o- data1 ............................ [/dev/sdb (20.0GiB) write-thru deactivated]#创建20G硬盘
| | o- alua ...................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp .......................... [ALUA state: Active/optimized]
| o- fileio .................................................... [Storage Objects: 0]
| o- pscsi ..................................................... [Storage Objects: 0]
| o- ramdisk ................................................... [Storage Objects: 0]
o- iscsi ............................................................... [Targets: 0]
o- loopback ............................................................ [Targets: 0]
# 创建iqn号
/backstores/block> cd /iscsi
/iscsi> create iqn.2024-08.net.sujx:data1
Created target iqn.2024-08.net.sujx:data1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/iscsi> cd iqn.2024-08.net.sujx:data1/tpg1/
/iscsi/iqn.20...jx:data1/tpg1> cd luns
# 创建iqn对应lun
/iscsi/iqn.20...ta1/tpg1/luns> create /backstores/block/data1
Created LUN 0.
/iscsi/iqn.20...ta1/tpg1/luns> ls
o- luns ..................................................................... [LUNs: 1]
o- lun0 ................................. [block/data1 (/dev/sdb) (default_tg_pt_gp)]
# 创建iqn对应acl
/iscsi/iqn.20...ta1/tpg1/luns> cd ../acls
/iscsi/iqn.20...ta1/tpg1/acls> create iqn.2024-08.net.sujx:data1
Created Node ACL for iqn.2024-08.net.sujx:data1
Created mapped LUN 0.
/iscsi/iqn.20...ta1/tpg1/acls> cd ../portals/
# 删除默认配置
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
# 添加对应客户端IP
/iscsi/iqn.20.../tpg1/portals> create 192.168.20.10
Using default IP port 3260
Created network portal 192.168.10.10:3260.
# 查看配置结果
/iscsi/iqn.20...jx:data1/tpg1> cd /
/> ls
o- / ............................................................................ [...]
o- backstores ................................................................. [...]
| o- block ..................................................... [Storage Objects: 1]
| | o- data1 .............................. [/dev/sdb (20.0GiB) write-thru activated]
| | o- alua ...................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp .......................... [ALUA state: Active/optimized]
| o- fileio .................................................... [Storage Objects: 0]
| o- pscsi ..................................................... [Storage Objects: 0]
| o- ramdisk ................................................... [Storage Objects: 0]
o- iscsi ............................................................... [Targets: 1]
| o- iqn.2024-08.net.sujx:data1 ........................................... [TPGs: 1]
| o- tpg1 .................................................. [no-gen-acls, no-auth]
| o- acls ............................................................. [ACLs: 1]
| | o- iqn.2024-08.net.sujx:data1 .............................. [Mapped LUNs: 1]
| | o- mapped_lun0 .................................... [lun0 block/data1 (rw)]
| o- luns ............................................................. [LUNs: 1]
| | o- lun0 ......................... [block/data1 (/dev/sdb) (default_tg_pt_gp)]
| o- portals ....................................................... [Portals: 1]
| o- 192.168.10.5:3260 .................................................. [OK] #服务端IP
o- loopback ............................................................ [Targets: 0]
# 保存配置
/> saveconfig
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
exit
# 然后依次添加sdc、sdd

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 安装initiator
dnf -y install iscsi-initiator-utils
# 指定iqn号
cat > /etc/iscsi/initiatorname.iscsi<<'EOF'
InitiatorName=iqn.2024-08.net.sujx:data1
EOF

# 配置磁盘
systemctl enable --now iscsid iscsi
# 检查能否访问iscsi磁盘
iscsiadm --mode discoverydb --type sendtargets --portal 192.168.10.5 --discover
# 附加磁盘
iscsiadm --mode node --targetname iqn.2024-08.net.sujx:data1 --portal 192.168.20.5:3260 --login
# 查看磁盘
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─rl-root 253:0 0 37G 0 lvm /
└─rl-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk

NFS

NFS(Network File System)网络文件系统,让本地NFS客户端应用可以透明地读写远端NFS服务器上的文件。NFS适用于Linux与UNIX之间实现文件共享,它只能基于IP进行认证。

工作机制

  1. NFS服务器端启动及传输的过程
    1. 服务器启动RPC服务,再启动NFS进程,并向RPC注册端口信息
    2. 客户端启动RPC服务(portmap服务),向服务器端RPC(protmap)请求服务端的NFS端口
    3. 服务器端RPC服务反馈NFS端口信息给客户端
    4. 客户端通过获取的NFS端口来建立和服务器端FNS的连接并进行数据的传输
  2. NFS用户建立传输及数据存取过程
    1. 用户访问网站程序,由程序在NFS客户端发出存取NFS文件的请求,NFS客户端上的RPC服务通过网络向NFS服务器的111端口发出NFS文件存取的询问请求;
    2. NFS服务器的RPC找到对应已注册NFS端口后,通知NFS客户端的RPC服务
    3. NFS客户端获取正确的端口,并与NFS daemon联机存取数据;
    4. NFS客户端数据存取成功之后,返回给前端访问程序,告知用户存取结果。

所需软件

  1. RPC主程序:rpcbind
    1. 负责NFS端口映射,监听在111端口
    2. 程序名称为portmaper,使用rpcinfo命令查看端口映射情况
  2. NFS主程序:nfs-utils
    1. 提供rpc.nfsd及rpc.mountd,以及其他相关文档、执行文件
    2. nfsd,将请求重定向到内核传输端点,并调用内核内进程来处理请求并响应客户端

共享部署

基本安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 软件安装
dnf install -y nfs-utils
systemctl enable --now nfs-server.service
exportfs -f

# 配置共享
mkdir /var/nfs
cat >> /etc/exports<<'EOF'
/var/nfs 192.168.20.0/24(rw,no_root_squash,sync)
EOF

systemctl restart nfs-server

# 配置防火墙
firewall-cmd --permanent --add-service={nfs,mountd,rpc-bind}
firewall-cmd --reload

# 校验
exportfs
rpcinfo -p localhost
netstat -tlnp

配置NFSv4.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# NFSv4对比NFSv3主要增加了对高速网络的支持、改进了IO调用和加强了安全功能
# 当前NFS版本号
[root@share ~]# cat /proc/fs/nfsd/versions
+3 +4 +4.1 +4.2

# 修改nfs启动内容
vim /etc/nfs.conf
[nfsd]
vers3=n # 将vers3=y 修改为n
# vers4=y
vers4.0=n # 将4.0版本关闭
vers4.1=n # 将4.1版本关闭
# vers4.2=y

# 校验NFS版本号
[root@share ~]# systemctl restart nfs-server
[root@share ~]# cat /proc/fs/nfsd/versions
-3 +4 -4.0 -4.1 +4.2

客户端挂载

1
2
3
4
5
6
7
8
9
10
11
12
# 挂载文件
dnf install -y nfs-utils
showmount -e 192.168.20.5
mount -t nfs 192.168.20.5:/var/nfs /mnt
# 自动挂载
cat >> /etc/fstab <<'EOF'
192.168.20.5:/var/nfs /mnt nfs defaults,_netdev 0 0
EOF
systemctl daemon-reload

umount /mnt
mount -a

参数内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ro                    只读访问
rw 读写访问
sync 所有数据在请求时写入共享
async NFS在写入数据前可以相应请求
secure NFS通过1024以下的安全TCP/IP端口发送
insecure NFS通过1024以上的端口发送
wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
Hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check 和上面相对,不检查父目录权限
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID