IP | 主机名 | 节点 |
---|---|---|
192.168.235.128 | FTP | FTP 服务器、NFS 客户端 |
192.168.235.129 | NFS | NFS 服务器 |
/backup/weekbackup
目录下FTP(File Transfer Protocol) 文件传输协议,进行可靠的网络文件共享。
FTP 是 C/S 架构的服务,拥有一个服务器端和客户端
底层使用 TCP 协议来作为传输协议,所以是可靠的文件传输协议
FTP 提供 20 和 21 两个端口:
20 号端口为 数据端口,提供数据之间的传输
21号端口为 命令端口,提供命令之间的传输
FTP 服务端与客户端连接的主动模式:
① FTP 客户端随机开放一个大于1024的端口 N 向服务端的21号端口发送密码和用户名并开放 N+1 端口监听服务端指示,服务端确认用户名密码是否正确;
② 若正确,客户端则使用 N+1 端口向服务端的 21 端口发送 PORT N+1 命令,告诉服务器客户端使用了主动模式并开放了端口。
③ 服务器接收 PORT 命令后,开启 20 端口向客户端 N+1 端口发送数据,进行数据传输。
FTP 服务端与客户端相连的被动模式:
① FTP 客户端随机开放一个大于1024的端口 N 向服务端的21号端口发送密码和用户名并再次开放 N+1 端口监听服务端指示,服务端确认用户名密码是否正确;
② 若正确,客户端则使用 N+1 端口向服务端的 21 端口发送 PASV 命令,告诉服务器客户端使用了被动模式。
③ 服务器收到命令后,会开放一个大于 1024 的端口 P 进行监听,然后使用 PORT P 命令通知客户端,自己的数据端口是 P。
④ 客户端收到命令后,会通过 N+1 端口连接端口 P,然后实现数据传输。
这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。
110 重新启动标记答复。
120 服务已就绪,在 nnn 分钟后开始。
125 数据连接已打开,正在开始传输。
150 文件状态正常,准备打开数据连接。
一项操作已经成功完成。客户端可以执行新命令。
该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。
该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。
该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。
通过 yum 源安装 vsftp:
# yum install vsftpd tenet
# systemctl start vsftpd //启动服务
# netstat -lntp | grep 21 //查看端口是否监听
# systemctl stop firewalld
# setenforce 0
# cd /etc/vstpd
# cp vstpd.conf vstpd.conf_bak
# egrep -v '^#|^$' vsftpd.conf_bak //忽略井号和$符并且输出
# egrep -v '^#|^$' vstpd.conf_bak > vsftpd.conf //将大约号前的内容完全重定向到 conf
`listen=YES`:是否以独立的运行方式监听服务
listen_address=IP
:设置监听的地址
listen_port=21
:设置监听 FTP 服务的端口号
write_enable=YES
: 是否启用写入权限
download_enable=YES
: 是否允许下载文件
userlist_enable=YES
: 是否启用 user_list 列表文件,user_list 中的用户名不可用
userlist_deny=YES
:是否禁用 user_list 中的用户
max_clients=0
: 限制并发客户连接数
max_per_ip=0
:限制同一ip地址的并发连接数
guest_enable=YES
启用虚拟用户
use_config_dir=/etc/vsftpd/vsftpd_user_conf
:虚拟用户使用的配置文件目录
allow_writeable_chroot=YES
:允许写入用户主目录
anonymous_enable=YES
:启用匿名访问
anon_umask=022
:匿名用户所上传文件的权限掩码,即777-022=755
anon_root=/var/ftp
:匿名用户的FTP根目录
anon_upload_enable=YES
:允许上传文件
anon_mkdir_write_enable=YES
:允许创建目录
anon_other_write_enable=YES
:开放其他写入权限
anon_max_rate=0
:限制最大传输速率(字节/每秒)
ocal_enable=YES
:是否启用本地系统用户
local_umask=022
:本地用户所上传文件的权限掩码
local_root=/var/ftp
:设置本地用户的 FTP根目录
chroot_local_user=YES
:是否将用户禁锢在主目录
创建账号数据
vsftpd 服务使用 Berkeley DB 格式的数据库文件来存放虚拟用户账号。建立这种数据库文件需要 db_load,基本格式如下:
-f
用于指定数据源文件
-T
允许非 Berkeley DB 的文件可以转换为 DB 数据文件
-t hash
用于指定读取数据文件的基本方法
# vim /etc/vsftpd/users.conf //创建文本格式的用户名秘密列表,奇数行为用户名,偶数行是密码
[写入如下]
zhangsan
1
[精致的结尾]
# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db
# chmod 600 users.db //保证账号文件的安全性
创建 FTP 根目录以及虚拟用户映射的系统用户
------ 该账号不需要设置密码和登录 shell
# useradd vsftpd -s /sbin/nologin -d /home/vsftpd
# mkdir -p /home/vsftpd/xmcsxy
# chmod -R 755 /home/vsftpd
建立支持虚拟用户的 PAM 认证文件
创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。
在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证配置。
# 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/users
[精致的结尾]
添加虚拟用户支持
# vim /etc/vsftpd/vsftpd.conf //在主配置文件配置虚拟用户支持
[配置内容如下]
anonymous_enable=NO //禁止匿名用户登录,增加下面的参数
chroot_local_user=YES //禁止用户访问除主目录以外的目录
guest_enable=YES //启用虚拟用户
allow_writeable_chroot=YES //允许写入用户主目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf //虚拟用户使用的配置文件目录
[精致的结尾]
# mkdir -p /etc/vsftpd/vsftpd_user_conf
# cd !$
# vim zhangsan //各个用户的配置文件
[配置内容如下]
local_root=/home/vsftpd/xmcsxy //当本地用户登录时,将被更改到定义的目录下,默认是 /var/ftp/
anon_upload_enable=YES //是否允许登陆用户有上传权限
write_enable=YES //是否允许登陆用户有写权限
重启服务并测试
# systemctl restart vsftpd
# systemctl enable vsftpd //出现以下内容为成功
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
# 关闭防火墙和selinux
# cd /home/vsftpd/xmcsxy/
# touch a.txt
nfs# yum -y install lftp
nfs# lftp [email protected]
Password:
lftp [email protected]:~> ls
ls: Login failed: 530 Login incorrect. //不行就重装,还可以查看 /var/log/secure 的错误日志
LFTP 内部命令:
RPC 用来统一管理 NFS 端口的服务,并且统一对外的端口是 111,RPC 会记录 NFS 端口的信息。
通讯步骤:
# uname -a // 查看是不是 centos 7
# hostnamectl set-hostname nfs
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# yum -y install nfs-utils rpcbind // 安装所需要的依赖包,两台都要
# id nfsnobody //查看 nsfnobody 用户是否存在,有内容输出即为存在,两台都要
# systemctl start rpcbind //启动服务,两台都要
# systemctl enable rpcbind //启动服务,两台都要
# netstat -tnulp|grep rpc //查看端口
# rpcinfo -p localhost(注:这里nfs服务没启动,看不到nfs端口的映射情况)
# systemctl start nfs 启动 nfs 服务 ,两台都要
# systemctl enable nfs
# netstat -ntplu |grep rpc
# rpcinfo -p localhost
# mkdir /data
# mkdir /data/public
# mkdir /data/test
# mkdir /data/linux
# chown -R nfsnobody.nfsnobody /data
# chmod 755 -R /data
# 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)
[精致的结尾]
/etc/exports
的格式:NFS 共享目录 NFS 客户端地址(参1,参2,....)
NFS 共享目录2 NFS 客户端地址2(参1,参2,....)
.......
NFS 共享的常用参数:
ro
只读访问
rw
读写访问
sync
所有数据在请求时写入共享l async NFS在写入数据前可以相应请求
secure
NFS通过1024以下的安全TCP/IP端口发送
insecure
NFS通过1024以上的端口发送
subtree_check
如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check
和上面相对,不检查父目录权限
all_squash
共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash
保留共享文件的UID和GID(默认)
root_squash
root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash
root用户具有根目录的完全管理访问权限
anonuid=xxx
指定NFS服务器/etc/passwd文件中匿名用户的UID
------- 重新加载 nfs 服务生效配置的方法------
# systemctl restart nfs //方法 1
# exportfs -rv //方法 2
# showmount -e localhsot //检查权限挂载服务器能否挂载,输出内容如下:
/tmp *
/data/linux *.xmcsxy.com
/data/public 192.168.100.0/24
/data/test 192.168.100.11
-a
全部挂载/etc/exports
文件内的设定-r
重新挂载 exports
中的设定,此外同步更新exports
和 /var/lib/nfs/xtab
中的内容-u
卸载某一目录-v
在 export
是将共享的目录显示在屏幕上crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似。
Linux下的任务调度分为两类:
① 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc/crontab文件,这个就是系统任务调度的配置文件。
② 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
各个字段的含义:
安装 contab
# yum install -y crontabs
# systemctl status crond
# systemctl start crond
crontab 命令常用选项和功能:
-u
用来设定某个用户的 crontab 服务,如 “ -u demo" 表示设备 demo 用户的 contab 服务,此选项一般由 root 用户执行
-e
编辑某个用户的 crontab 文件内容。如果不指定用户,则为 root
-l
显示某用户的 crontab 文件内容,默认当前
-r
从 /var/spool/cron 删除某用户的 crontab 文件,默认当前用户
-i
在删除用户的 crontab 文件时,给确认提示
-------例如--------
# crontab -e //进入编辑页面
[配置如下内容]
*/5 * * * echo "11" >> /opt/test //每隔 5 分钟向 test 文件里面写入一行 11
# crontab -l //列出 crontab 文件
备份软件用 rsync ,可以实现增量备份和远传输的工具。基本选项如下:
-v
显示备份过程
-P
显示文件传输的进度信息
-n
测试传输
-a
归档传输,递归传输保持文件属性
-r
递归到目录中
-t
保持 mtime 属性,任何时候都要加
-o
保持属主属性
-g
保持属组属性
-p
保持权限,但不包括特殊权限
-D
拷贝设备文件和特殊文件
-l
拷贝软连接本身
-z
传输时压缩提高效率
# 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 //脚本添加可执行权限:
# crontab -e //添加定时任务:(每7天凌晨1点执行一次脚本)
[配置内容如下]
* 1 */7 * * sh /usr/local/sbin/backup.sh
[精致的结尾]
给 NFS 节点挂载一个磁盘
基础搭建
# hostnamectl set-hostname ftp
# hostnamectl set-hostname nfs
-----关闭防火墙及安全规则----------
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0
# yum -y install vsftpd
------启动ftp并设置开机自启----------
# systemctl start vsftpd
# systemctl enable vsftpd
# vi /etc/vsftpd/users.conf
[配置内容如下]
zhang1
1
zhang2
1
zhang3
1
[精致的结尾]
# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db //创建 DB 库文件
# 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
[精致的结尾]
。。。。。zhang2 zhang3 亦是如此
# systemctl restart vsftpd
# systemctl status vsftpd
# netstat -lntp | grep 21
tcp6 0 0 :::21 :::* LISTEN 18750/vsftpd
# uname -a //检查环境(两台都需要)
# yum -y install nfs-utils rpcbind //安装nfs依赖包(两台都需要)
# id nfsnobody //查看nfsnobody用户在不在(两台都需要)
uid=65534(nfsnobody) gid=65534(nfsnobody) 组=65534(nfsnobody)
# systemctl start rpcbind //启动rpc服务
# systemctl enable rpcbind
# systemctl start nfs //启动nfs服务
# systemctl enable nfs
[root@ftp ~]# netstat -lntp | grep rpc //查看rpc端口
tcp 0 0 0.0.0.0:34875 0.0.0.0:* LISTEN 19141/rpc.statd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 19162/rpc.mountd
tcp6 0 0 :::48860 :::* LISTEN 19141/rpc.statd
tcp6 0 0 :::20048 :::* LISTEN 19162/rpc.mountd
查看端口映射情况: rpcinfo -p localhost(注:这里nfs服务没启动,看不到nfs端口的映射情况)
-------在VMware中添加一个新的磁盘并重启虚拟机---------
# 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.
正在同步磁盘。
# mkfs.ext4 /dev/sdb1 //格式化磁盘
# rm -rf /data //删掉原有的/data路径
# mkdir /data //创建共享目录
[root@nfs ~]# vi /etc/fstab //在/etc/fstab增加挂载
[增加内容如下]
/dev/sdb1 /data ext4 defaults 0 0
[精致的结尾]
[root@nfs ~]# mount -a
[root@nfs ~]# df -h //查看是否挂载成功
vi /etc/exports
[配置内容如下]
/data 192.168.235.0/24(rw,no_root_squash,async) #分配no_root_squash权限
[精致的结尾]
# exportfs -rv
exporting 192.168.235.0/24:/data
# showmount -e localhost
Export list for localhost: /data 192.168.235.0/24
# showmount -e 192.168.235.129 #检测nfs共享目录创建成果
Export list for 192.168.100.12: /data 192.168.100.0/24
1. clnt_create: RPC: Program not registered
以此关闭nfs和rpcbind命令:
# /etc/init.d/nfs stop
# /etc/init.d/rpcbind stop
再依次启动服务,命令:(注意先启动rpc)
# /etc/init.d/rpcbind start
# /etc/init.d/nfs start
2. clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
原因:nfs 服务的防火墙没关
ftp# vim /etc/fstab
[配置内容如下]
192.168.100.12:/data /home/vsftpd/xmcsxy nfs defaults 0 0
[精致的结尾]
ftp# mount -a
ftp# df -h
ftp# mkdir yumwei
ftp# mkdir zhang2
ftp# mkdir zhang3
------------- NFS 节点查看-------------
# ls data
lost+found yumwei zhang2 zhang3
# yum -y install lftp
# lftp [email protected]
password:
lftp [email protected]:~>ls
lftp [email protected]:/>
[root@nfs ~]# 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安装包检查
#判断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
---------------测试脚本执行过程结果---------
[root@nfs ~]# sh -x /usr/local/sbin/backup.sh
定时计划:
[root@nfs ~]# crontab -e
* 21 */7 * * sh /usr/local/sbin/backup.sh #每7天晚上21点执行一次