1.案例目标

(1)了解FTP工作原理,客户端工具,FTP状态码以及vsftp服务的安装。

(2)了解FTP虚拟用户配置以及黑白名单规则使用限制。

(3)FTP客户端安装以及使用FTP客户端测试。

(4)熟悉NFS工作原理,服务部署安装,以及配置文件中参数的使用。

(5)了解showmount命令的使用,熟练挂载共享目录以及永久挂载的操作。

(6)了解crond命令使用,shell脚本备份资源库编写。

2. 案例分析

2.1规划节点

部署服务的节点规划,见下表:

IP

主机名

节点

192.168.100.11

FTP

FTP服务器、NFS客户端

192.168.100.12

NFS

NFS服务器

2.2基础准备

使用VMWare Workstation软件安装CentOS 7.5操作系统,镜像使用提供的CentOS-7-x86_64-DVD-1908。最小化CentOS 7.5虚拟机一台,另需要nfs服务器一台,YUM源使用本地系统源。

2.3案例需求

以工坊单位为基础,每个工坊设立一个单独共享资源目录,创建FTP虚拟用户名为zhang1-6;权限限制只有下载没有上传的权限,限制最大带宽60KB;zhang1-6用户的家目录名称对应6个不同的工坊名词缩写;新建的一块20G存储磁盘必须挂载在nfs的共享目录上,每7天晚上21点要求增量备份一次nfs的共享数据,到/backup/weekbackup目录下,存放在以日期命名的目录;每14天清除上上一周的备份数据。

3. FTP服务

3.1 什么是FTP

FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文件传输协议,FTP协议是现今使用最为广泛的网络文件共享协议之一,我们现在也一直有在用着FTP协议来进行各种文件的传输,FTP为我们提供了一种可靠的方式在网络上进行文件的共享。

 

3.2 FTP原理

FTP是C/S架构的服务,拥有一个服务器端和一个客户端,FTP底层通过TCP协议来作为传输协议,所以FTP协议是一种可靠的文件传输方式,FTP提供了两个端口号,20和21号端口,20号是数据接口,提供数据之间的传输,21号是命令接口,提供命令之间的传输。

FTP服务端与客户端连接一般有两种模式:主动模式(Active Mode)和被动模式(Passive Mode)

在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送FTP用户名和密码,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。如图:

 

建立可共享的yum源仓库 共享资源库的构建方式_客户端

 

 

在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。如图:

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_02

 

 

3.3 FTP状态码

FTP状态码

1xx – 肯定的初步答复

这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。

l  110 重新启动标记答复。

l  120 服务已就绪,在 nnn 分钟后开始。

l  125 数据连接已打开,正在开始传输。

l  150 文件状态正常,准备打开数据连接。

 

2xx – 肯定的完成答复

一项操作已经成功完成。客户端可以执行新命令。

l  200 命令确定。

l  202 未执行命令,站点上的命令过多。

l  211 系统状态,或系统帮助答复。

l  212 目录状态。

l  213 文件状态。

l  214 帮助消息。

l  215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。

l  220 服务就绪,可以执行新用户的请求。

l  221 服务关闭控制连接。如果适当,请注销。

l  225 数据连接打开,没有进行中的传输。

l  226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。

l  227 进入被动模式 (h1,h2,h3,h4,p1,p2)。

l  230 用户已登录,继续进行。

l  250 请求的文件操作正确,已完成。

l  257 已创建“PATHNAME”。

 

3xx – 肯定的中间答复

该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。

l  331 用户名正确,需要密码。

l  332 需要登录帐户。

l  350 请求的文件操作正在等待进一步的信息。

 

4xx – 瞬态否定的完成答复

该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。

l  421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。

l  425 无法打开数据连接。

l  426 Connection closed; transfer aborted.

l  450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。

l  451 请求的操作异常终止:正在处理本地错误。

l  452 未执行请求的操作。系统存储空间不够。

 

5xx – 永久性否定的完成答复

该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。

l  500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。

l  501 在参数中有语法错误。

l  502 未执行命令。

l  503 错误的命令序列。

l  504 未执行该参数的命令。

l  530 未登录。

l  532 存储文件需要帐户。

l  550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。

l  551 请求的操作异常终止:未知的页面类型。

l  552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。

l  553 未执行请求的操作。不允许的文件名。

 

常见的 FTP 状态代码及其原因

l  150 – FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。

l  226 – 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。

l  230 – 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。

l  331 – 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。

l  426 – 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。

l  530 – 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。

l  550 – 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录。

