disk

fdisk

fdisk -l 列出分区
fdisk /dev/sda
p查看    n添加    w保存    d删除    t更改分区标识

更改分区表 partprode 或者重启

测试hdparm -Tt

添加swap
1fdisk 添加swap   mkswap /xx/xx 
2dd if=/dev/zero of=/tmp/swap bs=大小 count=次数
        写入/etc/fstab
swapon /xx/xx  启用swap   swapoff  停用swap    swapon -s 检查
fsck 手动检查磁盘(不能操作已挂载的磁盘)

parted

针对大于2T的磁盘
新增存储用Parted分区并建LVM卷

一,Parted分区
1parted分区  www.2cto.com  
# parted /dev/sda
GNU Parted 2.1
使用 /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                               首先看看帮助熟悉下                              

(parted) mktable                                                         
新的磁盘标签类型? gpt                     GPT就是GRUB分区表,如果是MBR,最大支持2T分区                           
(parted) p                                 打印一下信息这里的4398GB是磁盘容量                                 
Model: DELL MD32xx (scsi)
Disk /dev/sda: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt


Number  Start  End  Size  File system  Name  标志


(parted) mkpart                            #新建分区                               
分区名称?  []?                            #默认                               
文件系统类型?  [ext2]?                    #默认                               
起始点? 0G   #起点
结束点? 4398G                             #终点                            
(parted) p                                                                
Model: DELL MD32xx (scsi)
Disk /dev/sda: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt


Number  Start   End     Size    File system  Name  标志
 1      1049kB  4398GB  4398GB


(parted) toggle 1 lvm                      #标记成lvm                                   
(parted) p                                                                
Model: DELL MD32xx (scsi)
Disk /dev/sda: 4398GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt


Number  Start   End     Size    File system  Name  标志
 1      1049kB  4398GB  4398GB                     lvm


(parted) quit                                                             
信息: You may need to update /etc/fstab.
2,同样的方法对sdb,sdc,sdd 分区                                  
二,创建LVM,分三大步,分别建PV,VG,LVM
1,建PV
# pvcreate /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
  Writing physical volume data to disk "/dev/sda1"
  Physical volume "/dev/sda1" successfully created
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created
  Writing physical volume data to disk "/dev/sdc1"
  Physical volume "/dev/sdc1" successfully created
  Writing physical volume data to disk "/dev/sdd1"
  Physical volume "/dev/sdd1" successfully created
2,建VG
# vgcreate md3200 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
  Volume group "md3200" successfully created
# lvcreate -n md3200lv1 -L 8T md3200
  Logical volume "md3200lv1" created
You have new mail in /var/spool/mail/root
3,建LVM
#lvcreate -n md3200lv1 -L 8T md3200
  Logical volume "md3200lv1" created
#lvcreate -n md3200lv2 -L 8T md3200
 Logical volume "md3200lv2" created
三,格式化文件系统
# mkfs.ext4 /dev/md3200/md3200lv1 
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
536870912 inodes, 2147483648 blocks
107374182 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=4294967296
65536 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000, 550731776, 644972544, 1934917632


正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成


This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
四,设置开机自动挂载
# mkdir md3200lv1  md3200lv2
# mount /dev/md3200/md3200lv1 /md3200lv1/
# ls /md3200lv1/
lost+found
#tail -n 2 /etc/fstab
/dev/md3200/md3200lv1 /md3200lv1                ext4    defaults                1 2
/dev/md3200/md3200lv2 /md3200lv2                ext4    defaults                1 2
五,重启验证
#reboot
# df -hl
文件系统              容量  已用  可用 已用%% 挂载点
/dev/mapper/md3200-md3200lv1
                      7.9T  175M  7.5T   1% /md3200lv1
/dev/mapper/md3200-md3200lv2
                      7.9T  175M  7.5T   1% /md3200lv2
六,最后顺便测试一下存储的读写速度
# dd if=/dev/zero of=./test bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,8.83453 秒,1.2 GB/秒
# free -g
             total       used       free     shared    buffers     cached
Mem:            62         11         51          0          0          9
-/+ buffers/cache:          1         61
Swap:            7          0          7
# dd if=./test of=./test1  bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,12.3038 秒,852 MB/秒
# dd if=./test1 of=./test2  bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,19.0357 秒,551 MB/秒
# dd if=./test2 of=./test3 bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,18.641 秒,563 MB/秒
# free -g
             total       used       free     shared    buffers     cached
Mem:            62         41         21          0          0         39
-/+ buffers/cache:          2         60
Swap:            7          0          7
# dd if=./test3 of=./test4 bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,17.3797 秒,603 MB/秒
# dd if=./test4 of=./test5 bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,22.8714 秒,458 MB/秒
# dd if=./test5 of=./test6 bs=10M count=1000
记录了1000+0 的读入
记录了1000+0 的写出
10485760000字节(10 GB)已复制,100.246 秒,105 MB/秒

因为内存是64G,故前面测试有缓存,最后105为实际读写速度。

来源: http://www.2cto.com/os/201303/195308.html

MegaCli

http://www.avagotech.com/docs-and-downloads/raid-controllers/raid-controllers-common-files/8-07-14_MegaCLI.zip

首先介绍下Linux系统本身查看

软件raid:查看raid级别,状态等信息

#cat /proc/mdstat

硬件raid:查看raid的厂商,型号,级别

#dmesg | grep -i raid

#cat /proc/scsi/scsi

2.硬件raid最佳的办法是通过已安装的raid厂商的管理工具来查看,下面安装MegaCLI工具查看

首先下载MegaCli,解压缩。#rpm -ivh MegaCli-1.01.24-0.i386.rpm  安装在/opt下,所以执行命令都是/opt/MegaCli 哦。

命令使用:

# /opt/MegaRAID/MegaCli/MegaCli64 -CfgForeign -Clear -a0 清除Foreign状态

#/opt/MegaCli  -LDInfo -Lall -aALL raid级别

#/opt/MegaCli -AdpAllInfo -aALL raid卡信息

#/opt/MegaCli -PDList -aALL 查看硬盘信息

#/opt/MegaCli -AdpBbuCmd -aAll 查看电池信息

#/opt/MegaCli -FwTermLog -Dsply -aALL 查看raid卡日志

#/opt/MegaCli -adpCount 【显示适配器个数】

#/opt/MegaCli -AdpGetTime aALL 【显示适配器时间】

#/opt/MegaCli -AdpAllInfo -aAll    【显示所有适配器信息】

#/opt/MegaCli -LDInfo -LALL -aAll    【显示所有逻辑磁盘组信息】

#/opt/MegaCli -PDList -aAll    【显示所有的物理信息】

#/opt/MegaCli -AdpBbuCmd -GetBbuStatus -aALL |grep Charger Status 【查看充电状态】

#/opt/MegaCli -AdpBbuCmd -GetBbuStatus -aALL【显示BBU状态信息】

#/opt/MegaCli -AdpBbuCmd -GetBbuCapacityInfo -aALL【显示BBU容量信息】

#/opt/MegaCli -AdpBbuCmd -GetBbuDesignInfo -aALL    【显示BBU设计参数】

#/opt/MegaCli -AdpBbuCmd -GetBbuProperties -aALL    【显示当前BBU属性】

#/opt/MegaCli -cfgdsply -aALL    【显示Raid卡型号,Raid设置,Disk相关信息】

3.磁带状态的变化,从拔盘,到插盘的过程中。

Device        |Normal|Damage|Rebuild|Normal

