Linux的集中式网络存储
|Word Count:2k|Reading Time:8mins|Post Views:
网络存储主要分为两种形式,一种是块存储,就是共享存储是以块设备的形式挂载到目标服务器之上的,代表就是iSCSI、ceph;另一种是文件存储,就是文件是以共享文件夹的形式来挂载到目标服务器之上,这方面的代表就是NFS和SMB,以及新兴的S3存储。
这里简单记录以下iSCSI和NFS的搭建。其他文件存储形式,后续再记录。
2024.07 摄于山东泰安·泰山·南天门
iSCSI
iSCSI是基于IP协议的技术标准,该技术允许用户通过TCP/IP网络来构建IP-SAN.
基本构成
- iSCSI会话的建立是通过启动器(Initiator)和目标器(Target)实现的
- Target为服务端,是一个或者多个LUN的集合
- Initiator则是客户端使用的工具,用来连接target
- Target和Initator都使用IQN来识别
- IQN是target的唯一标识符,命名标准为iqn.yyyy-mm.<倒过来的域名,全局唯一>[:识别名称]
配置流程
Target配置
- 安装target
- 创建target
- 为target添加lun
- 指定initiator
Initiator配置
- 安装initiator
- 发现target
- 连接target
- 分区格式化
实施过程
服务端
# 系统新增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
|
客户端
# 安装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进行认证。
工作机制
- NFS服务器端启动及传输的过程
- 服务器启动RPC服务,再启动NFS进程,并向RPC注册端口信息
- 客户端启动RPC服务(portmap服务),向服务器端RPC(protmap)请求服务端的NFS端口
- 服务器端RPC服务反馈NFS端口信息给客户端
- 客户端通过获取的NFS端口来建立和服务器端FNS的连接并进行数据的传输
- NFS用户建立传输及数据存取过程
- 用户访问网站程序,由程序在NFS客户端发出存取NFS文件的请求,NFS客户端上的RPC服务通过网络向NFS服务器的111端口发出NFS文件存取的询问请求;
- NFS服务器的RPC找到对应已注册NFS端口后,通知NFS客户端的RPC服务
- NFS客户端获取正确的端口,并与NFS daemon联机存取数据;
- NFS客户端数据存取成功之后,返回给前端访问程序,告知用户存取结果。
所需软件
- RPC主程序:rpcbind
- 负责NFS端口映射,监听在111端口
- 程序名称为portmaper,使用rpcinfo命令查看端口映射情况
- NFS主程序:nfs-utils
- 提供rpc.nfsd及rpc.mountd,以及其他相关文档、执行文件
- nfsd,将请求重定向到内核传输端点,并调用内核内进程来处理请求并响应客户端
共享部署
基本安装
# 软件安装 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
# 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
|
客户端挂载
# 挂载文件 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
|
参数内容
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
|