3.4 FTP客户端

ftp命令程序:是最简单的FTP客户端工具,Windows和Linux都拥有ftp命令程序,可以连接到FTP服务器进行交互式的上传、下载通信。

图形化FTP客户端工具:Windows中较常用的包括CuteFTP、FlashFXP、LeapFTP、Filezilla等,在图形化的客户端程序中,用户通过鼠标和菜单即可访问、管理FTP资源,而不需要掌握FTP交互命令,更易于使用。

下载工具:FlashGet、Wget等,包括大多数网页浏览器程序,都支持通过FTP协议下载文件,但因不具备FTP上传管理功能,通常不称为FTP客户端工具。

本案例采用的FTP客户端工具:Filezilla、LFTP(yum安装)。

官方网站:https://filezilla-project.org/download.php?show_all=1

配置主机名

# hostnamectl set-hostname ftp

3.5 vsftp部署安装

通过yum源安装vsftp:

# yum -y install vsftpd telnet  如果出错则sudo rm -f /var/run/yum.pid

# systemctl start vsftpd            #启动服务

# netstat -ntpl |grep 21

# systemctl stop firewalld    //关闭防火墙

# setenforce 0

# cd /etc/vsftpd/

# cp vsftpd.conf{,.bak}

# egrep -v '^#|^$' vsftpd.conf.bak

# egrep -v '^#|^$' vsftpd.conf.bak >vsftpd.conf

# cat vsftpd.conf

主配置文件:/etc/vsftpd/vsftpd.conf

主程序:/usr/sbin/vsftpd
       常用的全局配置项:

l  listen=YES:是否以独立运行的方式监听服务

l  listen_address=192.168.x.x:设置监听的 IP 地址

l  listen_port=21:设置监听 FTP 服务的端口号

l  write_enable=YES:是否启用写入权限

l  download_enable=YES:是否允许下载文件

l  userlist_enable=YES:是否启用 user_list 列表文件

l  userlist_deny=YES:是否禁用 user_list 中的用户

l  max_clients=0:限制并发客户端连接数

l  max_per_ip=0:限制同一 IP 地址的并发连接数

l  guest_enable=YES:启用虚拟用户

l  user_config_dir=/etc/vsftpd/vsftpd_user_conf :虚拟用户使用的配置文件目录

l  allow_writeable_chroot=YES:允许写入用户主目录

常用的匿名 FTP 配置项:

l  anonymous_enable=YES:启用匿名访问

l  anon_umask=022:匿名用户所上传文件的权限掩码

l  anon_root=/var/ftp:匿名用户的 FTP 根目录

l  anon_upload_enable=YES:允许上传文件

l  anon_mkdir_write_enable=YES:允许创建目录

l  anon_other_write_enable=YES:开放其他写入权

l  anon_max_rate=0:限制最大传输速率(字节/秒)
常用的本地用户 FTP 配置项:

l  local_enable=YES:是否启用本地系统用户

l  local_umask=022:本地用户所上传文件的权限掩码

l  local_root=/var/ftp:设置本地用户的 FTP 根目录

l  chroot_local_user=YES:是否将用户禁锢在主目录

3.6虚拟用户配置

在vsftpd服务器中,使用虚拟用户的主要好处在与:可以将FTP登录的账号与系统登录账号区分开,用户名、密码都不相同,从而进一步增强了FTP服务器的安全性。

基本步骤。如下图:

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_03

 

 

1.创建账号数据

vsftpd服务使用Berkeley DB格式的数据库文件来存放虚拟用户账号。建立这种数据库文件需要用到db_load工具,db_load工具由db4-utils软件包提供,默认已安装。

① 创建文本格式的用户名、密码列表。

奇数行:账号名,偶数行:密码(即上一行中账号的密码)

② 转化为 Berkeley DB 格式的数据文件

需要db_load 转换工具,默认已安装。

l  “-f”用于指定数据源文件

l  “-T”表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件

l  “-t hash”用于指定读取数据文件的基本方法

③ 为了提高虚拟用户账号文件的安全性,应将文件权限设置为600,以免数据外泄。

# vi /etc/vsftpd/users.conf

zhangsan

1234

zhaogao

5678

# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db

# chmod 600 users.db

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_04

 

 

④ 创建 FTP 根目录及虚拟用户映射的系统用户(此账号无需设置密码及登录shell)。如下:

[root@ftp ~]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin

[root@ftp ~]# mkdir -p /home/vsftpd/xmcsxy

[root@ftp ~]# chmod -R 755 /home/vsftpd