Virtual Drive    |Optimal|Degraded|Degraded|Optimal

Physical Drive    |Online|Failed > Unconfigured|Rebuild|Online

4.查看磁盘缓存策略

#/opt/MegaCli -LDGetProp -Cache -L0 -a0

or

#/opt/MegaCli -LDGetProp -Cache -L1 -a0

or

#/opt/MegaCli -LDGetProp -Cache -LALL -a0

ro

#/opt/MegaCli -LDGetProp -Cache -LALL -aALL

ro

#/opt/MegaCli -LDGetProp -DskCache -LALL -aALL

5.设置磁盘缓存策略

缓存策略解释:

WT    (Write through

WB    (Write back)

NORA  (No read ahead)

RA    (Read ahead)

ADRA  (Adaptive read ahead)

Cached

Direct

例子:

#/opt/MegaCli -LDSetProp WT|WB|NORA|RA|ADRA -L0 -a0

or

#/opt/MegaCli -LDSetProp -Cached|-Direct -L0 -a0

or

enable / disable disk cache

#/opt/MegaCli -LDSetProp -EnDskCache|-DisDskCache -L0 -a0

6.创建一个 raid5 阵列,由物理盘 2,3,4 构成,该阵列的热备盘是物理盘 5

#/opt/MegaCli -CfgLdAdd -r5 [1:2,1:3,1:4] WB Direct -Hsp[1:5] -a0

7.创建阵列,不指定热备

#/opt/MegaCli -CfgLdAdd -r5 [1:2,1:3,1:4] WB Direct -a0

8.删除阵列

#/opt/MegaCli -CfgLdDel -L1 -a0

9.在线添加磁盘

#/opt/MegaCli -LDRecon -Start -r5 -Add -PhysDrv[1:4] -L1 -a0

10.阵列创建完后,会有一个初始化同步块的过程,可以看看其进度。

#/opt/MegaCli -LDInit -ShowProg -LALL -aALL

或者以动态可视化文字界面显示

#/opt/MegaCli -LDInit -ProgDsply -LALL -aALL

11.查看阵列后台初始化进度

#/opt/MegaCli -LDBI -ShowProg -LALL -aALL

或者以动态可视化文字界面显示

#/opt/MegaCli -LDBI -ProgDsply -LALL -aALL

12.指定第 5 块盘作为全局热备

#/opt/MegaCli -PDHSP -Set [-EnclAffinity] [-nonRevertible] -PhysDrv[1:5] -a0

13.指定为某个阵列的专用热备

#/opt/MegaCli -PDHSP -Set [-Dedicated [-Array1]] [-EnclAffinity] [-nonRevertible] -PhysDrv[1:5] -a0

14.删除全局热备

#/opt/MegaCli -PDHSP -Rmv -PhysDrv[1:5] -a0

15.将某块物理盘下线/上线
MegaCli64 -PDList -aALL 确认    [Enclosure Device ID : Slot Number] 
                                [1  :   4]


#/opt/MegaCli -PDOffline -PhysDrv [1:4] -a0

#/opt/MegaCli -PDOnline -PhysDrv [1:4] -a0

16.查看物理磁盘重建进度

#/opt/MegaCli -PDRbld -ShowProg -PhysDrv [1:5] -a0

或者以动态可视化文字界面显示

#/opt/MegaCli -PDRbld -ProgDsply -PhysDrv [1:5] -a0

内网云盘

owncloud   https://owncloud.org/

seafile     https://www.seafile.com/home/

lvm

lvm建立pvvg不要格式化
建立:
pvcreate  /dev/xxx
vgcreate  vg0  /dev/xx
lvcreate  -L 512M -n lv0 vg0
mkfs.ext3 /dev/vg1/lv0
mount /dev/vg1/lv0 /data/
vim /etc/fatab
/dev/mapper/vg1-lvdata   /data                  ext3    defaults        1 2

查看
pvdisplay   or  pvscan
vgdisplay   or   vgscan
lvdisplay    or    lvscan

lvm扩容
创建一块新的分区:
fdisk  /dev/hda

n

p        #选择逻辑分区,如果没有,则首先创建扩展分区,然后再添加逻辑分区(硬盘:最多四个分区P-P-P-PP-P-P-E

1        #分区号,/dev/hda6

t      8e   #分区类型8e表示LVM分区

w        #写入分区表

partprobe   #重读分区表

partx /dev/hda #查看当前硬盘的分区表及使用情况


创建PV,扩容VGLV

pvcreate /dev/hda1

vgdisplay #查看当前已经存在的VG信息,以存在VGVolGroup00为例

vgextend VolGroup00 /dev/hda1   #扩展VolGroup00

lvdisplay #查看已经存在的LV信息,以存在LVLogVol01为例

lvextend L 1G /dev/VolGroup00/LogVol01 #扩展LV

              -l +100%FREE    全部剩余空间

ext3 ext4文件系统   
resize2fs /dev/VolGroup00/LogVol01 #执行该重设大小,对于当前正在使用的LogVol01有效

xfs文件系统
xfs_growfs  /dev/centos/root #执行该重设大小,对于当前正在使用的LogVol01有效

df h #查看挂载情况,已经扩容

samba

yum install samba samba-client  samba-common  samba-swat
                   服务端    客户端            通用工具          wab管理
systemctl restart smb

vim /etc/samba/smb.conf
security=share/user
若用户验证使用user添加
passdb backend=tdbsam
username map=/etc/samba/smbusers
vim /etc/samba/smbusers
系统用户=samba用户1[空格]samba用户2
smbpasswd -a 系统用户

/etc/samba/smb.conf  
[homes]  共享名
comment=xxxx  描述
path=/tmp/samba                     chmod o+w /tmp/samba 
public=yes  允许匿名访问
guesk ok=yes
browseable=yes  共享可见默认yes 
writable=yes   共享可写
write list = 可写用户列表系统用户
read only=yes  共享只读
read list=只读用户列表系统用户   多个分开
valid users= 允许用户列表系统用户
invalid users = 禁止用户列表系统用户

   账号认证匿名不能访问
[work]
    comment = All
    path = /data
        #public = no
    browseable = yes
    #guest ok = yes
    writable = yes
    read only = no
        write list = ftp, work
    valid users = ftp, work




客户端
smbclient -L ip 查看共享列表
smbclient //ip/共享名 -U 用户名
mount -t cifs //ip/共享名  /mnt/abc -O username=test,passwd=

windows直接运行\\ip

nfs

一、NFS服务简介

  NFS Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。
功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,
是在类Unix系统间实现磁盘文件共享的一种方法。

  NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统
共同进行文件的分享。

  NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的
一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的
传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方
都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVERCLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPCNFS
关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

二、系统环境

系统平台:CentOS release 5.6 (Final)

NFS Server IP192.168.1.108

防火墙已关闭/iptables: Firewall is not running.

SELINUX=disabled

三、安装NFS服务

NFS的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的。

nfs-utils-* :包括基本的NFS命令与监控程序 
portmap-* :支持安全NFS RPC服务的连接,新的叫rpcbind
查看系统是否已安装NFS



系统默认已安装了nfs-utils portmap 两个软件包。

四、NFS系统守护进程

nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;
mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,
还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
portmap:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务
对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
五、NFS服务器的配置

NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。

NFS的常用目录

/etc/exports                           NFS服务的主要配置文件
/usr/sbin/exportfs                   NFS服务的管理命令
/usr/sbin/showmount              客户端的查看命令
/var/lib/nfs/etab                      记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab                      记录曾经登录过的客户端信息
NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用
vim手动建立,然后在文件里面写入配置内容。

/etc/exports文件内容格式:

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
a. 输出目录:

输出目录是指NFS系统中需要共享给客户机使用的目录;

b. 客户端:

客户端是指网络中可以访问这个NFS输出目录的计算机

客户端常用的指定方式

指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主机:david.bsmart.cn
指定域中的所有主机:*.bsmart.cn
所有主机:*
c. 选项:

选项用来设置输出目录的访问权限、用户映射等。

NFS主要有3类选项:

访问权限选项

设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项

all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项

secure:限制客户端只能从小于1024tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置)
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
六、NFS服务器的启动与停止

