存储基本概念 在介绍传统网络存储之前,需要先介绍网络存储的几种不同的系统以及不同的存储方式。
存储方式
基本概念:扇区→物理块→逻辑块→文件系统
块级存储
块级是指以扇区为基础,一个或几个连续的扇区组成一个块,也叫物理块。它在块设备(例如:磁盘驱动器)与文件系统之间。
块级备份是指物理块复制,效率高,实时性强,备份时间短,且增量备份时,只备份修改过的物理块。
DAS、SAN等
文件级存储
文件级是指文件系统,单个文件可能由于一个或多个逻辑块组成,且逻辑块之间是不连续分布。
文件级备份是指在指定某些文件进行备份时,首先会查找每个文件逻辑块,其次物理块,由于逻辑块是分散在物理块上,而物理块也是分散在不同扇区上。需要一层一 层往下查找,最后才完成整个文件复制。文件级备份时比较费时间,效率不高,实时性不强,备份时间长,且增量备份时,单文件某一小部份修改,不会只备份修改部份,而整个文件都备份。
FTP、NFS服务器,SamBa等。
对象存储
对象存储也就是通常意义的键值存储,它将数据组织为对象而不是传统的文件层次结构。在对象存储中,每个对象都具包含了数据本身以及与该对象相关的元数据。
它适用于存储海量数据、进行数据备份和恢复,以及支持分布式应用程序的数据存储需求。
存储架构
传统网络存储系统
传统网络存储系统采用单点存储服务器存放所有数据,当数据量和并发量比较大时,存储服务器就会成为系统性能的瓶颈,但是在小型架构和局域网内仍然有很多应用。传统网络存储系统支持块级的存储和文件级的存储。
常见的传统网络存储系统有NAS、DAS、SAN等。
分布式存储系统
分布式存储系统是将数据存储在多台独立设备上,采用可扩展的系统结构,利用堕胎存储服务器分担存储负荷,提高存储系统的可靠性和存取效率。支持块级存储、文件级存储和对象存储。
常见的分布式存储系统有:MFS、FastDFS、Ceph等。
对象存储系统
对象存储系统和基于对象存储是两个概念,前者是服务,后者是底层原理。对象存储系统的底层原理是键值存储,其接口是简单的Get、PUT、DEL和其他扩展,不受时间、地点和文件类型的限制。代表主要有Swift、S3、Gluster等。
常见的提供对象存储(OSS)的厂商有阿里云、七牛云等。
传统网络存储分类
常见的传统网络存储系统有三种:
直连式存储:DAS(Direct Attached Storage),基于物理块存储
网络附加存储:NAS(Network Attached Storage),基于文件存储
存储区域网:SAN(Storage Area Network),基于物理块存储
以下是三种常见的基于文件方式进行存储的网络存储服务(NAS类型):
FTP:文件服务器,适合单纯的文件上传下载
samba:不同系统间的文件夹或设备共享,适合系统集成间的共享
NFS:网络文件系统,适合作为网络存储服务器
FTP FTP(File Transfer Protocol):文件传输协议,是一个TCP协议。FTP是一个C/S类型的软件,FTP监听TCP端口号是21,数据端口为20。
FTP的功能是在客户端与服务端之间进行文件的传输,即实现两台计算机之间文件的上传和下载。最初的FTP协议使用明文传输,现今使用较多是更为安全的 VSFTP (Very Secure File Transfer Protocol)。
FTP的主动模式和被动模式
PORT(主动模式)
在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送FTP用户名和密码,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
PASV(被动模式)
在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
区别和比较
绝大部分互联网应用都是被动模式,因为大部分客户端都是在路由器后面,没有独立的公网IP地址,服务器想要主动连接客户端,难度太大,在现在真实的互联网环境里面几乎是不可能完成的任务。在 FTP服务器部署的时候,其默认采用的是主动操作模式。如果企业FTP服务器的用户都是在内部网络中的,即不用像外部网络的用户提供FTP连接的需求,那么采用这个默认操作方式就可以了。但是如果一些出差在外的员工或者员工在家庭办公时也需要访问企业内部的FTP服务器,而此时出于安全的考虑或者公网IP地址数量的限制,企业往往会把FTP服务器部署在防火墙或者NAT服务器的后面,此时这个主动操作模式就不行了。
安装部署 1 2 3 4 5 6 7 yum install vsftpd -y # 安装 systemctl enable vsftpd # 设置开机启动 systemctl start vsftpd # 启动服务 lsof -i :21 # 验证启动
相关文件
配置文件
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 # Example config file /etc/vsftpd/vsftpd.conf # 匿名用户访问,YES是允许,NO是拒绝 anonymous_enable=NO # 本地用户登录,YES是允许,NO是拒绝.默认访问的是本地用户家目录,如果你开启了selinux # 如果selinux是开启状态,那么请设置开启ftp_home_dir为ON local_enable=YES # 允许本地用户上传 # Uncomment this to enable any form of FTP write command . write_enable=YES # 设置本地用户上传的umask 权限是022。对应的目录是755,文件是644 local_umask=022 # 开启匿名用户上传功能,默认是拒绝的 # anon_upload_enable=YES # 开启匿名用户创建文件或文件夹权限,默认是拒绝的 # anon_mkdir_write_enable=YES # 开启上传和下载日志记录功能 xferlog_enable=YES # 使用标准端口模式 # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES # 允许更改匿名用户上传文件的所有者 # chown_uploads=YES # 如果允许匿名用户上传,更改匿名用户上传文件的所有者,但是所有者不能是root # chown_username=whoever # 日志文件路径,不修改就是默认下面的路径 # xferlog_file=/var/log/xferlog # 日志文件采用标准格式 xferlog_std_format=YES # 设置会话超时时间 # idle_session_timeout=600 # 设置数据传输超时时间 # data_connection_timeout=120 # 是否允许客户端发起“async ABOR”请求,该操作是不安全的默认禁止。 # async_abor_enable=YES # 该选项用于指定是否允许上传时以ASCII模式传输数据 # ascii_upload_enable=YES # 该选项用于指定是否允许下载时以ASCII模式传输数据 # ascii_download_enable=YES # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. # 是否开启拒绝的Email功能 # deny_email_enable=YES # (default follows) # 指定保存被拒接的Email地址的文件 # banned_email_file=/etc/vsftpd/banned_emails # 是否开启对本地用户chroot 的限制,YES为默认所有用户都不能切出家目录,NO代表默认用户都可以切出家目录 # 设置方法类似于:YES 拒绝所有,允许个别 NO 允许所有拒绝个别 # chroot_local_user=YES # 开启特例列表,如果chroot_local_user的值是YES则该文件中的用户是可以切出家目录,如果是NO,该文件中的用户则不能切出家目录 # chroot_list_enable=YES # 特例列表的文件路径,一行一个用户。 # chroot_list_file=/etc/vsftpd/chroot_list # 允许具有写权限的家目录 # allow_writeable_chroot=YES # 是否开启ls 递归查询功能 ls -R # ls_recurse_enable=YES # 是否开启ftp独立模式在IPV4,开了之后只能在ipv4模式运行 listen=NO # 是否开启ftp在ipv6模式运行,开了之后可以同时监听ipv4和ipv6 listen_ipv6=YES # 启用pam模块验证,对本地用户登录做验证用的,pam验证的配置文件在/etc/pam.d/vsftpd pam_service_name=vsftpd # 是否启用用户列表功能 userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=YES # 设置为YES,代表此列表中的用户都不能访问;设置为NO,代表仅允许该列表中的用户访问。
共享文件目录
1 /var/ftp # 匿名用户的下载目录,本地用户的下载目录在本地用户的家目录
FTP日志
FTP客户端常用命令 FTP是一个C/S类型的软件,连接服务端需要FTP客户端才能完成,常见的FTP客户端有以下几种:
浏览器:可以通过浏览器中输入 ftp://ip或者ftp://域名的方式来访问FTP
自带客户端:命令行下可以使用ftp命令去连接
三方客户端:FileZilla、8uftp 图形软件或者文本界面的lftp等
三种方式中,命令行下无法鼠标流,所以需要使用到一些命令。
1 2 3 4 5 6 7 8 9 10 11 ftp [IP或域名] # 访问FTP服务端,有本地系统用户访问、guest访问和匿名访问三种 help # 打印帮助菜单 !+Linux命令 # 执行Linux命令 lcd [目录] # 切换Linux系统中的当前目录 put/mput # 上传/批量上传 get/mget # 下载/批量下载 ls/dir # 列出目录内容 mkdir/cd/delete/rmdir # 创建目录/进入目录/删除文件/删除目录 pwd # 显示FTP当前目录 open/close/bye # 开启/关闭/退出FTP连接
虚拟用户 在FTP中不论是匿名用户还是实名用户都是系统中真实存在的用户,或多或少都会有一些安全方面的风险,为了避免这个风险,开发者在ftp中加入了一个虚拟用户的概念,所有虚拟用户都会被统一映射为一个系统账号,免去了管理过多账户的麻烦。
Samba Samba是在Linux系统中实现SMB(Server Message Block)协议,即信息服务块协议的软件,由服务器/客户端软件组成,为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
Samba部署 1 2 3 4 5 6 # 安装软件包 yum install samba samba-client -y # samba是服务端,samba-client提供了smbclient命令 systemctl enable nmb smb # 设置开机启动 systemctl start nmb smb # 开启服务
配置文件
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 # See smb.conf.example for a more detailed config file or # read the smb.conf manpage.# Run 'testparm' to verify the config is correct after # you modified it. [global] # 全局设置,具体设置项可以在smb.conf.example文件中浏览 workgroup = SAMBA # 工作组 security = user # 安全级别,有share,user,server,domain四种,一般为user即可 netbios name = samba # Samba服务器的NetBios主机名。设置以后局域网内Windows才能通过网络邻居发现Samba服务器。 passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw interfaces = lo ens33 # 网卡接口 host allow = 127. 192.168.110. 192.168.3. # 允许访问共享资源的网络。一般设置为服务器和客户机所在的网段即可 [homes] # 对用户家目录的共享 comment = Home Directories # 自定义段的注释说明 public = No # 是否开放访问,类似于guest ok valid users = %S, %D%w%S # 允许访问的用户,不能与public同时使用,否则public设置会失效。 browseable = No # 是否可见,即是否在共享名列表显示该段。 read only = No # 是否只读访问 read list = @组名 用户名 # 上一项设置为No,则这一项允许一部分用户和组读取 inherit acls = Yes writable = Yes # 是否允许向共享目录内写入 write list = @组名 用户名 # 上一项设置为No,则这一项允许一部分用户和组写入 [printers] # 打印机的共享 comment = All Printers path = /var/tmp # 共享资源所在目录 printable = Yes create mask = 0600 browseable = No [print$ ] comment = Printer Drivers path = /var/lib/samba/drivers write list = @printadmin root force group = @printadmin create mask = 0664 [samba] # 如果想共享一个目录,可以像这样添加一个共享块 comment = test path = /samba browseable = yes host allow = 192.168.110.0/24 192.168.3.0/24 valid users = samba_user # 此处的用户需要是Samba用户
Samba用户 由于系统本地用户无法直接登录Samba,必须是Samba用户才可以登录,所有需要创建Samba用户:
创建系统用户
将系统用户转为Samba用户
1 2 3 4 5 6 7 8 9 10 # 创建系统用户 useradd [用户名] passwd [用户名] # 创建Samba用户的指令 smbpassed -a [用户名] # 添加用户 smbpassed -x [用户名] # 删除用户 smbpassed -d [用户名] # 禁用用户 smbpassed -e [用户名] # 取消禁用 smbpassed -n [用户名] # 清除密码
NFS NFS(Network File System):网络文件系统。允许网络中的计算机通过TCP/IP网络来共享资源,在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样,节省本地存储空间。在Web服务中,通常会将常用的音视频等文件数据放在一台NFS服务器上且可以通过网络访问。
NFS体系分为两个部分:
NFS服务端机器:通过NFS协议将文件共享到网络。
NFS客户端机器:通过网络挂载NFS共享目录,在本地进行访问。
NFS应用场景:
共享存储服务器:图片服务器、视频服务器等
家目录漫游:域用户家目录服务器
文件服务器:内容文件存储服务器
NFS部署 1 2 3 4 5 6 7 8 9 10 # nfs-utils 是NFS服务的主程序,包括 rpc.nfsd 和 rpc.mountd 这两个daemons以及相关文档、执行命令文件等 # npcbind 是CentOS 6/7中RPC的主程序,负责NFS服务的端口映射工作。NFS可以视为一个RPC程序,所以必须先启动RPC服务。 yum install nfs-utils rpcbind -y # 安装软件包 systemctl enable nfs-server # 设置开机自启 systemctl is-active rpcbind # 启动NFS之前要确保rpcbind服务启动 systemctl start nfs # 启动NFS systemctl is-active nfs # 验证启动 rpcinfo -p 127.0.0.1 # 查询rpcbind的端口,查看nfs是否启动
配置文件 1 2 3 4 5 6 7 /etc/exports # 此文件中指定需要共享出去的目录,共享格式为:[绝对路径] 授权访问的IP或网段(权限1,权限2),比如: vim /etc/exports # 编辑配置文件,添加以下内容 /test 192.168.110.0/24(ro) # 将/test文件夹共享出去,允许192.168.110.网段访问,权限为只读 /projects 182.168.10.135(rw) 182.168.10/24(ro) # 将/projects文件夹共享出去,允许192.168.10.网段只读访问,182.168.10.135可读写 cat /var/lib/nfs/etab # 在此文件可以查看其他默认的权限参数
权限说明
1 2 3 4 5 6 7 8 9 ro read only 只读模式,用户无法修改文件或目录 rw read write 读写模式,用户可以修改文件或目录,写入时默认是写到远程缓冲区。 sync 客户端请求写入时,数据写入到服务端的内存和磁盘中,优点是数据安全,缺点是性能降低。 async 客户端请求写入时,数据暂存于服务端的内存中。提升了工作效率,但是数据可能会丢失。 no_root_squash 客户端的root用户访问NFS时,它对该共享目录同样具有root权限!(避免使用,这是为无盘客户端准备的) root_squash 客户端的root用户访问NFS时,权限被压缩成匿名用户,默认是nfsnobody账号身份 all_squash 客户端的任何用户访问NFS时,权限都被压缩成匿名用户, 默认是nfsnobody账号身份 anonuid 如果不想使用nfsnobody账号作为匿名用户,可以自己指定用户uid。 anongid 如果不想使用nfsnobody组作为匿名组,可以自己指定用户gid。
相关指令
NFS服务中,主要通过exportfs
命令来设置,以下是exportfs
命令的相关选项
1 2 3 4 5 -a 打开或取消所有目录共享 -i 忽略/etc/exports文件,只是用默认的和命令行指定的选项 -u 取消一个或多个目录的共享 -r 重新共享所有目录,即重新加载/etc/exports文件 -v 输出详细信息
补充
1 showmount -e 本机IP # 查看本机共享出去的目录
创建目录
1 2 3 4 5 mkdir -p /test # 创建配置文件中指定的要共享出去的目录 chown -R nfsnobody.nfsnobody /test # 客户端会使用nfsnobody用户访问,因此需要将共享目录更改属主和属组 # 如果不更改共享目录的属主和属组,那么客户端会以其他人的身份访问共享目录,那么如果想要拥有读写权限,服务端中的共享目录需要设置757的权限,如果是只读的话,需要设置755的权限。 systemctl reload nfs # 平滑重启
客户端挂载 服务端查看挂载
1 2 showmount -e nfs服务器IP # 查看nfs服务器共享出去的目录 ls /var/lib/nfs/rpc_pipefs/nfsd4_cb/ # 查看有几个客户机已经挂载了本机的共享目录
客户端操作
临时挂载
1 2 mount -t nfs 服务端IP:共享目录 本地挂载目录 # 比如 mount -t nfs 192.168.110.135:/test /mnt/nfs_test # 将服务端的共享目录/test,挂载到本地的/mnt/nfs_test目录
永久挂载
服务端查看挂载 1 2 showmount -e nfs服务器IP # 查看nfs服务器共享出去的目录 ls /var/lib/nfs/rpc_pipefs/nfsd4_cb/ # 查看有几个客户机已经挂载了本机的共享目录