⑤  建立支持虚拟用户的PAM认证文件
       创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证配置。

如下:

[root@ftp ~]# vi /etc/pam.d/vsftpd

auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users

account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/user

2.添加虚拟用户支持

① 在 vsftpd.conf 文件中添加虚拟用户支持配置。如下:

[root@ftp ~]# vi /etc/vsftpd/vsftpd.conf

anonymous_enable=NO        #禁止匿名用户登录
增加下面配置参数:
chroot_local_user=YES        #禁止用户访问除主目录以外的目录
guest_enable=YES           #启用虚拟用户
allow_writeable_chroot=YES        # 允许写入用户主目录

建立可共享的yum源仓库 共享资源库的构建方式_客户端_05

 

 

② 为不同的虚拟用户建立独立的配置文件

通过前面的几个步骤,实际上已经可以重新加载vsftpd并提供服务了,使用任一个虚拟用户账号都可以登录FTP服务器并下载文件。但因为所有的虚拟用户都映射到同一个系统用户账号,因此FTP访问权限也是相同的,要么只能下载,要么只能上传。

若要为不同的虚拟用户账号设置不同的访问权限,可以通过为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加“user_config_dir”配置项。如下:

[root@ftp ~]# vi /etc/vsftpd/vsftpd.conf

user_config_dir=/etc/vsftpd/vsftpd_user_conf #虚拟用户使用的配置文件目录

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_06

 

 

① 有了上述配置以后,就可以在/etc/vsftpd/vsftpd_user_conf 目录中为每个虚拟用户分别建立配置文件了。如下:

[root@ftp ~]# mkdir -p /etc/vsftpd/vsftpd_user_conf

[root@ftp ~]# cd /etc/vsftpd/vsftpd_user_conf/

[root@ftp vsftpd_user_conf]# vi zhangsan

local_root=/home/vsftpd/xmcsxy        # 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。

anon_upload_enable=YES     # 是否允许登陆用户有上传权限。

write_enable=YES                # 是否允许登陆用户有写权限。

 

建立可共享的yum源仓库 共享资源库的构建方式_客户端_07

 

 

# vi zhaogao

local_root=/home/vsftpd/xmcsxy

anon_upload_enable=YES

write_enable=YES 

# chmod -R 755 *

在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件),否则该用户可能无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。

3.7重启服务并测试

重启服务生效配置文件:

[root@ftp ~]# systemctl restart vsftpd

[root@ftp ~]# systemctl enable vsftpd

Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

使用虚拟 FTP 账户访问测试:

zhangsan用户可以登录,并可以浏览、下载,也可以上传。

测试之前:关闭防火墙以及安全规则;

[root@ftp vsftpd_user_conf]# systemctl stop firewalld

[root@ftp vsftpd_user_conf]# systemctl disable firewalld

Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.

Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

[root@ftp vsftpd_user_conf]# setenforce 0

先往家目录写入一个文件:

[root@ftp ~]# cd /home/vsftpd/xmcsxy/

[root@ftp xmcsxy]# touch a.txt

使用lftp工具访问

NFS节点上部署lftp客户端:(命令行ftp客户端)

root@nfs ~]# yum -y install lftp

# lftp zhangsan@192.168.63.131

尝试下载

> get a.txt

[root@localhost ~]# ll

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_08

 

 

 

可以使用客户端工具FileZilla Client查看文件

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_09

 

 

 

执行一个上传的操作

# chmod  -R 777 /home/vsftpd/xmcsxy/

上传文件

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_10

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_11

 

 

 

可以通过日志查看登录是否报错:

[root@ftp ~]# tail -f /var/log/secure

 

使用lftp相比使用ftp的优势较多,可以显示上传下载的百分比进度以及可以上传下载文件夹。

lftp 用户名:密码@ftp地址:传送端口(默认21)

用法:

lftp username:password@127.0.0.1:21

lftp username@127.0.0.1 回车     ##默认21端口 回车后输入密码

lftp 127.0.0.1 回车   ##回车后 login 登录

lftp 回车 --> open 127.0.0.1 --> login 登录

 

LFTP内部命令:

l  ls  显示远端文件列表(!ls 显示本地文件列表)。

l  cd 切换远端目录(lcd 切换本地目录)。

l  get 下载远端文件。

l  mget 下载远端文件(可以用通配符也就是 *)。

l  pget 使用多个线程来下载远端文件, 预设为五个。

l  mirror 下载/上传(mirror -R)/同步 整个目录。

l  put 上传文件。