在对exports文件进行了正确的配置后,就可以启动NFS服务器了。

1、启动NFS服务器

为了使NFS服务器能正常工作,需要启动portmapnfs两个服务,并且portmap一定要先于nfs启动。

# service portmap start
# service nfs start


2、查询NFS服务器状态

# service portmap status
# service nfs status


3、停止NFS服务器

要停止NFS运行时,需要先停止nfs服务再停止portmap服务,对于系统中有其他服务(NIS)需要使用时,不需要停止portmap服务

# service nfs stop
# service portmap stop
4、设置NFS服务器的自动启动状态

对于实际的应用系统,每次启动LINUX系统后都手工启动nfs服务器是不现实的,需要设置系统在指定的运行级别自动启动portmapnfs服务。

# chkconfig --list portmap
# chkconfig --list nfs


设置portmapnfs服务在系统运行级别35自动启动。

# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on


七、实例

1、将NFS Server /home/david/ 共享给192.168.1.0/24网段,权限读写。

# vi /etc/exports

/home/david 192.168.1.0/24(rw)
2、重启portmap nfs 服务

# service portmap restart
# service nfs restart
# exportfs


3、服务器端使用showmount命令查询NFS的共享状态

# showmount -e    //默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错



# showmount -a    //显示已经与客户端连接上的目录信息



4、客户端使用showmount命令查询NFS的共享状态

# showmount -e NFS服务器IP



5、客户端挂载NFS服务器中的共享目录

命令格式

# mount NFS服务器IP:共享目录 本地挂载点目录
# mount 192.168.1.108:/home/david/ /tmp/david/

# mount |grep nfs



挂载成功。

查看文件是否和服务器端一致。



6NFS的共享权限和访问控制

现在我们在/tmp/david/ 里面建立一个文件,看看权限是什么

# touch 20130103



这里出现Permission denied,是因为NFS 服务器端共享的目录本身的写权限没有开放给其他用户,在服务器端打开该权限。

# chmod 777 -R /home/david/



再次在客户端/tmp/david/ 里面建立一个文件



我用root 用户建立的文件,变成了nfsnobody 用户。

NFS有很多默认的参数,打开/var/lib/nfs/etab 查看分享出来的/home/david/ 完整权限设定值。

# cat /var/lib/nfs/etab



默认就有syncwdelayhide 等等,no_root_squash 是让root保持权限,root_squash 是把root映射成nobodyno_all_squash 不让
所有用户保持在挂载目录中的权限。所以,root建立的文件所有者是nfsnobody

下面我们使用普通用户挂载、写入文件测试。

# su - david

$ cd /tmp/david/

$ touch 2013david



普通用户写入文件时就是自己的名字,这也就保证了服务器的安全性。
  关于权限的分析

  1. 客户端连接时候,对普通用户的检查

    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;

    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;

    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody

  2. 客户端连接的时候,对root的检查

    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root

    b. 如果设置了all_squashanonuidanongid,此时root 身份被压缩为指定用户;

    c. 如果没有明确指定,此时root用户被压缩为nfsnobody

    d. 如果同时指定no_root_squashall_squash 用户将被压缩为 nfsnobody,如果设置了anonuidanongid将被压缩到所指定的
用户与组;

7、卸载已挂载的NFS共享目录

# umount /tmp/david/



八、启动自动挂载nfs文件系统

格式:

<server>:</remote/export> </local/directory> nfs < options> 0 0
# vi /etc/fstab



保存退出,重启系统。

查看/home/david 有没有自动挂载。



自动挂载成功。

九、相关命令

1exportfs

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,
该命令格式如下:

  # exportfs [-aruv]

  -a 全部挂载或卸载 /etc/exports中的内容 
  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports/var/lib/nfs/xtab
  -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
  -v export的时候,将详细的信息输出到屏幕上。

具体例子: 
  # exportfs -au 卸载所有共享目录
  # exportfs -rv 重新共享所有目录并输出详细信息

2nfsstat

查看NFS的运行状态,对于调整NFS的运行有很大帮助。

3rpcinfo

查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。

4showmount

  -a 显示已经于客户端连接上的目录信息
  -e IP或者hostname 显示此IP地址分享出来的目录

5netstat

可以查看出nfs服务开启的端口,其中nfs 开启的是2049portmap 开启的是111,其余则是rpc开启的。

最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo

NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill
 来结束,(-9 强制结束)

iozone

http://www.iozone.org

wget http://www.iozone.org/src/current/iozone3_465.tar
tar -xf iozone3_465.tar
cd iozone3_465/src/current/
make linux

 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存。
 会使数值非常不真实。

测试命令是 
./iozone -s 5g -i0 -i1 -i2 -Rb ioperf.xls -I    数据更真实, -I  direct io 不过读写速度结果更低
./iozone -Rab  ioperf.xls  -s 64G -i 0 -i 1 -i 2 -y 4k -q 16k  测试更大的文件更接近