l  mput 上传多个文件(支持通配符)。

l  mv 移动远端文件(远端文件改名)。

l  rm 删除远端文件。

l  mrm 删除多个远端文件(支持通配符)。

l  mkdir 建立远端目录。

l  rmdir 删除远端目录。

l  pwd 显示目前远端所在目录(lpwd 显示本地目录)。

l  du 计算远端目录的大小

l  ! 执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)

l  lcd 切换本地目录

l  lpwd 显示本地目录

l  alias 定义别名

l  bookmark 设定书签。

l  exit 退出ftp

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_12

 

 

 

下载文件

lftp zhangsan@192.168.63.131:/> get a.txt

lftp zhangsan@192.168.63.131:/> exit

修改权限

# chmod 777 -R /home/vsftpd

上传文件

lftp zhangsan@192.168.63.131:/> put anaconda-ks.cfg

1571 bytes transferred

 

3.8访问限制黑白名单

设置ftp黑白名单:(系统账号FTP登录限制文件)

ftpusers和user_list两个文件用途和区别:

ftpusers它不受任何配置项影响,总是有效,是黑名单!

创建2个测试账号:test1和test2

 

# useradd test1

# useradd test2

# passwd test1

# passwd test2

建立可共享的yum源仓库 共享资源库的构建方式_服务器_13

 

 

 

测试将test1加入黑名单:

# cd /etc/vsftpd/

编辑配置文件添加test1

# vi ftpusers

test1

访问ftp的test1用户:

建立可共享的yum源仓库 共享资源库的构建方式_服务器_14

 

 

 

访问ftp的test2用户:

建立可共享的yum源仓库 共享资源库的构建方式_服务器_15

 

 

 

user_list 则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!

userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。

为了说明这个问题,我们来建立两个测试用户:

test1: 在user_list中

test2:不在user_list中

然后我们分别给两个配置项取不同的值,分4种Case进行测试:

Case 1: userlist_enable=YES, userlist_deny=YES

test1: 拒绝登入

test2: 允许登录

Case 2: userlist_enable=YES, userlist_deny=NO

test1: 允许登录

test2:拒绝登录(如user_list文件开头的注释所述,甚至不会提示输入密码,即无登入提示框,直接拒绝连接)

Case 3: userlist_enable=NO,userlist_deny=NO

test1: 允许登录

test2: 允许登录

Case 4: userlist_enable=NO,userlist_deny=YES

test1: 允许登录

test2: 允许登录

当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP

当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;

当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

4. NFS服务

4.1 什么是NFS

它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利;

而 NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间的传输数据就要有相对应的网络端口;基本上NFS服务器的端口开在2049上,但是由于文件系统较为复杂,NFS其他程序需要开启一些额外的端口,而这些额外端口又是随机的;那么客户端如何去知道这些额外随机端口呢?

通过远程过程调用(Remote Procedure Call,RPC)协议来实现!

 

4.2 RPC与NFS如何通讯

因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。

通讯步骤:

1)首先服务器端启动RPC服务,并开启111端口;

2)服务器端启动NFS服务,并向RPC注册端口信息;

3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口;

4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端;

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

 

4.3 NFS企业在企业中的应用场景

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如BBS产品的图片、附件、头像(网站BBS的程序不要放在NFS共享中),然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。

NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。

 

4.4 NFS部署

NFS服务端及客户端的部署

检查环境:

[root@nfs ~]# uname -a

Linux nfs 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

# hostnamectl set-hostname nfs

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_16

 

 

 

关闭防火墙,并设置开机不启动,selinux为0

# systemctl stop firewalld  

# systemctl disable firewalld

# setenforce  0

安装所需依赖包(两台机器都需要安装):

# yum -y install nfs-utils rpcbind

安装完后查看nfsnobody用户在不在:

# id nfsnobody

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_17

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_18

 

 

 

启动NFS相关服务(两台机器都要启动):

启动rpc服务:

# systemctl start rpcbind

# systemctl enable rpcbind

查看rpc端口:

# netstat -tnulp|grep rpc

查看端口映射情况:

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_19

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_20

 

 

 

# rpcinfo -p localhost(注:这里nfs服务没启动,看不到nfs端口的映射情况)

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_21

 

 

 

启动nfs服务(两台机器都要操作):

# systemctl start nfs

# systemctl enable nfs

# netstat -ntplu |grep rpc

# rpcinfo -p localhost

关闭防火墙及安全规则:

[root@nfs ~]# systemctl stop firewalld