常用参数解释:
-a  auto mode产生文件大小16K-512M,记录大小4K-16M的输出结果;
-e  计算时间时算上fflushfsync的时间;
-f  指定临时测试文件 可以测试不同分区会磁盘;
-R 产生excel格式的输出(仅显示在屏幕上,不会产生excel文件)
-b 产生excel格式的文件
-s  指定测试文件大小  支持-k -m -g-r  指定测试记录大小;
-g -n 指定auto模式下,最大/小测试文件大小;
-q -y 指定auto模式下,最大/小测试记录大小;
-i  指定特定的测试操作:
     (0=write/rewrite, 1=read/re-read, 2=random-read/write
3=Read-backwards, 4=Re-write-record, 5=stride-read, 6=fwrite/re-fwrite, 7=fread/Re-fread,
8=random mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread, 11=pwritev/Re-pwritev, 12=preadv/Repreadv-I  指定direct io操作;
-p  清除cpu cache影响;
-t  并发数
-O  输出IOPS值;
-R  生成excel报告文件;
-W  读写之前锁定文件;

测试生成的ioperf1.xls是操作系统中readwrite速率,以下表为例,该表是是关于write的测试结果,左侧一列是测试文件大小(Kbytes),
最上边一行是记录大小,中间数据是测试的传输速度。举例说明,比如表中的“19918”,意思是测试文件大小为64K,以记录大小为4K来进行传输,
它的传输速度为19918Kbytes/s-i的取值说明如下:

0=write/rewrite
1=read/re-read
2=random-read/write
3=Read-backwards
4=Re-write-record
5=stride-read
6=fwrite/re-fwrite
7=fread/Re-fread
8=random mix
9=pwrite/Re-pwrite
10=pread/Re-pread
11=pwritev/Re-pwritev
12=preadv/Re-preadv


Write:测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的
具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。
拜这些额外信息所赐,Write的性能通常会比Re-write的性能低。

Re-write:测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常
比Write的性能高。
Read: 测试读一个已存在的文件的性能。
Re-Read:测试读一个最近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。
Random Read:测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟
和其他。
Random Write:测试写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,
寻道延迟和其他。
Random Mix:测试读写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,
寻道延迟和其他。这个测试只有在吞吐量测试模式下才能进行。每个线程/进程运行读或写测试。这种分布式读/写测试是基于roundrobin 模式的。
最好使用多于一个线程/进程执行此测试。
Backwards Read:测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑,事实上,有些应用确实这么干。MSCNastran是一个使用
倒序读文件的应用程序的一个例子。它所读的文件都十分大(大小从G级别到T级别)。尽管许多操作系统使用一些特殊实现来优化顺序读文件的速度,
很少有操作系统注意到并增强倒序读文件的性能。
Record Rewrite:测试写与覆盖写一个文件中的特定块的性能。这个块可能会发生一些很有趣的事。如果这个块足够小(比CPU数据缓存小),
测出来的性能将会非常高。如果比CPU数据缓存大而比TLB小,测出来的是另一个阶段的性能。如果比此二者都大,但比操作系统缓存小,得到的性能
又是一个阶段。若大到超过操作系统缓存,又是另一番结果。
Strided Read:测试跳跃读一个文件的性能。举例如下:在0偏移量处读4Kbytes,然后间隔200Kbytes,读4Kbytes,再间隔200Kbytes,如此反复。
此时的模式是读4Kbytes,间隔200Kbytes并重复这个模式。这又是一个典型的应用行为,文件中使用了数据结构并且访问这个数据结构的特定区域的
应用程序常常这样做。
许多操作系统并没注意到这种行为或者针对这种类型的访问做一些优化。同样,这种访问行为也可能导致一些有趣的性能异常。一个例子是在一个
数据片化的文件系统里,应用程序的跳跃导致某一个特定的磁盘成为性能瓶颈。
Fwrite:测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写
很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
这个测试是写一个新文件,所以元数据的写入也是要的。
Frewrite:测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写
很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
这个测试是写入一个已存在的文件,由于无元数据操作,测试的性能会高些。
Fread:测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的
传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
Freread: 这个测试与上面的fread 类似

fio测试磁盘


不要对有数据的磁盘或者分区做测试会破坏已存在的数据
慎用!!!

FIO安装
wget http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz
yum install libaio-devel
tar -zxvf fio-2.2.5.tar.gz
cd fio-2.2.5
make
make install
FIO用法
随机读(可直接用向磁盘写一个2G文件10线程随机读1分钟给出结果)

fio -filename=/tmp/test_randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G
-numjobs=10 -runtime=60 -group_reporting -name=mytest
说明
filename=/dev/sdb1 测试文件名称通常选择需要测试的盘的data目录
direct=1 测试过程绕过机器自带的buffer使测试结果更真实
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机写和读的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上提定数据块的大小范围
size=5g 本次的测试文件大小为5g以每次4k的io进行测试
numjobs=30 本次的测试线程为30.
runtime=1000 测试时间为1000秒如果不写则一直将5g文件分4k每次写完为止
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合读写的模式下写占30%
group_reporting 关于显示结果的汇总每个进程的信息

此外
lockmem=1g 只使用1g内存进行测试
zero_buffers 用0初始化系统buffer
nrfiles=8 每个进程生成文件的数量

read 顺序读
write 顺序写
rw,readwrite 顺序混合读写

randwrite 随机写
randread 随机读
randrw 随机混合读写

io总的输入输出量
bw带宽 KB/s
iops每秒钟的IO数
runt总运行时间
lat (msec)延迟(毫秒)
msec 毫秒

usec 微秒

顺序读

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=2G -numjobs=10
-runtime=60 -group_reporting -name=mytest
随机写

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=2G -numjobs=10
-runtime=60 -group_reporting -name=mytest
顺序写

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=2G -numjobs=10
-runtime=60 -group_reporting -name=mytest
混合随机读写

fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G
-numjobs=10 -runtime=60 -group_reporting -name=mytest -ioscheduler=noop
实际测试范例

[root@localhost ~]# fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync 
-bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest1
mytest1: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1

mytest1: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1
fio 2.0.7
Starting 30 threads
Jobs: 1 (f=1): [________________m_____________] [3.5% done] [6935K/3116K /s] [423 /190 iops] [eta 48m:20s] s]
mytest1: (groupid=0, jobs=30): err= 0: pid=23802
read : io=1853.4MB, bw=18967KB/s, iops=1185 , runt=100058msec
clat (usec): min=60 , max=871116 , avg=25227.91, stdev=31653.46
lat (usec): min=60 , max=871117 , avg=25228.08, stdev=31653.46
clat percentiles (msec):
| 1.00th=[ 3], 5.00th=[ 5], 10.00th=[ 6], 20.00th=[ 8],
| 30.00th=[ 10], 40.00th=[ 12], 50.00th=[ 15], 60.00th=[ 19],
| 70.00th=[ 26], 80.00th=[ 37], 90.00th=[ 57], 95.00th=[ 79],
| 99.00th=[ 151], 99.50th=[ 202], 99.90th=[ 338], 99.95th=[ 383],
| 99.99th=[ 523]
bw (KB/s) : min= 26, max= 1944, per=3.36%, avg=636.84, stdev=189.15
write: io=803600KB, bw=8031.4KB/s, iops=501 , runt=100058msec
clat (usec): min=52 , max=9302 , avg=146.25, stdev=299.17
lat (usec): min=52 , max=9303 , avg=147.19, stdev=299.17
clat percentiles (usec):
| 1.00th=[ 62], 5.00th=[ 65], 10.00th=[ 68], 20.00th=[ 74],
| 30.00th=[ 84], 40.00th=[ 87], 50.00th=[ 89], 60.00th=[ 90],
| 70.00th=[ 92], 80.00th=[ 97], 90.00th=[ 120], 95.00th=[ 370],
| 99.00th=[ 1688], 99.50th=[ 2128], 99.90th=[ 3088], 99.95th=[ 3696],
| 99.99th=[ 5216]
bw (KB/s) : min= 20, max= 1117, per=3.37%, avg=270.27, stdev=133.27
lat (usec) : 100=24.32%, 250=3.83%, 500=0.33%, 750=0.28%, 1000=0.27%
lat (msec) : 2=0.64%, 4=3.08%, 10=20.67%, 20=19.90%, 50=17.91%
lat (msec) : 100=6.87%, 250=1.70%, 500=0.19%, 750=0.01%, 1000=0.01%
cpu : usr=1.70%, sys=2.41%, ctx=5237835, majf=0, minf=6344162
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=118612/w=50225/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
READ: io=1853.4MB, aggrb=18966KB/s, minb=18966KB/s, maxb=18966KB/s, mint=100058msec, maxt=100058msec
WRITE: io=803600KB, aggrb=8031KB/s, minb=8031KB/s, maxb=8031KB/s, mint=100058msec, maxt=100058msec
Disk stats (read/write):
sdb: ios=118610/50224, merge=0/0, ticks=2991317/6860, in_queue=2998169, util=99.77%
主要查看以上红色字体部分的iop

vsftp

目录权限不能为777否则无法登录配置文件每行末尾不要又空格

默认兼容主动和被动模式添加配置限制被动模式端口   FlashFXP可以看到被动模式端口
#connect_from_port_20=YES 注释这行
pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=3000
pasv_max_port=3500