[root@nfs ~]# systemctl disable firewalld

[root@nfs ~]# setenforce 0

4.5 NFS配置

nfs配置文件/etc/exports的格式:

NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者

NFS共享的目录 NFS客户端地址(参1,参2,……)

参数的含义:

NFS共享的常用参数,具体如下:

l  ro                    只读访问

l  rw                   读写访问

l  sync                所有数据在请求时写入共享

l  async              NFS在写入数据前可以相应请求

l  secure             NFS通过1024以下的安全TCP/IP端口发送

l  insecure          NFS通过1024以上的端口发送

l  subtree_check   如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)

l  no_subtree_check   和上面相对,不检查父目录权限

l  all_squash               共享文件的UID和GID映射匿名用户anonymous,适合公用目录。

l  no_all_squash         保留共享文件的UID和GID(默认)

l  root_squash             root用户的所有请求映射成如anonymous用户一样的权限(默认)

l  no_root_squash         root用户具有根目录的完全管理访问权限

l  anonuid=xxx            指定NFS服务器/etc/passwd文件中匿名用户的UID 

注: 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组,即no_root_squash不生效 ;

 

创建共享目录:

[root@nfs ~]# mkdir /data

[root@nfs ~]# mkdir /data/public

[root@nfs ~]# mkdir /data/test

[root@nfs ~]# mkdir /data/linux

建立可共享的yum源仓库 共享资源库的构建方式_客户端_22

 

 

 

更改共享目录权限:

[root@nfs ~]# chown -R nfsnobody.nfsnobody /data

[root@nfs ~]# chmod 755 -R /data

编辑nfs配置文件(注意IP的修改):

[root@nfs ~]# vi /etc/exports

/tmp    *(rw,no_root_squash)

/data/public    192.168.100.0/24(rw)

/data/test      192.168.100.11(rw)

/data/linux     *.xmcsxy.com(rw,all_squash,anonuid=40,anongid=40)

/tmp    *(rw,no_root_squash)指定所有网段可访问/tmp

4.6 生效配置与检验测试

重新加载nfs服务生效配置的方法:

方法1:

# systemctl restart nfs                  #重启服务 

方法2:

# exportfs -rv                          #重新挂载配置

用于管理NFS(Network File System)文件系统,在不直接编辑/etc/exports文件的情况下,可用exportfs来操作(命令属性、磁盘管理、命令属权限、超级用户、普通用户)。

# exportfs [-aruv]

参数说明如下:

l  -a:全部挂载(或卸载)/etc/exports文件内的设定。

l  -r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports及/var/lib/nfs/xtab中的内容。

l  -u:卸载某一目录。

l  -v:在export时将共享的目录显示在屏幕上。

检查有权限挂载的服务器是否能挂载:

方法1:

运用showmount命令查询

# showmount --help

建立可共享的yum源仓库 共享资源库的构建方式_客户端_23

 

 

 

Usage: showmount [-adehv]

        [--all] [--directories] [--exports]

        [--no-headers] [--help] [--version] [host]

l  -a或--all    以 host:dir 这样的格式来显示客户主机名和挂载点目录。

l  -d或--directories    仅显示被客户挂载的目录名。

l  -e或--exports    显示NFS服务器的输出清单。

l  -h或--help    显示帮助信息。

l  -v或--version    显示版本信。

l  --no-headers    禁止输出描述头部信息。

显示指定NFS服务器连接NFS客户端的信息

# showmount 192.168.100.12  #此ip为nfs服务器的

显示输出目录列表

# showmount -e

显示指定NFS服务器输出目录列表(也称为共享目录列表)

# showmount -e 192.168.100.12

显示被挂载的共享目录

# showmount -d

显示客户端信息和共享目录

# showmount -a

显示指定NFS服务器的客户端信息和共享目录

# showmount -a 192.168.100.12

showmount -e IP地址或localhost  

例如:

[root@nfs ~]# showmount -e localhost

Export list for localhost:

/tmp         *

/data/linux  *.xmcsxy.com

/data/public 192.168.100.0/24

/data/test   192.168.100.11

方法2:可以把nfs服务器当做客户端来测试

 

测试完取消挂载:

[root@nfs ~]# umount /mnt/

永久挂载:

方法1:

编辑/etc/fstab,把挂载信息写进去,每次开机后就会自动挂载上去了!

# vi /etc/fstab

192.168.100.11:/data/public /mnt        nfs         defaults        0 0

方法2:

/etc/rc.local将挂载命令写到这个里面,每次开机都会自动去执行命令!