从2.3.5之后vsftpd增强了安全检查如果用户被限定在了其主目录下则该用户的主目录不能再具有写权限了 allow_writeable_chroot=YES 可以取消这个限制
通过如下命令行可以解决  chmod a-w /home/user
chroot_local_user=YES   限定在主目录
chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list    这些用户作为例外”,不受限制


yum install vsftpd curlftpfs
ftp的配置文件主要有三个位于/etc/vsftpd/目录下分别是
ftpusers    该文件用来指定那些用户不能访问ftp服务器
user_list   该文件用来指示的默认账户在默认情况下也不能访问ftp.
vsftpd.conf   vsftpd的主配置文件.
ftpusers和user_list用来控制登录用户
ftpusers文件中的内容不受任何配制项的影响总是有效是一个黑名单

更新虚拟用户数据
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vu_list.db 
/etc/init.d/vsftpd restart


vsftpd.conf中常用的配置内容
    1匿名用户能否上传和写文件一般配置为NO
    anon_upload_enable=NO
    anon_mkdir_write_enable=NO
    匿名用户能否登录视情况而定看是否是专有用户使用
    anonymous_enable=NO
    2端口设定
    port_enable=YES即默认情况下FTP  PORT主动模式被启用
    connect_from_port_20=YES即默认情况下FTP PORT主动模式进行数据传输时使用20端口(ftp-data)YES使用NO不使用
    ftp_data_port=port number设定ftp数据传输端口(ftp-data)默认值为20此参数用于PORT FTP模式
    3通信编码模式
    默认情况下可以通过ascii模式传输将配置改为NO后只能通过binary形式传输
    ascii_upload_enable=YES
    ascii_download_enable=YES



匿名
默认匿名共享目录 /var/ftp
指定匿名共享目录 anon_root=/data/3mang_apps目录权限不能为777否则无法登录

vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES    允许匿名用户
local_enable=YES                允许本地用户登陆
anon_world_readable_only=YES  匿名只读

anon_other_write_enable=YES  匿名可写
anon_upload_enable=YES            匿名可上传
anon_mkdir_write_enable=YES    匿名可以创建目录
local_max_rate=1000000--------------1M    限制上传下载的速度

日志相关
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog  
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log

挂载
curlftpfs ftp://$IP /mnt/

用户
将配置文件中anonymous_enable=YES 改为 anonymous_enable=NO
添加chroot_list_enable=YES
        chroot_list_file=/etc/vsftpd/chroot_list
useradd ftpadmin -s /sbin/nologin -d /home/ftpadmin        用户目录权限755777会无法使用(如果是两级目录上级需要777)
passwd ftpadmin 修改密码
/etc/vsftpd/chroot_list 添加ftpadmin   用户的登录控制还可以参照上文中user_list进行设定


虚拟目录
比如我的ftp的默认目录是/var/ftp我想把/mnt/soft文件夹映射到/var/ftp/a目录中我就如下操作
我们要先在/var/ftp目录中建一个目录
[root@localhost ~]# mkdir /var/ftp/a                               然后执行mount命令
[root@localhost ~]# mount --bind /mnt/soft /var/ftp/a    这样就OK了。
[root@localhost etc]# vi /etc/fstab
 /mnt/soft   /home/public  auto bind 0 0                         添加到/etc/fstab文件的末尾


虚拟用户
vim /etc/vsftpd/vftpuser.txt
user
passwd
user2
passwd2

db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vu_list.db
chmod 600 /etc/vsftpd/vu_list.db

vi /etc/pam.d/vsftp.vu  新建一个虚拟用户的PAM文件   
auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
# pam_userdb.so 需要find / -name pam_userdb.so确认下不同系统位置可能不同

useradd -d /home/ftpsite virtual_user 建立虚拟用户
chmod 700 /home/ftpsite

编辑/etc/vsftpd/vsftpd.conf文件使其整个文件内容如下所示去掉了注释内容):
anonymous_enable=NO
local_enable=YES
local_umask=022
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022
one_process_model=NO
chroot_local_user=YES
allow_writeable_chroot=YES
ftpd_banner=Welcom to my FTP server.
anon_world_readable_only=NO
guest_enable=YES
guest_username=virtual_user
pam_service_name=vsftp.vu

上面代码中guest_enable=YES表示启用虚拟用户
           guest_username=virtual_user则是将虚拟用户映射为本地用户这样虚拟用户登录后权限和virtual_user一样
           pam_service_name=vsftp.vu 指定PAM的配置文件为 vsftp.vu


在虚拟FTP服务器中也可以对各个用户的权限进行设置方法是在/etc/vsftpd.conf文件中添加如下一行
user_config_dir=/etc/vsftpd/vsftpd_user_conf  用户配置文件目录

然后在用户配置文件目录下创建相应的用户配置文件比如为上述名为gou的用户创建一个配置文件
#vi /etc/vsftpd/vsftpd_user_conf/gou
write_enable=YES
local_root=家目录   将权限设为virtual_user

9.添加FTP用户的步骤
      1.在vftpuser.txt中添加用户名和密码
      2.运行如下命令,将用户名和密码添加到数据库中
        db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vu_list.db
      3 在etc/vsftpd/vsftpd_user_conf文件夹下新建和用户名相同的文件,并在其中加入
       local_root=家目录
      4 重启ftp   systemctl restart vsftpd



FTP 的主动与被动模式
    FTP是基于TCP的服务在实际应用中有两个接口一个数据接口一个控制接口默认情况下这两个端口是21控制端口和20数据端口)。
    主动方式的FTP是客户端从一个任意的非特权端口NN>1024连接到FTP服务器的命令端口也就是21端口然后客户端开始监听端口N+1
    并发送FTP命令port N+1到FTP服务器接着服务器会从它自己的数据端口20连接到客户端指定的数据端口N+1)。
    被动方式或者叫做PASV当客户端通知服务器它处于被动模式时才启用在被动方式FTP中命令连接和数据连接都由客户端发起.
    当开启一个 FTP连接时客户端打开两个任意的非特权本地端口N>1024和N+1)。第一个端口连接服务器的21端口但与主动方式的FTP不同
    客户端不会提交PORT命令并允许服务器来回连它的数据端口而是提交 PASV命令这样做的结果是服务器会开启一个任意的非特权端口
    P > 1024),并发送PORT P命令给客户端然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据 
    简单的来说可以认为两者的区别主要在于客户端和服务器端到底是由谁来确定非特权端口也就是这一对TCP通信组合的通道
    如果是客户端先确定非特权端口就是主动模式服务器端先确定非特权端口就是被动模式。(但实质上通信过程是不一样的
    这种说法只可以做简单区分用
FTP相关的防火墙设定
    当Linux系统启动了防火墙后需要相应的对防火墙进行设定防止防火墙阻断FTP通信
 支持主动方式FTP防火墙设定    
1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接 
2. FTP服务器的21端口到大于1024的端口 服务器响应客户端的控制端口
3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口
 4. 大于1024端口到FTP服务器的20端口客户端发送ACK响应到服务器的数据端口
支持被动方式的FTP防火墙设定:  
1. 从任何大于1024的端口到服务器的21端口客户端初始化的连接 
2. 服务器的21端口到任何大于1024的端口服务器响应到客户端的控制端口的连接
3. 从任何大于1024端口到服务器的大于1024端口客户端初始化数据连接到服务器指定的任意端口
4. 服务器的大于1024端口到远程的大于1024的端口服务器发送ACK响应和数据到客户端的数据端口
下面以被动模式的防火墙为例给出示范
    首先vi  /etc/vsftpd/vsftpd.conf文件中配置开启pasv被动模式
    pasv_enable=YES
    设定非特权端口的通信范围示例只做参考):
    最小值pasv_min_port=10020
    最大值pasv_max_port=11020
    保存后注意配置后重启vsftpd服务
    然后vi  /etc/sysconfig/iptables配置系统防火墙
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A INPUT -p icmp -j ACCEPT
    -A INPUT -i lo -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 10020:11020 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
    保存后注意重启iptables服务

    如果FTP服务器为云服务器或者有局域网路由控制除了单独设定路由端口映射规则并在云服务器安全规则中添加例外还要在
    /etc/vsftpd/vsftpd.conf中声明被动模式的公网地址以防端口映射出现问题
    pasv_address=111.111.111.111示例
    pasv_addr_resolve=yes
    pasv_promiscuous=yes