5. 定时计划与备份脚本

5.1 crond服务介绍

crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

① 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。

在/etc/crontab文件,这个就是系统任务调度的配置文件。

 

② 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

用户可以使用 crontab 工具来定制自己的计划任务。

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute hour day month week command

各个字段的含义:

l  minute:表示分钟,可以是从0到59之间的任何整数。

l  hour:表示小时,可以是从0到23之间的任何整数。

l  day:表示日期,可以是从1到31之间的任何整数。

l  month:表示月份,可以是从1到12之间的任何整数。

l  week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

l  command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

l  在以上各个字段中,还可以使用以下特殊字符:

l  星号(*):代表所有可能的值,例如day字段如果是星号,则表示在满足其它字段的制约条件后每天都执行该命令操作。

l  逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

l  中杠(-):可以用整数之间的中杠表示一个整数范围,例如“3-6”表示“3,4,5,6”

l  正斜线(/):可以用正斜线指定时间的间隔频率,例如在hour字段中“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

 

5.2 如何使用crondtab

检验是否安装crontab:

# rpm -qa | grep crontabs

如果未安装crontab,运用本地yum安装部署:

# yum install crontabs

启动服务并检查服务状态:

# systemctl status crond

# systemctl start crond

crontab 命令常用选项及功能:

l  -u user   用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo

l  用户的 crontab 服务,此选项一般有 root 用户来运行。

l  -e    编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。

l  -l    显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。

l  -r  从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。

l  -i    在删除用户的 crontab 文件时,给确认提示。

例如:

进入编辑界面:

# crontab -e

*/5 * * * * echo "11" >> /opt/test               #每隔5分钟往test文件里面写入一行“11”

列出crontab文件:

# crontab -l

*/5 * * * * echo "11" >> /opt/test

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_24

 

 

 

删除root用户所有的定时任务:

# crontab -r

# crontab -l

no crontab for root

建立可共享的yum源仓库 共享资源库的构建方式_客户端_25

 

 

 

删除计划任务加上确认提示:

# crontab -ri

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_26

 

 

 

crontab: really delete root's crontab? y

 

 

 

书写 crontab 定时任务时,需要注意以下几个事项:

6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。

crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。

在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。

在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。

 

5.3 备份脚本

 

1.根据案例需求写一个使用shell脚本备份共享资源文件,这个脚本需要满足以下条件:

① 判断备份目录是否存在,不在则创建。

② 每次执行按照日期在备份目录中生成一个日期目录,并判断其是否存在,存在则删除上上周的目录;

③ 运用rsync将共享资源增量备份到日期目录中,并且输出结果。

rsync服务:

rsync是可以实现增量备份的工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

rsync的选项说明:

l  -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。

l  -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。

l  -n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。

l  -a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。

l  -r --recursive:递归到目录中去。

l  -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新检查出mtime不同从而导致增量传输无效。

l  -o --owner:保持owner属性(属主)。

l  -g --group:保持group属性(属组)。

l  -p --perms:保持perms属性(权限,不包括特殊权限)。

l  -D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。

l  -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。

l  -z :传输时进行压缩提高效率。

例如:

# yum install rsync

# rsync /etc/fstab /tmp           # 在本地同步

# rsync -r 192.168.100.12:/etc /tmp    # 将远程主机的/etc目录拷贝到本地/tmp下,以保证本地/tmp目录和远程/etc保持同步。

rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。

脚本如下:# vi /usr/local/sbin/backup.sh

a=`date '+%Y%m%d'`

b=/backup/weekbackup

c=/var/log/backup.log

pname=$(rpm -qa | grep rsync)

#判断rsync是否存在

if [ $? -eq 0 ]

then

        echo "软件包rsync已经安装。"

else

        echo "软件包rsync没有安装"

        yum -y install rsync >> /dev/null

        if [ $? -eq 0 ];then

                echo "安装rsync完成。"

        else

                echo "安装rsync失败。"

        fi

fi

#判断备份目录是否存在,并增量备份。

if [ ! -d "$b" ];then

        mkdir -p $b

        echo "$a Backup File missing!" >> /var/log/backup.log

        rsync -rvz /data/* $b/$a

else

        rsync -rvz /data/* $b/$a

        if [ -d $b/$a ];then

                echo "$a Backup success." >> /var/log/backup.log

                find $b -mtime +14 | xargs rm -rf

        else

                echo "$a Backup failed." >> /var/log/backup.log

        fi

fi

脚本添加可执行权限:

# chmod 755 /usr/local/sbin/backup.sh

添加定时任务:(每7天凌晨1点执行一次脚本)

# crontab -e

* 1 */7 * * sh /usr/local/sbin/backup.sh

 

6. 案例实施

给NFS节点挂载一个20G的磁盘

修改主机名:

# hostnamectl set-hostname ftp

# hostnamectl set-hostname nfs

关闭防火墙及安全规则:

# systemctl stop firewalld

# systemctl disable firewalld

# setenforce 0

6.2 FTP部署

yum安装FTP:

[root@ftp ~]# yum -y install vsftpd

启动ftp并设置开机自启:

[root@ftp ~]# systemctl start vsftpd

[root@ftp ~]# systemctl enable vsftpd

创建虚拟用户账号(zhang1-6):

[root@ftp ~]# vi /etc/vsftpd/users.conf

建立可共享的yum源仓库 共享资源库的构建方式_服务器_27

 

 

 

删除原有的users.db

 rm /etc/vsftpd/users.db

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_28

 

 

 

转化为 Berkeley DB 格式的数据文件:

[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db

设置DB文件权限提高安全性:

[root@ftp ~]# chmod 600 /etc/vsftpd/users.db

 

为不同的虚拟用户建立独立的配置文件:

# cd /etc/vsftpd/vsftpd_user_conf/

# vi zhang1

local_root=/home/vsftpd/xmcsxy/yumwei        #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_29

 

 

 

以此类推

# vi zhang2

local_root=/home/vsftpd/xmcsxy/JAVA           #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_30

 

 

 

# vi zhang3

local_root=/home/vsftpd/xmcsxy/bigdata         #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_31

 

 

 

# vi zhang4

local_root=/home/vsftpd/xmcsxy/weixin          #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_32

 

 

 

#vi zhang5

local_root=/home/vsftpd/xmcsxy/android         #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

建立可共享的yum源仓库 共享资源库的构建方式_客户端_33

 

 

 

# vi zhang6

local_root=/home/vsftpd/xmcsxy/game            #本地家目录路径

write_enable=YES

anon_upload_enable=NO

anon_max_rate=60000

 

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_34

 

 

 

把zhang1.....zhang6配置完,修改每个用户的本地家目录路径!

重启服务生效配置文件:

[root@ftp ~]# systemctl restart vsftpd

[root@ftp ~]# systemctl status vsftpd

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_35

 

 

 

[root@ftp ~]# netstat -lntp | grep 21

tcp6       0      0 :::21                   :::*                    LISTEN      18750/vsftpd 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_36

 

 

 

6.3 NFS部署

检查环境(两台都需要):

# uname -a

建立可共享的yum源仓库 共享资源库的构建方式_客户端_37

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_38

 

 

 

安装nfs依赖包(两台都需要):

# yum -y install nfs-utils rpcbind

 

查看nfsnobody用户在不在(两台都需要):

# id nfsnobody

uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)

建立可共享的yum源仓库 共享资源库的构建方式_服务器_39

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_40

 

 

 

启动nfs相关服务(两台都需要)

启动rpc服务:

# systemctl start rpcbind

# systemctl enable rpcbind

启动nfs服务:

# systemctl start nfs

# systemctl enable nfs

[root@ftp ~]# netstat -lntp | grep rpc

建立可共享的yum源仓库 共享资源库的构建方式_客户端_41

 

 

 

查看端口映射情况:

# rpcinfo -p localhost(注:这里nfs服务没启动,看不到nfs端口的映射情况)

建立可共享的yum源仓库 共享资源库的构建方式_客户端_42

 

 

 

添加一块磁盘将永久挂载在/data目录上:

① 添加新磁盘重启虚拟机

建立可共享的yum源仓库 共享资源库的构建方式_服务器_43

 

 

 

① 划分分区

# cat /proc/partitions              #查看新磁盘名字

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_44

 

 

 

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_45

 

 

 

 

 

[root@nfs ~]# fdisk /dev/sdb

命令(输入 m 获取帮助):n

Partition type:

   p   primary (0 primary, 0 extended, 4 free)

   e   extended

Select (default p): p

分区号 (1-4,默认 1):

起始 扇区 (2048-41943039,默认为 2048):

将使用默认值 2048

Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):

将使用默认值 41943039

分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):w

The partition table has been altered!

Calling ioctl() to re-read partition table.

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_46

 

 

 

 

 

② 格式化分区并永久挂载

[root@nfs ~]# mkfs.ext4 /dev/sdb1