如果连接过程中出现200 PORT command successful. Consider using PASV.这条错误信息不要轻易按照网上建议最多的
关闭PASV模式只采用主动模式因为在很多情况下客户端处于VLAN等网络环境下很难主动给出链接端口不得不采用被动模式
出现这个错误并不能通过关闭PASV模式解决而应该寻找PASV各方面的位置找到配置中存在的问题进行解决

vsftpd-mysql结合

一、安装所需要程序

1、事先安装好开发环境和mysql数据库;

# yum -y install mysql-server mysql-devel
# yum -y groupinstall "Development Tools" "Development Libraries"

2.安装pam_mysql-0.7RC1

# tar zxvf  pam_mysql-0.7RC1.tar.gz
# cd  pam_mysql-0.7RC1
# ./configure --with-mysql=/usr --with-openssl
# make
# make install

3.安装vsftpd

# yum -y install vsftpd


二、创建虚拟用户账号

1.准备数据库及相关表

首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。

mysql> create database vsftpd;

mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'www.magedu.com';
mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'www.magedu.com';
mysql> flush privileges;

mysql> use vsftpd;
mysql> create table users (
    -> id int AUTO_INCREMENT NOT NULL,
    -> name char(20) binary NOT NULL,
    -> password char(48) binary NOT NULL,
    -> primary key(id)
    -> );

2、添加测试的虚拟用户

根据需要添加所需要的用户,需要说明的是,这里将其密码采用明文格式存储,原因是pam_mysqlpassword()函数与MySQLpassword()函数
可能会有所不同。

mysql> insert into users(name,password) values('tom','magedu');
mysql> insert into users(name,password) values('jerry','magedu');


三、配置vsftpd

1.建立pam认证所需文件

#vi /etc/pam.d/vsftpd.mysql
添加如下两行
auth required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users 
接上行 usercolumn=name passwdcolumn=password crypt=0
account required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost db=vsftpd table=users 
接上行 usercolumn=name passwdcolumn=password crypt=0

2.修改vsftpd的配置文件,使其适应mysql认证

建立虚拟用户映射的系统用户及对应的目录
#useradd -s /sbin/nologin -d /var/ftproot vuser
#chmod go+rx /var/ftproot

请确保/etc/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES

而后添加以下选项
guest_enable=YES
guest_username=vuser

并确保pam_service_name选项的值如下所示
pam_service_name=vsftpd.mysql


四、启动vsftpd服务

# service vsftpd start
# chkconfig vsftpd on

查看端口开启情况

# netstat -tnlp |grep :21
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      23286/vsftpd 

使用虚拟用户登录,验正配置结果,以下为本机的命令方式测试,你也可以在其它Win Box上用IE或者FTP客户端工具登录验正
# ftp localhost



五、配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。
配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。

1、配置vsftpd为虚拟用户使用配置文件目录

# vim vsftpd.conf
添加如下选项
user_config_dir=/etc/vsftpd/vusers_dir 

2、创建所需要目录,并为虚拟用户提供配置文件

# mkdir /etc/vsftpd/vusers_dir/
# cd /etc/vsftpd/vusers_dir/
# touch tom jerry

3、配置虚拟用户的访问权限

虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改
/etc/vsftpd/vusers/tom文件,在里面添加如下选项即可。
anon_upload_enable=YES

实时同步lsyncd

1.1 inotify + rsync
最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的文件列表就达20M
在网络状况不佳或者限速的情况下,变更的文件可能10来个才几M,却因此要发送的文件列表就达20M,严重减低的带宽的使用效率以及同步效率;
更为要紧的是,加入inotifywait5s内监控到10个小文件发生变化,便会触发10rsync同步操作,结果就是真正需要传输的才2-3M的文件,
比对的文件列表就达200M。使用这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,比如排除同步的目录,
同步多个模块或同步到多个主机。

搭建过程参考 Linux下同步工具inotify+rsync使用详解 或这里。

1.2 sersync
后来听同事说 sersync 这么个工具可以提高同步的性能,也解决了同步大文件时出现异常的问题,所以就尝试了一下。sersync是国内的一个
开发者开源出来的,使用c++编写,采用多线程的方式进行同步,失败后还有重传机制,对临时文件过滤,自带crontab定时同步功能。网上看到
有人说性能还不错,说一下我的观点:

国产开源,文档不是很全,在2011年之后就没更新了(googlecode都要快关闭了,其实可以转交其他人维护),网上关于它的使用和讨论都止于
10年了采用xml配置文件的方式,可读性比较好,但是有些原生的有些功能没有实现就没法使用了
无法实现多目录同步,只能通过多个配置文件启动多个进程
文件排除功能太弱。这个要看需求,不是每个人都需要排除子目录。而对于我的环境中,这个功能很重要,而且排除的规则较多
虽然提供插件的功能,但很鸡肋,因为软件本身没有持续更新,也没有看到贡献有其它插件出现(可能是我知识面不够,
还用不到里面的refreshCDN plugin)。
虽然不懂c++,但大致看了下源码 FileSynchronize,拼接rsync命令大概在273行左右,最后一个函数就是排除选项,
简单一点可以将--exclude=改成--eclude-from来灵活控制。有机会再改吧。

另外,在作者的文章 Sersync服务器同步程序 项目简介与设计框架 评论中,说能解决上面 rsync + inotify中所描述的问题。
阅读了下源码,这个应该是没有解决,因为在拼接rsync命令时,后面的目的地址始终是针对module的,只要执行rsync命令,
就会对整个目录进行遍历,发送要比对的文件列表,然后再发送变化的文件。sersync只是减少了监听的事件,减少了rsync
的次数——这已经是很大的改进,但每次rsync没办法改变。(如有其它看法可与我讨论)

其实我们也不能要求每一个软件功能都十分健全,关键是看能否满足我们当下的特定的需求。所谓好的架构不是设计出来的,而是进化来的。
目前使用sersync2没什么问题,而且看了它的设计思路应该是比较科学的,特别是过滤队列的设计。双向同步看起来也是可以实现。

1.3 lsyncd
废话说这么多,本文就是介绍它了。有些博客说lsyncd是谷歌开源的,实际不是了,只是托管在了googlecode上而已,
幸运的是已经迁移到github了:https://github.com/axkibe/lsyncd 。

Lysncd 实际上是lua语言封装了 inotify  rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,
然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的
文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,
可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh

实现简单高效的本地目录同步备份(网络存储挂载也当作本地目录),一个命令搞定。

2. 使用 lsyncd 本地目录实时备份
这一节实现的功能是,本地目录source实时同步到另一个目录target,而在source下有大量的文件,并且有部分目录和临时文件不需要同步。