建立可共享的yum源仓库 共享资源库的构建方式_客户端_47

 

 

 

删掉原有的/data路径

[root@nfs ~]# rm -rf /data

创建共享目录:

[root@nfs ~]# mkdir /data

 

在/etc/fstab增加挂载。

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_48

 

 

[root@nfs ~]# mount -a

[root@nfs ~]# df -h                       #查看是否挂载成功

文件系统                 容量  已用  可用 已用% 挂载点

devtmpfs                 898M     0  898M    0% /dev

tmpfs                    910M     0  910M    0% /dev/shm

tmpfs                    910M  9.6M  901M    2% /run

tmpfs                    910M     0  910M    0% /sys/fs/cgroup

/dev/mapper/centos-root   21G  1.3G   20G    7% /

/dev/sda1               1014M  150M  865M   15% /boot

tmpfs                    182M     0  182M    0% /run/user/0

/dev/sdb1                 20G   45M   19G    1% /data

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_49

 

 

① 配置nfs共享目录,把原有的/etc/exports中的内容清除,写入以下内容,注意IP网段地址的修改。

[root@nfs ~]# vi /etc/exports

/data   192.168.100.0/24(rw,no_root_squash,async)           #分配no_root_squash权限

建立可共享的yum源仓库 共享资源库的构建方式_服务器_50

 

① 生效配置与检验

[root@nfs ~]# exportfs -rv

exporting 192.168.157.152:/data

建立可共享的yum源仓库 共享资源库的构建方式_客户端_51

 

 

[root@nfs ~]# showmount -e localhost

Export list for localhost:

/data 192.168.157.152

建立可共享的yum源仓库 共享资源库的构建方式_客户端_52

 

 

[root@ftp ~]# showmount -e 192.168.157.152           #检测nfs共享目录创建成果

Export list for 192.168.100.12:

/data 192.168.100.0/24

 

建立可共享的yum源仓库 共享资源库的构建方式_客户端_53

 

 

6.4 调试与检验成果

将/data目录挂载到/home/vsftpd/xmcsxy/目录上

配置永久挂载

[root@ftp xmcsxy]# vim /etc/fstab

192.168.157.152:/data    /home/vsftpd/xmcsxy     nfs     defaults        0 0

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_54

 

 

[root@ftp xmcsxy]# mount -a 

 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_55

 

 

[root@ftp ~]# df -h

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_56

 

 

创建对应FTP虚拟用户的家目录:

[root@ftp ~]# cd /home/vsftpd/xmcsxy/

[root@ftp xmcsxy]# mkdir yumwei

[root@ftp xmcsxy]# mkdir JAVA

[root@ftp xmcsxy]# mkdir bigdata

[root@ftp xmcsxy]# mkdir weixin

[root@ftp xmcsxy]# mkdir android

[root@ftp xmcsxy]# mkdir game

[root@ftp xmcsxy]# ll

建立可共享的yum源仓库 共享资源库的构建方式_客户端_57

 

 

NFS节点查看

[root@nfs ~]# ll /data

建立可共享的yum源仓库 共享资源库的构建方式_客户端_58

 

 

在nfs服务端安装lftp(ftp命令行客户端):

[root@nfs ~]# yum -y install lftp

[root@nfs ~]# lftp zhang1@192.168.152.157

口令:

lftp zhang1@192.168.157.152:~> ls

-rw-r--r--    1 0        0        18019170 Feb 20 03:25 zabbix-4.0.3.tar.gz

尝试再往yunwei目录添加一个文件:

[root@ftp xmcsxy]# cd yumwei/

[root@ftp yumwei]# touch 1.txt

[root@ftp yumwei]# ll

总用量 0

-rw-r--r--. 1 root root 0 3月  10 22:29 1.txt

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_59

 

 

再次查看:

lftp zhang1@192.168.152.157:/> ls  

 

建立可共享的yum源仓库 共享资源库的构建方式_建立可共享的yum源仓库_60

 

 

至此架构系统部署已经完成!

6.5 shell备用数据脚本及定时计划

脚本实现:

[root@nfs ~]# vi /usr/local/sbin/backup.sh

建立可共享的yum源仓库 共享资源库的构建方式_虚拟用户_61

 

 

[root@nfs ~]# sh -x /usr/local/sbin/backup.sh 

建立可共享的yum源仓库 共享资源库的构建方式_服务器_62

 

 

定时计划:

[root@nfs ~]# crontab -e

建立可共享的yum源仓库 共享资源库的构建方式_服务器_63

 

 至此本案例结束!!!