2.1 安装lsyncd
安装lsyncd极为简单,已经收录在ubuntu的官方镜像源里,直接通过apt-get install lsyncd就可以。
Redhat系(我的环境是CentOS 6.2 x86_64 ),可以手动去下载 lsyncd-2.1.5-6.fc21.x86_64.rpm,但首先你得安装两个依赖
yum install lua lua-devel。也可以通过在线安装,需要epel-release扩展包:

# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm# yum install lsyncd
源码编译安装
从源码编译安装可以使用最新版的lsyncd程序,但必须要相应的依赖库文件和编译工具:yum install lua lua-devel asciidoc cmake

 googlecode lsyncd 上下载的lsyncd-2.1.5.tar.gz,直接./configuremake && make install就可以了。

github上下载lsyncd-master.zip 2.1.5版本使用的是 cmake 编译工具,无法./configure

# uzip lsyncd-master.zip# cd lsyncd-master# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd-2.1.5# make && make install
我这个版本编译时有个小bug,如果按照INSTALLbuild目录中make,会提示:

[100%] Generating doc/lsyncd.1Updating the manpage
a2x: failed: source file not found: doc/lsyncd.1.txt
make[2]: *** [doc/lsyncd.1] Error 1make[1]: *** [CMakeFiles/manpage.dir/all] Error 2make: *** [all] Error 2
解决办法是要么直接在解压目录下cmake,不要mkdir build,要么在CMakeList.txt中搜索doc字符串,在前面加上${PROJECT_SOURCE_DIR}

2.2 lsyncd.conf
下面都是在编译安装的情况下操作。

echo 8192000 > /proc/sys/fs/inotify/max_user_watches  执行并写入rc.local

2.2.1 lsyncd同步配置
# cd /usr/local/lsyncd-2.1.5# mkdir etc var# vi etc/lsyncd.confsettings {
    logfile      ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",
    statusFile   ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",
    inotifyMode  = "CloseWrite",
    maxProcesses = 7,
    -- nodaemon =true,
    }

sync {    default.rsync,
    source    = "/tmp/src",
    target    = "/tmp/dest",
    -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary    = "/usr/bin/rsync",
        archive   = true,
        compress  = true,
        verbose   = true
        }
    }
到这启动 lsycnd 就可以完成实时同步了,默认的许多参数可以满足绝大部分需求,非常简单。

2.2.2 lsyncd.conf配置选项说明
settings
里面是全局设置,--开头表示注释,下面是几个常用选项说明:

logfile 定义日志文件
stausFile 定义状态文件
nodaemon=true 表示不启用守护模式,默认
statusInterval lsyncd的状态写入上面的statusFile的间隔,默认10
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是ModifyCloseWrite or Modify
maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8rysnc进程
maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
sync
里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:rsync
rsyncsshdirect三种模式:

default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
default.direct :本地目录间同步,使用cprm等命令完成差异文件备份;
default.rsyncssh :同步到远程主机目录,rsyncssh模式,需要使用key来认证
source 同步的源目录,使用绝对路径。
target 定义目的地址.对应不同的模式有几种写法:
/tmp/dest :本地目录同步,可用于directrsync模式
172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsyncrsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete 
--include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步
172.29.88.223::module :同步到远程服务器目录,用于rsync模式
三种模式的示例会在后面给出。
init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true
delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次
rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件)
excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST
这里的排除规则写法与原生rsync有点不同,更为简单:
监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo
如果规则以斜线/开头,则从头开始要匹配全部
如果规则以/结尾,则要匹配监控路径的末尾
?匹配任何字符,但不包括/
*匹配0或多个字符,但不包括/
**匹配0或多个字符,可以是/
delete 为了保持targetsouce完全同步,双向同步时改为falseLsyncd默认会delete = true来允许同步删除。它除了false,还有startup
running值,请参考 Lsyncd 2.1.x  Layer 4 Config  Default Behavior
rsync
(提示一下,deleteexclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)

bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
perms 默认保留文件权限。
其它rsync的选项
其它还有rsyncssh模式独有的配置项,如hosttargetdirrsync_pathpassword_file,见后文示例。rsyncOps={"-avz","--delete"}
这样的写法在2.1.*版本已经不支持。

lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。

2.3 启动lsyncd
使用命令加载配置文件,启动守护进程,自动同步目录操作。

lsyncd -log Exec /usr/local/lsyncd-2.1.5/etc/lsyncd.conf
2.4 lsyncd.conf其它模式示例
以下配置本人都已经过验证可行,必须根据实际需要裁剪配置:

settings {
    logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",
    statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",
    inotifyMode = "CloseWrite",
    maxProcesses = 8,
    }


-- I. 本地目录同步,directcp/rm/mv 适用:500+万文件,变动不大
sync {    default.direct,
    source    = "/tmp/src",
    target    = "/tmp/dest",
    delay = 1
    maxProcesses = 1
    }

-- II. 本地目录同步,rsync模式:rsync
sync {    default.rsync,
    source    = "/tmp/src",
    target    = "/tmp/dest1",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        bwlimit   = 2000
        } 
    }

-- III. 远程目录同步,rsync模式 + rsyncd daemon
sync {    default.rsync,
    source    = "/tmp/src",
    target    = "syncuser@172.29.88.223::module1",    delete="running",
    exclude = { ".*", ".tmp" },
    delay = 30,
    init = false,
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        password_file = "/etc/rsyncd.d/rsync.pwd",
        _extra    = {"--bwlimit=200"}
        }
    }

-- IV. 远程目录同步,rsync模式 + ssh shell
sync {    default.rsync,
    source    = "/tmp/src",
    target    = "172.29.88.223:/tmp/dest",
    -- target    = "root@172.29.88.223:/remote/dest",
    -- 上面target,注意如果是普通用户,必须拥有写权限
    maxDelays = 5,
    delay = 30,
    -- init = true,
    rsync     = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        bwlimit   = 2000
        -- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
        -- 如果要指定其它端口,请用上面的rsh
        }
    }

-- V. 远程目录同步,rsync模式 + rsyncssh,效果与上面相同
sync {    default.rsyncssh,
    source    = "/tmp/src2",
    host      = "172.29.88.223",
    targetdir = "/remote/dir",
    excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
    -- maxDelays = 5,
    delay = 0,
    -- init = false,
    rsync    = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose   = true,
        _extra = {"--bwlimit=2000"},
        },
    ssh      = {
        port  =  1234
        }
    }
上面的内容几乎涵盖了所有同步的模式,其中第III个要求像rsync一样配置rsyncd服务端,见本文开头。第IVV配置ssh方式同步,达到的效果
相同,但实际同步时你会发现每次同步都会提示输入ssh的密码,可以通过以下方法解决:

在远端被同步的服务器上开启ssh无密码登录,请注意用户身份:

user$ ssh-keygen -t rsa
一路回车...
user$ cd ~/.ssh
user$ cat id_rsa.pub >> authorized_keys
id_rsa私钥拷贝到执行lsyncd的机器上

user$ chmod 600 ~/.ssh/id_rsa
测试能否无密码登录
user$ ssh user@172.29.88.223
3. lsyncd的其它功能
lsyncd的功能不仅仅是同步,官方手册 Lsyncd 2.1.x  Layer 2 Config  Advanced onAction 高级功能提到,还可以监控某个目录下的
文件,根据触发的事件自己定义要执行的命令,example是监控某个某个目录,只要是有jpggifpng格式的文件参数,就把它们转成pdf
然后同步到另一个目录。正好在我运维的一个项目中有这个需求,现在都是在java代码里转换,还容易出现异常,通过lsyncd可以代替这样的
功能。但,门槛在于要会一点点lua语言(根据官方example还是可以写出来)。

另外偶然想到个问题,同时设置了maxDelaysdelay,当监控目录一直没有文件变化了,也会发生同步操作,虽然没有可rsync的文件。

TO-DO

其它同步工具:csync2clsyncbtsyncdrdb 
lsyncd双向同步:GlusterFS

inotify_sync

web文件越来越多(百万级数量html,jpg等小 文件),同步就越来越慢,根本做不到实时,按照网上的调优方法都尝试过,问题根本没有解决。
经过我一翻细致研究,终于把慢的核心问题研究明白,先总结一句 inotifywait响应不会有延迟,rsync也很快。大家同样有慢的烦恼,
那是因为网上的inotify+rsync的教程都是坑。下面我们来分 析。
inotifywait 单独分析

1
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /data/
执行上面命令,是让inotifywait监听/data/目录,当监听到有发生modify,create,delete,attrib等事件发生时,按%Xe %w%f的格式输出。
/data/目录touch几个文件

1
touch /data/{1..5}
观看inotify输出


ATTRIB /data/1           -- 表示发生了ATTRIB事件 路径为/data/1
ATTRIB /data/2
ATTRIB /data/3
ATTRIB /data/4
ATTRIB /data/5
知道上面的输出效果之后 我们应该想得到,可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步,而不是每次都由rsync
做全目录扫描来判断文件是否存在差异。
网上的inotify+rsync分析
我们来看网上的教程,我加了注释。(网上所有的教程基本都一模一样,尽管写法不一样,致命点都是一样的)


#!/bin/bash 
/usr/bin/inotifywait -mrq --format '%w%f'-e create,close_write,delete /backup |while read file
#把发生更改的文件列表都接收到file 然后循环,但有什么鬼用呢?下面的命令都没有引用这个$file 下面做的是全量rsync
do 
    cd /backup && rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password 
done
#注意看 这里的rsync 每次都是全量的同步(这就坑爹了),而且 file列表是循环形式触发rsync ,等于有10个文件发生更改,就触发10次
rsync全量同步(简直就是噩梦),那还不如直接写个死循环的rsync全量同步得了。
#有很多人会说 日志输出那里明明只有差异文件的同步记录。其实这是rsync的功能,他本来就只会输出有差异需要同步的文件信息。
不信你直接拿这句rsync来跑试试。
#这种在需要同步的源目录文件量很大的情况下,简直是不堪重负。不仅耗CPU还耗时,根本不可以做到实时同步。
改良方法
要做到实时,就必须要减少rsync对目录的递归扫描判断,尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性,
所以这里要分开判断来实现一个目录的增删改查对应的操作。
脚本如下


#!/bin/bash
src=/data/                          # 需要同步的源路径
des=data                             # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,
网上搜一下,比较简单。
rsync_passwd_file=/etc/rsyncd.passwd            # rsync验证的密码文件
ip1=192.168.0.18                     # 目标服务器1
ip2=192.168.0.19                     # 目标服务器2
user=root                            # rsync --daemon定义的验证用户名
cd ${src}                            # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 
才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib ./ | while read file         
# 把监控到有发生更改的"文件路径列表"循环
do

INO_EVENT=$(echo $file | awk '{print $1}') # inotify输出切割 把事件类型赋值给INO_EVENT

INO_FILE=$(echo $file | awk '{print $2}') # inotify输出切割 把文件路径赋值给INO_FILE

echo '------------------------------------'

echo $file

#增加、修改事件

#增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] # 判断事件类型
then
echo 'CREATE or MODIFY'
rsync -avzR --password-file=/etc/rsync- client.pass ${INO_FILE} ${user}@${ip1}::${des} &&# INO_FILE 变量代表路径哦
rsync -avzR --password-file=/etc/rsync-client.pass ${INO_FILE} ${user}@${ip2}::${des}
#仔细看 上面的rsync同步命令 源是用了${INO_FILE}变量 即每次只针对性的同步发生改变的文件 然后用-R参数把源的目录结构递归到目标
后面 保证目录结构一致性

fi

#删除事件

if [[ $INO_EVENT =~ 'DELETE' ]]

then

echo 'DELETE'

rsync -avzR --delete --password-file=/etc/rsync-client.pass $(dirname ${INO_FILE}) ${user}@${ip1}::${des} &&

rsync -avzR --delete --password-file=/etc/rsync-client.pass $(dirname ${INO_FILE}) ${user}@${ip2}::${des}

#看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,
并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠 近根,则同步的目录月多,同步删除的
操作就越花时间。这里有更好方法的同学,欢迎交流。

fi

#修改属性事件 指 touch chgrp chmod chown等操作

if [[ $INO_EVENT =~ 'ATTRIB' ]]

then

echo 'ATTRIB'

if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync
顺带更新此目录。

then

rsync -avzR --password-file=/etc/rsync-client.pass ${INO_FILE} ${user}@${ip1}::${des} &&

rsync -avzR --password-file=/etc/rsync-client.pass ${INO_FILE} ${user}@${ip2}::${des}

fi

fi
done
每两小时做1次全量同步
因为inotify只在启动时会监控目录,他没有启动期间的文件发生更改,他是不知道的,所以这里每2个小时做1次全量同步,防止各种意外遗漏
,保证目录一致。

1
2
crontab -e
* */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data && rsync -avz 
--password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data
改良后我们公司这种百万级小文件也能做到实施同步了。
下面附上inotify的参数说明
inotify介绍-- 是一种强大的、细颗粒的、异步的文件系统监控机制,*&####&*_0_*&####&*内核从2.6.13起,加入Inotify可以监控
文件系统中添加、删除、修改移动等各种事件,利用这个内核接口,就可以监控文件系统下文件的各种变化情况。
inotifywait 参数说明
参数名称    参数说明
-m,monitor    始终保持事件监听状态
-r,recursive    递归查询目录
-q,quiet    只打印监控事件的信息
excludei    排除文件或目录时,不区分大小写
-t,timeout    超时时间
timefmt    指定时间输出格式
format    指定时间输出格式
-e,event    后面指定删、增、改等事件
inotifywait events事件说明
事件名称    事件说明
access    读取文件或目录内容
modify    修改文件或目录内容
attrib    文件或目录的属性改变
close_write    修改真实文件内容
close_nowrite    
close    
open    文件或目录被打开
moved_to    文件或目录移动到
moved_from    文件或目录从移动
move    移动文件或目录移动到监视目录
create    在监视目录下创建文件或目录
delete    删除监视目录下的文件或目录
delete_self    
unmount    卸载文件系统
优化 Inotify
# 在/proc/sys/fs/inotify目录下有三个文件,对inotify机制有一定的限制


[root@web ~]# ll /proc/sys/fs/inotify/
总用量0
-rw-r--r--1 root root 09923:36 max_queued_events
-rw-r--r--1 root root 09923:36 max_user_instances
-rw-r--r--1 root root 09923:36 max_user_watches
-----------------------------
max_user_watches #设置inotifywaitinotifywatch命令可以监视的文件数量(单进程)
max_user_instances #设置每个用户可以运行的inotifywaitinotifywatch命令的进程数
max_queued_events #设置inotify实例事件(event)队列可容纳的事件数量
----------------------------

[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效
[root@web ~]# echo 50000000>/proc/sys/fs/inotify/max_queued_events