简介

LVM 是逻辑盘卷管理( Logical Volume Manager)的简称,它是 Linux 环境下对磁盘分区进行管理的一种机制,LVM 是建立在硬盘和 分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

通过 LVM 系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组 (volume group),形成一个存储池。

管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系 统。管理员通过 LVM 可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配。

例如按照使用用途进行定义:developmentsales,而不是使用物理磁盘名 sdasdb。而且当系统添加了新的磁盘,通过 LVM 管理员就不必将磁盘的 文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。

58846-20160825131201304-610664422.jpg

LVM 相关名词

  • PV(physical volume):物理卷 在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区。
  • VG(volume group):卷组 建立在物理卷上,一卷组中至少要包括一物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组。
  • LV(logical volume):逻辑卷 建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间。
  • PE(physical extent):物理区域 是物理卷中可用于分配的最小存储单元,物理区域大小在建立卷组时指定,一旦确定不能更改,同一卷组所有物理卷的物理区域大小需一致,新的 pv 加入到 vg 后,pe 的大小自动更改为 vg 中定义的 pe 大小。
  • LE(logical extent):逻辑区域 是逻辑卷中可用于分配的最小存储单元,逻辑区域的大小取决于逻辑卷所在卷组中的物理区域的大小。
    卷组描述区域:卷组描述区域存在于每个物理卷中,用于描述物理卷本身、物理卷所属卷组、卷组中逻辑卷、逻辑卷中物理区域的分配等所有信息,它是在使用 pvcreate 建立物理卷时建立的。

关于 PV 命令:

pvcreate 命令用于将物理硬盘分区初始化为物理卷,以便 LVM 使用。

1
2
3
4
pvcreate:将物理分区制作成 物理卷 PV
pvscan:搜索当前系统里所有的具有 PV 属性的磁盘
pvdisplay:显示当前系统上的 PV 状态
pvremove:将 PV 属性删除,让其不具有 PV 属性,成为一般的分区

关于 VG 下命令:

1
2
3
4
5
6
7
vgcreate:建立 VG 。它的参数比较多,一会儿详细介绍
vgscan:搜索当前系统里有多少个卷组 VG 存在
vgdisplay:显示当前系统里指定的 VG 或所有 VG 的信息
vgextend:在卷组 VG 中增加额外的物理卷 PV
vgreduce:在卷组 VG 中删除 物理卷 PV
vgchange:设置 VG 是否启动(active)
vgremove:删除一个卷组 VG 本身

创建 LVM 过程

创建 LVM 过程 :

分区成 LVM 格式(8e)—PV 创建–VG 创建—LV 创建—格式化分区—MOUNT 分区—-e2fsadm 调整 LV 大小

在 LVM 发行包中有一个称为 e2fsadm 的工具,它同时包含了 lvextendresize2fs 的功能。

创建分区

使用分区工具(如: fdisk 等)创建 LVM 分区,方法和创建其他一般分区的方式是一样的,区别仅仅是 LVM 的分区类型为 8e。

1
2
3
4
5
6
7
fdisk /dev/vdb

# 选项
# p n w

# 重启(可选)
reboot

创建物理卷

创建物理卷的命令为 pvcreate,利用该命令将希望添加到卷组的所有分区或者磁盘创建为物理卷:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 格式化
mkfs.ext4 /dev/vdb

# 将整个磁盘创建为物理卷
pvcreate /dev/vdb

# 或 将单个分区创建为物理卷
pvcreate /dev/vda1

# 或 将6-9分区转成pv
pvcreate /dev/vda{6,7,8,9}

# -v显示创建的全部过程
pvcreate [-v] /dev/vda2 /dev/vdb2

# 显示系统上的 PV 状态
pvdisplay

创建卷组

创建卷组的命令为 vgcreate,将使用 pvcreate 建立的物理卷创建为一个完整的卷组:

1
2
3
# unicomvg:指定该卷组的逻辑名:
# 后面参数指定希望添加到该卷组的所有分区和磁盘
vgcreate unicomvg /dev/vdb

vgcreate 在创建卷组 unicomvg 以外,还设置使用大小为 4MB 的 PE(默认为 4MB),这表示卷组上创建的所有逻辑卷都以 4MB 为增量单位来进行扩充 或缩减。

由于内核原因,PE 大小决定了逻辑卷的最大大小,4MB 的 PE 决定了单个逻辑卷最大容量为 256GB,若希望使用大于 256G 的逻辑卷则创建卷组时指定更大的 PE。

PE 大小范围为 8KB 到 512MB,并且必须总是 2 的倍数(使用-s 指定,具体请参考 manvgcreate )。(centos 6.2 系统已发现没有这种限制)

例如,如果希望使用 64MB 的 PE 创建卷组,这样逻辑卷最大容量就可以为 4TB,命令如下:

1
vgcreate -64MB lvmdisk /dev/vdb1 /dev/vdc1

激活卷组

为了立即使用卷组而不是重新启动系统,可以使用 vgchange 来激活卷组:

1
vgchange -ay unicomvg

添加新的物理卷到卷组中

当系统安装了新的磁盘并创建了新的物理卷,而要将其添加到已有卷组时,就需要使用 vgextend 命令:

1
vgextend unicomvg /dev/vdb1

这里/dev/vdb1是新的物理卷。

从卷组中删除一个物理卷

要从一个卷组中删除一个物理卷,首先要确认要删除的物理卷没有被任何逻辑卷正在使用,就要使用 pvdisplay 命令察看一个该物理卷信息:

如果某个物理卷正在被逻辑卷所使用,就需要将该物理卷的数据备份到其他地方,然后再删除。

删除物理卷的命令为 vgreduce:

1
vgreduce unicomvg /dev/sda1

创建逻辑卷

逻辑卷(Logical Volumes)简称 LV,是在卷组中划分的一个逻辑区域,类似于非 LVM 系统中的硬盘分区。
创建逻辑卷的命令为 lvcreate,通过下面的命令。

该命令就在卷组 unicomvg 上创建名字为 unicomvol ,大小为 15000M(15G)的逻辑卷,并且设备入口为 /dev/unicomvg/unicomvol ( unicomvg 为卷组名,unicomvol 为逻辑卷名)。

创建逻辑卷的命令为 lvcreate:

  • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
  • -l:指定逻辑卷的大小(LE 数)。
1
2
3
4
5
6
7
lvcreate -L 15000 -n unicomvol unicomvg

# 或 指定100%的LE 到逻辑卷
lvcreate -l 100%VG -n unicomvol unicomvg

# 也可以指定大小为 15G
lvcreate -L 15G -n unicomvol unicomvg

如果希望创建一个使用全部卷组的逻辑卷,则需要首先察看该卷组的 PE 数,然后在创建逻辑卷时指定:

1
2
3
4
5
6
vgdisplay unicomvg | grep "TotalPE"

# 显示
Total PE 45230

lvcreate -l 45230 unicomvg -n unicomvol

同卷组一样,逻辑卷在创建的过程中也被分成了一块一块的空间,这些空间称为 LE(Logical Extents),在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。

创建文件系统

创建了文件系统以后,就可以加载并使用它:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建目录
mkdir /data/wwwroot

# 挂载
mount /dev/unicomvg/unicomvol /data/wwwroot

# 如果希望系统启动时自动加载文件系统,
# 则还需要在 /etc/fstab 中添加内容:
/dev/unicomvg/unicomvol /data/wwwroot ext4 defaults 0 0

# 或者使用
echo "/dev/mapper/unicomvg-unicomvol /unicom ext4 defaults 0 0 " >>/etc/fstab

/etc/fstab文件的每一行都遵循以下格式:

1
<device>   <dir>    <type>   <options>       <dump> <pass>
  • device:指定加载的磁盘分区或移动文件系统,除了指定设备文件外,也可以使用 UUID、LABEL来指定分区;
  • dir:指定挂载点的路径;
  • type:指定文件系统的类型,如 ext3ext4等;
  • options:指定挂载的选项,默认为 defaults,其他可用选项包括aclnoautoro等;
  • dump:表示该挂载后的文件系统能否被 dump 备份命令作用;0 表示不能,1 表示每天都进行 dump 备份,2 表示不定期进行 dump 操作。
  • pass:表示开机过程中是否校验扇区;0 表示不要校验,1 表示优先校验(一般为根目录),2 表示为在 1 级别校验完后再进行校验;

删除一个逻辑卷

删除逻辑卷以前首先需要将其卸载,然后删除:

1
2
3
4
5
# 卸载
umount /dev/unicomvg/unicomvol

# 删除
lvremove /dev/unicomvg/unicomvol

扩展逻辑卷大小

LVM 提供了方便调整逻辑卷大小的能力,扩展逻辑卷大小的命令是 lvextend :

1
2
3
4
5
6
7
8
# 将逻辑卷unicomvol的大小扩招为12G
lvextend -L12G /dev/unicomvg/unicomvol

# 将逻辑卷unicomvol的大小增加1G
lvextend -L +1G /dev/unicomvg/unicomvol、

# 将卷组 100% 分配到 逻辑卷unicomvol
lvextend -l 100%VG /dev/mapper/centos-root

调整文件系统大小:

resize2fs 命令是用来增大或者收缩未加载的 ext2/ext3/ext4 文件系统的大小。

参数:

  • -d 打开调试特性
  • -p 打印已完成的百分比进度条
  • -f 强制执行调整大小操作,覆盖掉安全检查操作
  • -F 开始执行调整大小前,刷新文件系统设备的缓冲区
  • -M: 将文件系统缩小到最小值
  • -P: 显示文件系统的最小值
1
2
3
4
5
6
7
8
9
# 建议最好将文件系统卸载,调整大小,然后再加载
# 卸载
umount /dev/unicomvg/unicomvol

# 调整
resize2fs -p /dev/unicomvg/unicomvol

# 挂载
mount /dev/unicomvg/unicomvol /data/wwwroot

减少逻辑卷大小

lvreduce命令用于减少 LVM 逻辑卷占用的空间大小。使用 lvreduce 命令收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。

  • -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节;
  • -l:指定逻辑卷的大小(LE 数)。

需要首先将文件系统卸载:

1
2
3
4
5
6
umount /data/wwwroot

# 减小 2G
lvreduce -L -2G /dev/unicomvg/unicomvol

mount /dev/unicomvg/unicomvol /data/wwwroot

参考:

LVM

Linux-centos 磁盘扩容

LVM 原理及 PV、VG、LV、PE、LE 关系图

简介

Linux df 命令用于显示目前在 Linux 系统上的文件系统的磁盘使用情况统计。默认显示单位为 KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法

1
df [选项]... [FILE]...

选项

  • -a 或–all:包含全部的文件系统;
  • –block-size=<区块大小>:以指定的区块大小来显示区块数目;
  • -h 或–human-readable:以可读性较高的方式来显示信息;
  • -H 或–si:与-h 参数相同,但在计算时是以 1000 Bytes 为换算单位而非 1024 Bytes;
  • -i 或–inodes:显示 inode 的信息;
  • -k 或–kilobytes:指定区块大小为 1024 字节;
  • -l 或–local:仅显示本地端的文件系统;
  • -m 或–megabytes:指定区块大小为 1048576 字节;
  • –no-sync:在取得磁盘使用信息前,不要执行 sync 指令,此为预设值;
  • -P 或–portability:使用 POSIX 的输出格式;
  • –sync:在取得磁盘使用信息前,先执行 sync 指令;
  • -t<文件系统类型>或–type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
  • -T 或–print-type:显示文件系统的类型;
  • -x<文件系统类型>或–exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
  • –help:显示帮助;
  • –version:显示版本信息。

实例

1
2
3
4
5
# 查看系统磁盘设备,默认是KB为单位
df

# 查看磁盘空间占用情况
df -h

参考:

Linux df 命令

简介

Linux umount命令用于卸除文件系统。
umount可卸除目前挂在Linux目录中的文件系统。

语法

1
umount [-ahnrvV] [-t <文件系统类型>] [文件系统]

参数:

  • -a 卸除/etc/mtab中记录的所有文件系统。
  • -h 显示帮助。
  • -n 卸除时不要将信息存入/etc/mtab文件中。
  • -r 若无法成功卸除,则尝试以只读的方式重新挂入文件系统。
  • -t<文件系统类型> 仅卸除选项中所指定的文件系统。
  • -v 执行时显示详细的信息。
  • -V 显示版本信息。
  • [文件系统] 除了直接指定文件系统外,也可以用设备名称或挂入点来表示文件系统。

实例

1
2
3
4
5
6
7
8
9
# 通过设备名卸载
umount -v /dev/sda1

# 通过挂载点卸载
umount -v /mnt/mymount/

# 如果设备正忙,卸载即告失败。
# 卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录
umount: /mnt/mymount: device is busy

参考:

Linux umount命令

简介

mount 命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。

语法

1
2
3
4
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

参数说明:

  • -V:显示程序版本
  • -h:显示辅助讯息
  • -v:显示较讯息,通常和 -f 用来除错。
  • -a:将 /etc/fstab 中定义的所有档案系统挂上。
  • -F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
  • -f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
  • -n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
  • -s-r:等于 -o ro
  • -w:等于 -o rw
  • -L:将含有特定标签的硬盘分割挂上。
  • -U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
  • -t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
  • -o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
  • -o sync:在同步模式下执行。
  • -o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
  • -o auto、-o noauto:打开/关闭自动挂上模式。
  • -o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
  • -o dev、-o nodev-o exec、-o noexec允许执行档被执行。
  • -o suid、-o nosuid:允许执行档在 root 权限下执行。
  • -o user、-o nouser:使用者可以执行 mount/umount 的动作。
  • -o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
  • -o ro:用唯读模式挂上。
  • -o rw:用可读写模式挂上。
  • -o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

实例

1
2
3
4
5
6
7
8
9
10
# 将 /dev/hda1 挂在 /mnt 之下。
mount /dev/hda1 /mnt

# 将 /dev/hda1 用只读模式挂在 /mnt 之下。
mount -o ro /dev/hda1 /mnt

# 将 /tmp/image.iso 这个光碟的 image 档使用 loop 模式挂在
# /mnt/cdrom之下。用这种方法可以将一般网络上可以找到的 Linux
# 光碟 ISO 在不烧录成光碟的情况下检视其内容。
mount -o loop /tmp/image.iso /mnt/cdrom

参考:

Linux mount命令

简介

lvdisplay 命令用于显示 LVM 逻辑卷空间大小、读写状态和快照信息等属性。如果省略”逻辑卷”参数,则 lvdisplay 命令显示所有的逻辑卷属性。否则,仅显示指定的逻辑卷属性。

LVM 是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。

语法

1
lvdisplay (参数)

参数

逻辑卷:指定要显示属性的逻辑卷对应的设备文件。

实例

使用lvdisplay命令显示指定逻辑卷的属性。在命令行中输入下面的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#显示逻辑卷属性
lvdisplay /dev/mapper/vg_ren-LogVol06_u01
--- Logical volume ---
LV Path /dev/vg_ren/LogVol06_u01
LV Name LogVol06_u01
VG Name vg_ren
LV UUID xMhOr0-M11J-X410-BLmE-0zVw-ojqJ-yiH1yd
LV Write Access read/write
LV Creation host, time ren-sj0001, 2020-01-19 11:18:05 +0800
LV Status available
# open 1
LV Size 300.00 GiB
Current LE 76800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 251:3

参考:

lvdisplay命令

简介

lsblk 命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM盘 的信息。块设备有 硬盘闪存盘cd-ROM 等等。lsblk 命令包含在 util-linux-ng 包中,现在该包改名为 util-linux。这个包带了几个其它工具,如dmesg。要安装lsblk,请在此处下载 util-linux包。Fedora用户可以通过命令 sudo yum install util-linux-ng 来安装该包。

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-a, --all            显示所有设备。
-b, --bytes 以bytes方式显示设备大小。
-d, --nodeps 不显示 slaves 或 holders。
-D, --discard print discard capabilities。
-e, --exclude <list> 排除设备 (default: RAM disks)。
-f, --fs 显示文件系统信息。
-h, --help 显示帮助信息。
-i, --ascii use ascii characters only。
-m, --perms 显示权限信息。
-l, --list 使用列表格式显示。
-n, --noheadings 不显示标题。
-o, --output <list> 输出列。
-P, --pairs 使用key="value"格式显示。
-r, --raw 使用原始格式显示。
-t, --topology 显示拓扑结构信息。

显示说明:

  • NAME:这是块设备名。
  • MAJ: MIN:本栏显示主要和次要设备号。
  • RM:本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。
  • SIZE:本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。
  • RO:该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。
  • TYPE:本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。
  • MOUNTPOINT:本栏指出设备挂载的挂载点。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 默认选项不会列出所有空设备,使用 -a 显示空设备。
lsblk -a

# 列出一个特定设备的拥有关系,同时也可以列出组和模式.
lsblk -m

# 该命令也可以只获取指定设备的信息,
# 可以通过在提供给lsblk命令的选项后指定设备名来实现
# 以字节显示你的磁盘驱动器大小
lsblk -b /dev/sda
# 等价于
lsblk --bytes /dev/sda

# 获取SCSI设备的列表
lsblk -S

# lsblk列出SCSI设备,而-s是逆序选项(将设备和分区的组织关系逆转过来显示)
lsblk -s

参考:

Linux lsblk命令

简介

1
2
3
4
5
6
7
8
# 查看binlog的格式的脚本
show GLOBAL variables like '%binlog_format%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.01 sec)

mysql复制主要有三种方式:
基于SQL语句的复制(statement-based replication, SBR)
基于行的复制(row-based replication, RBR)
混合模式复制(mixed-based replication, MBR)。

对应的 binlog 的格式也有三种:STATEMENTROWMIXED

STATEMENT模式(SBR)

每一条会修改数据的sql语句会记录到 binlog 中。优点是并不需要记录每一条sql语句和每一行的数据变化,减少了 binlog 日志量,节约IO,提高性能。缺点是在某些情况下会导致master-slave 中的数据不一致(如 sleep() 函数, last_insert_id(),以及 user-defined functions(udf) 等会出现问题)

ROW模式(RBR)

不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或 function、或 trigger 的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是 alter table 的时候会让日志暴涨。

MIXED模式(MBR)

以上两种模式的混合使用,一般的复制使用 STATEMENT 模式保存 binlog ,对于 STATEMENT 模式无法复制的操作使用ROW模式保存 binlog,MySQL会根据执行的SQL语句选择日志保存方式。

binlog 复制配置

在mysql的配置文件my.cnf中,可以通过一下选项配置 binglog 相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# binlog日志格式,mysql默认采用ROW,建议使用mixed
binlog_format=MIXED

# binlog日志文件
log-bin=/usr/local/mysql/binlogs/bin-log

# binlog过期清理时间
expire_logs_days=7

# binlog每个日志文件大小
max_binlog_size=100m

# binlog缓存大小
binlog_cache_size=4m

# 最大binlog缓存大小
max_binlog_cache_size=512m

MIXED说明

对于执行的SQL语句中包含 now() 这样的时间函数,会在日志中产生对应的 unix_timestamp()*1000 的时间字符串,slave 在完成同步时,取用的是 sqlEvent 发生的时间来保证数据的准确性。另外对于一些功能性函数 slave 能完成相应的数据同步,而对于上面指定的一些类似于 UDF 函数,导致 Slave无法知晓的情况,则会采用 ROW 格式存储这些 Binlog ,以保证产生的 Binlog 可以供 Slave 完成数据同步。

比较以下 SBRRBR 两种模式各自的优缺点:

SBR 的优点:

  • 历史悠久,技术成熟
  • binlog 文件较小
  • binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况
  • binlog 可以用于实时的还原,而不仅仅用于复制
  • 主从版本可以不一样,从服务器版本可以比主服务器版本高

SBR 的缺点:

不是所有的 UPDATE 语句都能被复制,尤其是包含不确定操作的时候。
调用具有不确定因素的 UDF 时复制也可能出问题
使用以下函数的语句也无法被复制:

  • LOAD_FILE()
  • UUID()
  • USER()
  • FOUND_ROWS()
  • SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)

SBR:

  • INSERT ... SELECT 会产生比 RBR 更多的行级锁
  • 复制需要进行全表扫描(WHERE 语句中没有使用到索引)的 UPDATE 时,需要比 RBR 请求更多的行级锁
  • 对于有 AUTO_INCREMENT 字段的 InnoDB 表而言,INSERT 语句会阻塞其他 INSERT 语句
  • 对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响
  • 存储函数(不是存储过程)在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
  • 确定了的 UDF 也需要在从服务器上执行
  • 数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
  • 执行复杂语句如果出错的话,会消耗更多资源

RBR 的优点:

任何情况都可以被复制,这对复制来说是最安全可靠的
和其他大多数数据库系统的复制技术一样
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
复制以下几种语句时的行锁更少:

  • INSERT … SELECT
  • 包含 AUTO_INCREMENT 字段的 INSERT
  • 没有附带条件或者并没有修改很多记录的 UPDATEDELETE 语句
  • 执行 INSERTUPDATEDELETE 语句时锁更少
  • 从服务器上采用多线程来执行复制成为可能

RBR 的缺点:

  • binlog 大了很多
  • 复杂的回滚时 binlog 中会包含大量的数据
  • 主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写问题
  • UDF 产生的大 BLOB 值会导致复制变慢
  • 无法从 binlog 中看到都复制了写什么语句
  • 当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生

另外,针对系统库 mysql 里面的表发生变化时的处理规则如下:

  • 如果是采用 INSERTUPDATEDELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录
  • 如果是采用 GRANTREVOKESET PASSWORD 等管理语句来做的话,那么无论如何都采用 SBR 模式记录

注:采用 RBR 模式后,能解决很多原先出现的主键重复问题。

参考:

mysql中binlog_format模式与配置详解

硬盘接口的分类

硬盘接口通常分为五种类型:IDE接口、SATA接口、SCSI接口、SAS接口、光纤通道(FC)。

硬盘的分类

硬盘分为固态硬盘(SSD 盘)、机械硬盘(HDD)、混合硬盘(HHD)三种。

SSD采用闪存颗粒来存储,HDD采用磁性碟片来存储,混合硬盘(HHD: Hybrid Hard Disk)是把磁性硬盘和闪存集成到一起的一种硬盘。绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。

IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘。
SCSI是 小型计算机系统专用接口 的简称,SCSI硬盘就是采用这种接口的硬盘。SAS就是串口的SCSI接口。一般服务器硬盘采用这两类接口,其性能比上述两种硬盘要高,稳定性更强,但是价格高,容量小,噪音大。

FC是光纤通道,和SCIS接口一样,光纤通道最初也不是为硬盘设计开发的接口技术,是专门为网络系统设计的,但随着存储系统对速度的需求,才逐渐应用到硬盘系统中。

SSD也称作电子硬盘或者固态电子盘,是由控制单元和固态存储单元(DRAM或FLASH芯片)组成的硬盘。

固态硬盘的接口规范和定义、功能及使用方法上与普通硬盘的相同,在产品外形和尺寸上也与普通硬盘一致。新一代的固态硬盘普遍采用SATA-2接口,但其成本较高。

IDE/ATA

IDE( Integrated Drive Electronics 集成驱动器电子)的缩写,它的本意是指把控制器与盘体集成在一起的硬盘驱动器,是一种硬盘的传输接口,它有另一个名称叫做 ATA(Advanced Technology Attachment),这两个名词都有厂商在用,指的是相同的东西。

ATA(Advanced Technology Attachment)高技术配置,一般来说,ATA是一种控制器技术,而 IDE(Integrated Drive Electronics) 是一个匹配它的磁盘驱动器技术,ATA和IDE通常可以互换使用。ATA下一步的技术是SATA(Serial ATA),串行ATA。有了SATA之后,原来的 ATA又被称为 PATA(Parallel ATA),并行ATA。一般意义上,IDEPATA 是说的同一种东西,它们的进化型是SATA。

IDE的规格后来有所进步,而推出了 EIDE(Enhanced IDE) 的规格名称,而这个规格同时又被称为 Fast ATA。所不同的是 Fast ATA 是专指硬盘接口,而 EIDE 还制定了连接光盘等非硬盘产品的标准。而这个连接非硬盘类的IDE标准,又称为ATAPI接口。而之后再推出更快的接口,名称都只剩下ATA的字样,像是 Ultra ATA、ATA/66、ATA/100 等。

早期的IDE接口有两种传输模式,一个是 PIO(Programming I/O)模式,另一个是 DMA(Direct Memory Access)。虽然DMA模式系统资源占用少,但需要额外的驱动程序或设置,因此被接受的程度比较低。后来在对速度要求愈来愈高的情况下,DMA模式由于执行效率较好,操作系统开始直接支持,而且厂商更推出了愈来愈快的DMA模式传输速度标准。而从英特尔的430TX芯片组开始,就提供了对Ultra DMA 33的支持,提供了最大33MB/sec的的数据传输率,以后又很快发展到了ATA 66,ATA 100以及迈拓提出的ATA 133标准,分别提供66MB/sec,100MB/sec以及133MB/sec的最大数据传输率。

值得注意的是,迈拓提出的ATA 133标准并没能获得业界的广泛支持,硬盘厂商中只有迈拓自己才采用ATA 133标准,而日立(IBM),希捷和西部数据则都采用 ATA 100 标准,芯片组厂商中也只有 VIA,SIS,ALi 以及 nViidia 对次标准提供支持,芯片组厂商中英特尔则只支持 ATA 100 标准。

各种IDE标准都能很好的向下兼容,例如 ATA 133 兼容 ATA 66/100Ultra DMA33 ,而 ATA 100 也兼容 Ultra DMA 33/66

要特别注意的是,对 ATA 66 以及以上的IDE接口传输标准而言,必须使用专门的80芯IDE排线,其与普通的40芯IDE排线相比,增加了40条地线以提高信号的稳定性。

29144617-8c1ec011bbc84e0d8b9c138ea67c9003.png

特点:

一般使用16-bit数据总线, 每次总线处理时传送2个字节。PATA接口一般是100Mbytes/sec带宽,数据总线必须锁定在50MHz,为了减小滤波设计的复杂性,PATA使用Ultra总线,通过“双倍数据比率”或者2个边缘(上升沿和下降沿)时钟机制用来进行DMA传输。这样在数据滤波的上升沿和下降沿都采集数据,就降低一半所需要的滤波频率。这样带宽就是:25MHz 时钟频率x 2 双倍时钟频率x 16 位/每一个边缘/ 8 位/每个字节= 100 Mbytes/sec。

优点:

自问世以来,一直以其价廉、稳定性好、标准化程度高等特点,深得广大中低端用户的青睐,甚至在某些高端应用领域,如服务器应用中也有一定的市场。

缺点:

随着CPU时钟频率和内存带宽的不断提升,其接口协议PATA(Paralle ATA)逐渐显现出不足来。一方面,硬盘制造技术的成熟使ATA硬盘的单位价格逐渐降低,另一方面,由于采用并行总线接口,传输数据和信号的总线是复用的,因此传输速率会受到一定的限制。如果要提高传输的速率,那么传输的数据和信号往往会产生干扰,从而导致错误。

在当今的许多大型企业中,PATA现有的传输速率已经逐渐不能满足用户的需求。

SATA

使用 SATA(Serial ATA)口的硬盘又叫 串口硬盘。2001年,由Intel、APT、Dell、IBM、希捷、迈拓这几大厂商组成的Serial ATA委员会正式确立了Serial ATA 1.0规范。

SATA以它串行的数据发送方式得名。在数据传输的过程中,数据线和信号线独立使用,并且传输的时钟频率保持独立,因此同以往的PATA相比,SATA的传输速率可以达到并行的30倍。可以说:SATA技术并不是简单意义上的PATA技术的改进,而是一种全新的总线架构。

29144621-4227c55b80804e9f9d0d73170f719fb0.png

2002年,虽然串行ATA的相关设备还未正式上市,但Serial ATA委员会已抢先确立了Serial ATA 2.0规范(SATA II)。

Serial ATA采用串行连接方式,串行ATA总线使用嵌入式时钟信号,具备了更强的纠错能力,与以往相比其最大的区别在于能对传输指令(不仅仅是数据)进行检查,如果发现错误会自动矫正,这在很大程度上提高了数据传输的可靠性。串行接口还具有结构简单、支持热插拔的优点。

串口硬盘是一种完全不同于并行ATA的新型硬盘接口类型,由于采用串行方式传输数据而知名。相对于并行ATA来说,就具有非常多的优势。

  • 1,Serial ATA以连续串行的方式传送数据,一次只会传送1位数据。这样能减少SATA接口的针脚数目,使连接电缆数目变少,效率也会更高。
  • 2,实际上,Serial ATA 仅用四支针脚就能完成所有的工作,分别用于连接电缆、连接地线、发送数据和接收数据,同时这样的架构还能降低系统能耗和减小系统复杂性。
  • Serial ATA的起点更高、发展潜力更大,Serial ATA 1.0定义的数据传输率可达150MB/s;这比最快的并行ATA(即ATA/133)所能达到133MB/s的最高数据传输率还高;而在Serial ATA 2.0的数据传输率达到300MB/s;最终SATA将实现600MB/s的最高数据传输率。

在选购主板时,其实并无必要太在意IDE接口传输标准有多快,其实在ATA 100,ATA 133以及SATA 150下硬盘性能都差不多,因为受限于硬盘的机械结构和数据存取方式,硬盘的性能瓶颈是硬盘的内部数据传输率而非外部接口标准,目前主流硬盘的内部数据传输率离ATA 100的100MB/sec都还差得很远。

SATA II

SATA的速度是每秒1.5Gbps(150MB/sec),SATA2(Serial ATA 2.0规范)的速度是每秒3Gbps(300MB/sec)。SATA II接口主板能插SATA硬盘,SATA接口主板不能插 SATA II 盘硬,这都是向下兼容的。

SATA II是在SATA的基础上发展起来的,其主要特征是外部传输率从SATA的1.5G进一步提高到了3G,此外还包括NCQ(Native Command Queuing,原生命令队列)、端口多路器(Port Multiplier)、交错启动(Staggered Spin-up)等一系列的技术特征。单纯的外部传输率达到3Gbps并不是真正的SATA II。

SATA II的关键技术就是3Gbps的外部传输率和NCQ技术。 NCQ技术可以对硬盘的指令执行顺序进行优化,避免像传统硬盘那样机械地按照接收指令的先后顺序移动磁头读写硬盘的不同位置,与此相反,它会在接收命令后对其进行排序,排序后的磁头将以高效率的顺序进行寻址,从而避免磁头反复移动带来的损耗,延长硬盘寿命。

另外并非所有的SATA硬盘都可以使用NCQ技术,除了硬盘本身要支持 NCQ之外,也要求主板芯片组的SATA控制器支持NCQ。此外,NCQ技术不支持FAT文件系统,只支持NTFS文件系统。

由于SATA设备市场比较混乱,不少SATA设备提供商在市场宣传中滥用 SATA II 的现象愈演愈烈,例如某些号称 SATA II 的硬盘却仅支持3Gbps而不支持NCQ,而某些只具有1.5Gbps的硬盘却又支持NCQ。所以,由希捷(Seagate)所主导的 SATA-IO ( Serial ATA International OrganizationSATA国际组织,原SATA工作组)又宣布了SATA 2.5规范,收录了原先SATA II所具有的大部分功能——从3Gbps和NCQ到交错启动(Staggered Spin-up)、热插拔(Hot Plug)、端口多路器(Port Multiplier)以及比较新的eSATA(External SATA,外置式SATA接口)等等。

值得注意的是,部分采用较早的仅支持1.5Gbps的南桥芯片(例如VIA VT8237和NVIDIA nForce2 MCP-R/MCP-Gb)的主板在使用SATA II硬盘时,可能会出现找不到硬盘或蓝屏的情况。不过大部分硬盘厂商都在硬盘上设置了一个速度选择跳线,以便强制选择1.5Gbps或3Gbps的工作模式(少数硬盘厂商则是通过相应的工具软件来设置),只要把硬盘强制设置为1.5Gbps,SATA II硬盘照样可以在老主板上正常使用。

SATA硬盘在设置RAID模式时,一般都需要安装主板芯片组厂商所提供的驱动,但也有少数较老的SATA RAID控制器在打了最新补丁的某些版本的Windows XP系统里不需要加载驱动就可以组建RAID。

SCSI

SCSI的英文全称为 Small Computer System Interface(小型计算机系统接口),是同IDE(ATA)完全不同的接口,IDE接口是普通PC的标准接口,而SCSI并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端服务器和高档工作站中。

29144631-d4cf3905a28f480a876dd7e5ac503ca4.png

29144633-e02259701add495aaf74ff2b2192eee6.png

优点:

系统占用率极低,转速快,传输率高.

缺点:

价格高、安装不便、还需要设置及其安装驱动程序,因此这种接口的硬盘大多用于服务器等高端应用场合。

SAS

SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术。和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。

SAS的接口技术可以向下兼容SATA。具体来说,二者的兼容性主要体现在物理层和协议层的兼容。

  • 1,在物理层,SAS接口和SATA接口完全兼容,SATA硬盘可以直接使用在SAS的环境中,从接口标准上而言,SATA是SAS的一个子标准,因此SAS控制器可以直接操控SATA硬盘,但是SAS却不能直接使用在SATA的环境中,因为SATA控制器并不能对SAS硬盘进行控制;

  • 2,在协议层,SAS由3种类型协议组成,根据连接的不同设备使用相应的协议进行数据传输。其中串行SCSI协议(SSP)用于传输SCSI命令;SCSI管理协议(SMP)用于对连接设备的维护和管理;SATA通道协议(STP)用于SAS和SATA之间数据的传输。因此在这3种协议的配合下,SAS可以和SATA以及部分SCSI设备无缝结合。

SAS系统的背板(Backplane)既可以连接具有双端口、高性能的SAS驱动器,也可以连接高容量、低成本的SATA驱动器。所以SAS驱动器和SATA驱动器可以同时存在于一个存储系统之中。但需要注意的是,SATA系统并不兼容SAS,所以SAS驱动器不能连接到SATA背板上。由于SAS系统的兼容性,使用户能够运用不同接口的硬盘来满足各类应用在容量上或效能上的需求,因此在扩充存储系统时拥有更多的弹性,让存储设备发挥最大的投资效益。

在系统中,每一个SAS端口可以最多可以连接16256个外部设备,并且SAS采取直接的点到点的串行传输方式,传输的速率高达3Gbps,估计以后会有6Gbps乃至12Gbps的高速接口出现。

SAS的接口也做了较大的改进,它同时提供了3.5英寸和2.5英寸的接口,因此能够适合不同服务器环境的需求。

SAS依靠SAS扩展器来连接更多的设备,目前的扩展器以12端口居多,不过根据板卡厂商产品研发计划显示,未来会有28、36端口的扩展器引入,来连接SAS设备、主机设备或者其他的SAS扩展器。

和传统并行SCSI接口比较起来,SAS不仅在接口速度上得到显著提升(现在主流Ultra 320 SCSI速度为320MB/sec,而SAS才刚起步速度就达到300MB/sec,未来会达到600MB/sec甚至更多),而且由于采用了串行线缆,不仅可以实现更长的连接距离,还能够提高抗干扰能力,并且这种细细的线缆还可以显著改善机箱内部的散热情况。

SAS目前的不足主要有以下方面:

  • 1,硬盘、控制芯片种类少:

只有希捷、迈拓以及富士通等为数不多的硬盘厂商推出了SAS接口硬盘,品种太少,其他厂商的SAS硬盘多数处在产品内部测试阶段。此外周边的SAS控制器芯片或者一些SAS转接卡的种类更是不多,多数集中在LSI以及Adaptec公司手中。

  • 2,硬盘价格太贵:

比起同容量的Ultra 320 SCSI硬盘,SAS硬盘要贵了一倍还多。一直居高不下的价格直接影响了用户的采购数量和渠道的消化数量,而无法形成大批量生产的SAS 硬盘,其成本的压力又会反过来促使价格无法下降。

如果用户想要做个简单的RAID级别,那么不仅需要购买多块SAS硬盘,还要购买昂贵的RAID卡,价格基本上和硬盘相当。

  • 3, 实际传输速度变化不大:

SAS硬盘的接口速度并不代表数据传输速度,受到硬盘机械结构限制,现在SAS硬盘的机械结构和SCSI硬盘几乎一样。目前数据传输的瓶颈集中在由硬盘内部机械机构、硬盘存储技术、磁盘转速,所决定的硬盘内部数据传输速度,也就是80MBsec左右,SAS硬盘的性能提升不明显。

  • 4, 用户追求成熟、稳定的产品:

从现在已经推出的产品来看,SAS硬盘更多的被应用在高端4路服务器上,而4路以上服务器用户并非一味追求高速度的硬盘接口技术,最吸引他们的应该是成熟、稳定的硬件产品,虽然SAS接口服务器和SCSI接口产品在速度、稳定性上差不多,但目前的技术和产品都还不够成熟。

不过随着英特尔等主板芯片组制造商、希捷等硬盘制造商以及众多的服务器制造商的大力推动,SAS的相关产品技术会逐步成熟,价格也会逐步滑落,早晚都会成为服务器硬盘的主流接口。

FC

光纤通道的英文拼写是Fiber Channel,和SCIS接口一样光纤通道最初也不是为硬盘设计开发的接口技术,是专门为网络系统设计的,但随着存储系统对速度的需求,才逐渐应用到硬盘系统中。光纤通道硬盘是为提高多硬盘存储系统的速度和灵活性才开发的,它的出现大大提高了多硬盘系统的通信速度。光纤通道的主要特性有:热插拔性、高速带宽、远程连接、连接设备数量大等。

FC硬盘是指采用FC-AL( Fiber Channel Arbitrated Loop,光纤通道仲裁环) 接口模式的磁盘。FC-AL使光纤通道能够直接作为硬盘连接接口,为高吞吐量性能密集型系统的设计者开辟了一条提高I/O性能水平的途径。目前高端存储产品使用的都是FC接口的硬盘。

FC硬盘名称由于通过光学物理通道进行工作,因此起名为光纤硬盘,现在也支持铜线物理通道。就像是IEEE-1394, Fibre Channel 实际上定义为SCSI-3标准一类,属于SCSI的同胞兄弟。作为串行接口FC-AL峰值可以达到2Gbits/s甚至是4Gbits/s。而且通过光学连接设备最大传输距离可以达到10KM。通过FC-loop可以连接127个设备,也就是为什么基于FC硬盘的存储设备通常可以连接几百颗甚至千颗硬盘提供大容量存储空间。

关于光纤硬盘以其的优越的性能、稳定的传输,在企业存储高端应用中担当重要角色。业界普遍关注的焦点在于光纤接口的带宽。最早普及使用的光纤接口带宽为1Gb,随后2Gb带宽光纤产品统治市场已经长达三年时间。现在的带宽标准是4Gb,目前普遍厂商都已经采用4Gb相关产品。8Gb光纤产品也将在不久的将来取代4Gb光纤成为市场主流。

4Gb是以2Gb为基础延伸的传输协议,可以向下兼容1Gb和2Gb,所使用的光纤线材、连接端口也都相同,意味着使用者在导入4Gb设备时,不需为了兼容性问题更换旧有的设备,不但可以保护既有的投资,也可以采取渐进式升级的方式,逐步淘汰旧有的2Gb设备。

光纤通道是为在像服务器这样的多硬盘系统环境而设计,能满足高端工作站、服务器、海量存储子网络、外设间通过集线器、交换机和点对点连接进行双向、串行数据通讯等系统对高数据传输率的要求。

SSD

固态硬盘(Solid State Disk或Solid State Drive),也称作电子硬盘或者固态电子盘,是由控制单元和固态存储单元(DRAM或FLASH芯片)组成的硬盘。存储单元负责存储数据,控制单元负责读取、写入数据。拥有速度快,耐用防震,无噪音,重量轻等优点。固态硬盘的接口规范和定义、功能及使用方法上与普通硬盘的相同,在产品外形和尺寸上也与普通硬盘一致。由于固态硬盘没有普通硬盘的旋转介质,因而抗震性极佳。其芯片的工作温度范围很宽(-40~85℃)。目前广泛应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空等、导航设备等领域。目前由于成本较高,正在逐渐普及到DIY市场。

由于固态硬盘技术与传统硬盘技术不同,所以产生了不少新兴的存储器厂商。厂商只需购买NAND存储器,再配合适当的控制芯片,就可以制造固态硬盘了。新一代的固态硬盘普遍采用SATA-2接口。

固态硬盘的存储介质分为两种,一种是采用闪存(FLASH芯片)作为存储介质,另外一种是采用DRAM作为存储介质。

SSD固态优点:   

  • 第一,SSD不需要机械结构,完全的半导体化,不存在数据查找时间、延迟时间和磁盘寻道时间,数据存取速度快,读取数据的能力在230M/s以上,最高的可达500M/s以上。
  • 第二,SSD全部采用闪存芯片,经久耐用,防震抗摔,即使发生与硬物碰撞,数据丢失的可能性也能够降到最小。
  • 第三,得益于无机械部件及FLASH闪存芯片,SSD没有任何噪音,功耗低。
  • 第四,质量轻,比常规1.8英寸硬盘重量轻20-30克,使得便携设备搭载多块SSD成为可能。同时因其完全半导体化,无结构限制,可根据实际情况设计成各种不同接口、形状的特殊电子硬盘。

SSD的劣势   

  • 固态硬盘成本高。

  • 固态硬盘的寿命有限 对于采用Nand Flash作为存储介质的SSD来说,怀疑其使用寿命也不是没有道理的,理论上MLC的写入寿命为1万次,SLC的写入寿命为10万次。但是否意味着一个 固态硬盘的寿命只有2到3年呢,这个也不一定。英特尔表示保证能在未来5年里,每天可以向其MLC SSD产品中写入100GB的数据,并且保证其数据的完整性。如果不是写入太频繁的话,正常使用用5年以上是没有问题的。

  • (1)基于闪存的固态硬盘(IDE FLASH DISK、Serial ATA Flash Disk)

采用FLASH芯片作为存储介质,这也是我们通常所说的SSD。它的外观可以被制作成多种模样,例如:笔记本硬盘、微硬盘、存储卡、优盘等样式。这种SSD固态硬盘最大的优点就是可以移动,而且数据保护不受电源控制,能适应于各种环境,但是使用年限不高,适合于个人用户使用。

在基于闪存的固态硬盘中,存储单元又分为两类:SLC(Single Layer Cell 单层单元)和MLC(Multi-Level Cell多层单元)。

SLC的特点是成本高、容量小、但是速度快,而MLC的特点是容量大成本低,但是速度慢。MLC的每个单元是2bit的,相对SLC来说整整多了一倍。不过,由于每个MLC存储单元中存放的资料较多,结构相对复杂,出错的几率会增加,必须进行错误修正,这个动作导致其性能大幅落后于结构简单的SLC闪存。此外,SLC闪存的优点是复写次数高达100000次,比MLC闪存高10倍。此外,为了保证MLC的寿命,控制芯片都校验和智能磨损平衡技术算法,使得每个存储单元的写入次数可以平均分摊,达到100万小时故障间隔时间(MTBF)。

  • (2)基于DRAM的固态硬盘

采用DRAM作为存储介质,目前应用范围较窄。它仿效传统硬盘的设计、可被绝大部分操作系统的文件系统工具进行卷设置和管理,并提供工业标准的PCI和FC接口用于连接主机或者服务器。应用方式可分为SSD硬盘和SSD硬盘阵列两种。它是一种高性能的存储器,而且使用寿命很长,美中不足的是需要独立电源来保护数据安全。

单纯硬盘的硬盘接口协议也不是衡量一个存储系统性能指标的唯一要素,除了硬盘性能指标以外,存储系统的硬件设计,前端主机接口等性能指标也同样对存储系统的整体性能影响巨大。
如果需要应用于I/O负载较轻的应用比如文件共享、FTP、音频存储、数据备份等可以考虑基于SATA硬盘的阵列。如果I/O负载较重的FTP、VOD、EMAIL、Web、数据库应用,那么可以考虑基于SAS/FC硬盘的存储系统。

总结

单纯硬盘的硬盘接口协议也不是衡量一个存储系统性能指标的唯一要素,除了硬盘性能指标以外,存储系统的硬件设计,前端主机接口等性能指标也同样对存储系统的整体性能影响巨大。
如果需要应用于I/O负载较轻的应用比如文件共享、FTP、音频存储、数据备份等可以考虑基于 SATA 硬盘的阵列。
如果I/O负载较重的FTP、VOD、EMAIL、Web、数据库应用,那么可以考虑基于 SAS/FC 硬盘的存储系统。

参考:

硬盘基础知识(HDD、SSD、IDE、PATA、SATA、SCSI、SAS)

IDE、SATA、SCSI、SAS、FC、SSD硬盘类型介绍

识别 Linux上的设备(磁盘)类型

ovirt磁盘类型(IDE, virtio, virtio-scsi)

简介

Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

Linux链接分两种,

  • 硬链接(Hard Link);
  • 软链接,即符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置信息。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

软连接

  • 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
  • 软链接可以 跨文件系统 ,硬链接不可以
  • 软链接可以对一个不存在的文件名进行链接
  • 软链接可以对目录进行链接

硬链接

  • 硬链接,以文件副本的形式存在。但不占用实际空间。
  • 不允许给目录创建硬链接
  • 硬链接只有在同一个文件系统中才能创建
  • 硬链接只能在同一个分区内建立。

硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为 索引节点号(Inode Index)。多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止误删 的功能。

硬连接 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。

因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。

硬连接 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。

所以,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

ln命令

ln命令为某一个文件在另外一个位置建立一个同步的链接。

语法:

1
2
3
4
ln [参数] [源文件或目录] [目标文件或目录]

# 其中参数的格式为
ln [-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}] [--help] [--version] [--]
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
# 删除,覆盖目标文件之前的备份;
-b 或 --backup

# 建立目录的硬连接;
-d 或 -F 或 --directory

# 强行建立文件或目录的连接,不论文件或目录是否存在;
-f 或 --force

# 覆盖既有文件之前先询问用户;
-i 或 --interactive

# 把符号连接的目的目录视为一般文件;
-n 或 --no-dereference

# 对源文件建立软链接(符号连接),而非硬连接;
-s 或 --symbolic

# 用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,
# 预设的备份字符串是符号 ~,用户可通过 -S 参数来改变它;
-S<字尾备份字符串> 或 --suffix=<字尾备份字符串>

# 显示指令执行过程;
-v 或 --verbose

# 用 -b 参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,
# 这个字符串不仅可用 -S 参数变更,当使用 -V 参数<备份方式>
# 指定不同备份方式时,也会产生不同字尾的备份字符串;
-V<备份方式> 或 --version-control=<备份方式>

# 在线帮助;
--help

# 显示版本信息。
--version

实例

建立硬链接

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件
touch source.txt

# 创建硬链接
ln source.txt hardsource.txt

# -i 选项表示列出每个文件的 inode 节点 ID
# 可以发现 source.txt 和 hardsource.txt 的 inode 号完全一致,
# 说明它们都指向了同一个数据块。
ls -il
总用量 0
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 hardsource.txt
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 source.txt

软连接

1
2
3
4
5
6
7
8
9
10
# 创建软链接
ln -s source.txt softsource.txt

# 列出 文件列表
# 注意:软链接文件的权限栏首字符为 l(L的小写字母),这也是软链接文件区别于普通文件的地方之一。
ls -il
总用量 0
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 hardsource.txt
1042589 lrwxrwxrwx 1 root root 10 8月 26 10:59 softsource.txt -> source.txt
1042588 -rw-r--r-- 2 root root 0 8月 26 10:55 source.txt

独立服务启动管理

使用/etc/init.d/目录中的启动脚本来启动独立的服务

所有独立服务的启动脚本都存放在 /etc/init.d/ 目录中,调用这些脚本就可以启动独立的服务(推荐启动方式)。

命令格式如下:

1
/etc/init.d 独立服务名 start | stop |status | restart |...

参数:

  • start:启动服务;
  • stop:停止服务;
  • status:查看服务状态;
  • restart:重启动服务;

使用service命令来启动独立的服务

CentOS 可以依赖 service 命令来启动独立的服务。service 命令实际上只是一个脚本,这个脚本仍然需要调用 /etc/init.d/ 中的启动脚本来启动独立的服务。

注意:service 命令是红帽系列 Linux 的专有命令,其他的 Linux 发行版本不一定拥有这条命令。

命令格式:

1
2
3
4
service 独立服务名 start | stop | restart |...

# 查看所有独立服务的启动状态
service --status -all

独立服务的自启动管理

chkconfig 服务自启动管理命令

1
chkconfig [--level 运行级别] [独立服务名] [on|off]

如果在 0~6 这 7 个运行级别中服务都显示”关闭”,则该服务不自启动。如果在某个运行级别中显示”启用”,则代表在进入这个运行级别时,该服务开机自启动。

修改 /etc/rc.d/rc.local 文件,设置服务自启动

在文件 /etc/rc.d/rc.local 中加入服务的启动命令。这个文件是在系统启动时,在输入用户名和密码之前最后读取的文件(注意:/etc/rc.d/rc.local/etc/rc.local 文件是软链接,修改哪个文件都可以)。这个文件中有什么命令,都会在系统启动时调用。

推荐使用这种方法管理服务的自启动,有两点好处:

  • 第一,如果都采用这种方法管理服务的自启动,当我们碰到一台陌生的服务器时,只要查看这个文件就知道这台服务器到底自启动了哪些服务,便于集中管理。
  • 第二,chkconfig 命令只能识别 RPM 包默认安装的服务,而不能识别源码包安装的服务。 源码包安装的服务的自启动也是通过 /etc/rc.d/rc.local 文件实现的,所以不会出现同一台服务器自启动了两种安装方法的同一个服务。

注意 修改 /etc/rc.d/rc.local 配置文件的自启动方法和 chkconfig 命令的自启动方法是两种不同的自启动方法。所以,就算通过修改 /etc/rc.d/rc.local 配置文件的方法让某个独立的服务自启动了,执行 chkconfig --list 命令并不到有什么变化。

使用 ntsysv 命令管理自启动

ntsysv 命令调用窗口模式来管理服务的自启动

1
2
3
4
5
6
7
8
# 命令格式
ntsysv [--level 运行级别]

# 只设定2、3、5级别的服务自启动
ntsysv --level 235

# 按默认的运行级别设置服务自启动
ntsysv

执行命令后,会和 setup 命令类似,出现命令界面

2-1Q02415591C13.jpg

  • 上下键:在不同服务之间移动;
  • 空格键:选定或取消服务的自启动。也就是在服务之前是否输入”*”;
  • Tab键:在不同项目之间切换;
  • F1键:显示服务的说明;

总结:只要是 RPM 包默认安装的服务都能被 ntsysv 命令管理,包括 独立服务的自启动基于 xinetd 服务的自启动

注意: ntsysv 命令是红帽系列 Linux 的专有命令,其他的 Linux 发行版本不一定拥有这条命令,而且条命令也不能管理源码包安装的服务。

参考:

Linux独立服务管理

简介

chkconfig 命令主要用来检查,设置,更新(启动或停止)系统的各种服务和查询系统服务的运行级信息。

这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。
注意: chkconfig 不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

语法

1
2
chkconfig [--add][--del][--list] [系统服务] 
chkconfig [--level <等级代号>] [系统服务] [on/off/reset]

参数:

--add :增加所指定的系统服务,让 chkconfig 指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
--del :删除所指定的系统服务,不再由 chkconfig 指令管理,并同时在系统启动的叙述文件内删除相关数据。
--level<等级代号> :指定读系统服务要在哪一个执行等级中开启或关毕。

用法

  • chkconfig 在没有参数运行时,显示用法。
  • 如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回 true ,否则返回 false
  • 如果在服务名后面指定了 on,off 或者 reset,那么 chkconfig 会改变指定服务的启动信息。
  • onoff 分别指服务被启动和停止,reset 指重置服务的启动信息,无论有问题的初始化脚本指定了什么。
  • onoff 开关,系统默认只对运行级 2,3,4,5 有效,但是reset可以对所有运行级有效。

等级0表示:表示关机
等级1表示:单用户模式
等级2表示:无网络连接的多用户命令行模式
等级3表示:有网络连接的多用户命令行模式
等级4表示:不可用
等级5表示:带图形界面的多用户模式
等级6表示:重新启动

注意: level 选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时, init 不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示所有运行级系统服务的运行状态信息(on或off)。
# 如果指定了name,那么只显示指定的服务在不同运行级的状态。
chkconfig --list [name]

# 增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。
# 如有缺少,则会从缺省的init脚本自动建立。在chkconfig工具服务列表中增加此服务,
# 此时服务会被在 `/etc/rc.d/rcN.d` 中赋予 `K/S` 入口了;
chkconfig --add name

# 删除服务,并把相关符号连接从/etc/rc[0-6].d删除。
chkconfig --del name

# 设置某一服务在指定的运行级是被启动,停止还是重置。
chkconfig [--level levels] name

简介

系统服务是在后台运行的应用程序,并且可以提供一些本地系统或网络的功能。我们把这些应用程序称作服务,也就是 Service。或者 DaemonDaemon 的英文原意是”守护神”,在这里是”守护进程”的意思。守护进程就是为了实现服务、功能的进程。例如:httpd 守护进程(Daemon)启动 apache 服务的进程,守护进程就是服务在后台运行的真实进程。

守护进程

Linux系统上提供服务的程序是由运行在后台的守护进程(Daemon)来执行。一个实际运行中的Linux系统一般会有多个这样的程序在运行。这些后台守护进程在系统开机后就运行了,并且在时刻地监听前台客户地服务请求,一旦客户发出了服务请求,守护进程便为它们提供服务。Windows系统中的守护进程被称为 服务

按照服务类型,守护进程可以分为如下两类:

  • 系统守护进程:如 crond(周期任务)rsyslogd(日志服务)cpus等;
  • 网络守护进程:如 sshdhttpdxinetd(托管)等。

系统守护进程

系统初始化进程是一个特殊的的守护进程,其PID为1,它是所有其他守护进程的父进程或者祖先进程。也就是说,系统上所有的守护进程都是由系统初始化进程进行管理的(如启动、停止等)。

在Linux的发展历史过程中,使用过3种Linux初始化系统。

SysVinit

为 UNIX System V 系统创建的;
RHEL/CentOS 5及之前的版本一直使用。

Upstart

由Ubuntu创建的;
RHEL/CentOS 6 使用Upstart。

Systemd

先进的初始化系统;
RHEL/CentOS 7使用Systemd。

独立启动的守护进程:stand-alone,每个特定服务都有单独的守护进程,这个处理单一服务的始终存在的进程就是独立启动的守护进程。
超级守护进程:多个服务统一由一个进程管理,该进程可以管理多个服务。
Xinetd:即 extended internet daemon,是新一代的网络守护进程服务程序,又叫超级Internet服务器,常用来管理多种轻量级Internet服务。Xinetd提供类似于 inetd+tcp_wrapper 的功能,但是更加强大和安全。

服务分类

Linux 中的服务按照安装方法不同可以分为 RPM 包默认安装的服务源码包安装 的服务两大类。其中,RPM 包默认安装的服务又因为启动与自启动管理方法不同,分为 独立的服务基于 xinetd 的服务 。服务分类的关系图,如图所示

2-1Q02413195AP.jpg

Linux 中常见的软件包有两种:

  • 一种是 RPM 包;
  • 另一种是源码包。

通过 RPM 包安装 的系统服务就是 RPM 包默认安装的服务(因为 Linux 光盘中全是 RPM 包,Linux 系统也是通过 RPM 包安装的,所以我们把 RPM 包又叫作 系统默认包 ),
通过 源码包安装 的系统服务就是源码包安装的服务。

特点

  • 源码包是开源的,自定义性强,通过编译安装更加适合系统,但是安装速度较慢,编译时容易报错。
  • RPM 包是经过编译的软件包,安装更快速,不易报错,但不再是开源的。

区别

最主要的区别就是安装位置不同,源码包安装到我们手工指定的位置当中,而 RPM 包安装到系统默认位置当中(可以通过 rpm -ql 包名 命令查询)。

也就是说,RPM 包安装到系统默认位置,可以被服务管理命令识别;但是源码包安装到手工指定位置,当然就不能被服务管理命令识别了(可以手工修改为被服务管理命令识别)。

所以,RPM 包默认安装的服务和源码包安装的服务的管理方法不同,我们把它们当成不同的服务分类。服务分类说明如下。

RPM 包默认安装的服务。这些服务是通过 RPM 包安装的,可以被服务管理命令识别。

这些服务又可以分为两种:

  • 独立的服务:就是独立启动的意思,这种服务可以自行启动,而不用依赖其他的管理服务。因为不依赖其他的管理服务,所以,当客户端请求访问时,独立的服务响应请求更快速。目前,Linux 中的大多数服务都是独立的服务,如 apache服务FTP服务Samba服务 等。

  • 基于 xinetd 的服务:这种服务就不能独立启动了,而要依靠管理服务来调用。这个负责管理的服务就是 xinetd 服务。xinetd 服务是系统的超级守护进程,其作用就是管理不能独立启动的服务。当有客户端请求时,先请求 xinetd 服务,由 xinetd 服务去唤醒相对应的服务。当客户端请求结束后,被唤醒的服务会关闭并释放资源。这样做的好处是只需要持续启动 xinetd 服务,而其他基于 xinetd 的服务只有在需要时才被启动,不会占用过多的服务器资源。但是这种服务由于在有客户端请求时才会被唤醒,所以响应时间相对较长。

源码包安装的服务: 这些服务是通过源码包安装的,所以安装位置都是手工指定的。由于不能被系统中的服务管理命令直接识别,所以这些服务的启动与自启动方法一般都是源码包设计好的。每个源码包的启动脚本都不一样,一般需要查看说明文档才能确定。

查询服务

区分已安装的服务

  • 源码包安装的服务是不能被服务管理命令直接找到的,而且一般会安装到 /usr/local/ 目录中。
  • RPM 包默认安装的服务都会安装到系统默认位置,所以是可以被服务管理命令(如 servicechkconfig)识别的。

区分RPM 包默认安装的独立的服务和基于 xinetd 的服务

chkconfig 是管理 RPM 包默认安装的服务的自启动的命令,这里仅利用这条命令的查看功能。使用这条命令还能看到 RPM 包默认安装的所有服务。命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 列出系统中RPM包默认安装的所有服务的自启动状态
chkconfig --list [服务名]
# 独立的服务
abrt-ccpp 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭
abrt-oops 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:启用 6:关闭
udev-post 0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
xinetd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
ypbind 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
# 基于 xinetd 的服务:
chargen-dgram:关闭
chargen-stream:关闭
cvs:关闭
daytime-dgram:关闭

选项:

  • –list:列出 RPM 包默认安装的所有服务的自启动状态;

在刚刚的独立的服务之下出现了一些基于 xinetd 的服务,这些服务没有自己的运行级别,因为它们不是独立的服务,到底在哪个运行级别可以自启动,则要看 xinetd 服务是在哪个运行级别自启动的。

注:在 Linux 中基于 xinetd 的服务越来越少,原先很多基于 xinetd 的服务在新版本的 Linux 中已经变成了独立的服务。

参考:

Linux系统服务及其分类

Linux进程概念

简介

xinetdextended internet daemon )是新一代的网络守护进程服务程序,又叫超级 Internet 服务器,常用来管理多种轻量级 Internet 服务。
xinetd提供类似于 inetd+tcp_wrapper 的功能,但是更加强大和安全。

基于 xinetd 的服务有启动管理和自启动管理之分,而且不管是启动管理还是自启动管理,都只有一种方法,相比独立的服务简单一些。

基于 xinetd 的服务没有自己独立的启动脚本程序,是需要依赖 xinetd 的启动脚本来启动的。xinetd 本身是独立的服务,所以 xinetd 服务自己的启动方法和独立服务的启动方法是一致的。

特点

强大的存取控制功能

  • 内置对恶意用户和善意用户的差别待遇设定。
  • 使用libwrap支持,其效能更甚于tcpd。
  • 可以限制连接的等级,基于主机的连接数和基于服务的连接数。
  • 设置特定的连接时间。
  • 将某个服务设置到特定的主机以提供服务。

有效防止DoS攻击

  • 可以限制连接的等级。
  • 可以限制一个主机的最大连接数,从而防止某个主机独占某个服务。
  • 可以限制日志文件的大小,防止磁盘空间被填满。

强大的日志功能

  • 可以为每一个服务就syslog设定日志等级。
  • 如果不使用syslog,也可以为每个服务建立日志文件。
  • 可以记录请求的起止时间以决定对方的访问时间。
  • 可以记录试图非法访问的请求。

转向功能

可以将客户端的请求转发到另一台主机去处理。

支持IPv6

xinetd自 xinetd 2.1.8.8pre* 起的版本就支持IPv6,可以通过在./configure脚本中使用 with-inet6 capability 选项来完成。注意,要使这个生效,核心和网络必须支持IPv6。当然IPv4仍然被支持。

与客户端的交互功能

无论客户端请求是否成功,xinetd都会有提示告知连接状态。

Xinetd的缺点

当前,它最大的缺点是对RPC支持的不稳定性,但是可以启动protmap,使它与xinetd共存来解决这个问题。

使用xinetd启动守护进程

原则上任何系统服务都可以使用 xinetd ,然而最适合的应该是那些常用的网络服务,同时,这个服务的请求数目和频繁程度不会太高。像 DNSApache 就不适合采用这种方式,而像 FTPTelnetSSH 等就适合使用 xinetd 模式,系统默认使用 xinetd 的服务可以分为如下几类。

  • 标准Internet服务:telnet、ftp。
  • 信息服务:finger、netstat、systat。
  • 邮件服务:imap、imaps、pop2、pop3、pops。
  • RPC服务:rquotad、rstatd、rusersd、sprayd、walld。
  • BSD服务:comsat、exec、login、ntalk、shell、talk。
  • 内部服务:chargen、daytime、echo、servers、services、time。
  • 安全服务:irc。
  • 其他服务:name、tftp、uucp。

具体可以使用 xinetd 的服务在 /etc/services 文件中指出。这个文件的节选内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
# /etc/services:
# $Id: services,v 1.40 2004/09/23 05:45:18 notting Exp $
# service-name port/protocol [aliases ...] [# comment]
tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null

Internet网络服务文件中,记录网络服务名和它们对应使用的端口号及协议。文件中的每一行对应一种服务,它由4个字段组成,中间用Tab键或空格键分隔,分别表示 服务名称使用端口协议名称别名

在一般情况下,不要修改该文件的内容,因为这些设置都是Internet标准的设置。一旦修改,可能会造成系统冲突,使用户无法正常访问资源。Linux系统的端口号的范围为 0~65535,不同范围的端口号有不同的意义。

  • 0:不使用。
  • 1~1 023:系统保留,只能由root用户使用。
  • 1 024~4 999:由客户端程序自由分配。
  • 5 000~65 535:由服务器程序自由分配。

/etc/xinetd.conf和/etc/xinetd.d/*

/etc/xinetd.conf

xinetd的配置文件是/etc/xinetd.conf,但是它只包括几个默认值及/etc/xinetd.d目录中的配置文件。如果要启用或禁用某项xinetd服务,编辑位于/etc/xinetd.d目录中的配置文件。

/etc/xinetd.conf 有许多选项,下面是RHEL 4.0的 /etc/xinetd.conf

1
2
3
4
5
6
7
8
9
10
11
# Simple configuration file for xinetd
# Some defaults, and include /etc/xinetd.d/
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}
includedir /etc/xinetd.d
  • instances = 60:表示最大连接进程数为60个。
  • log_type = SYSLOG authpriv:表示使用syslog进行服务登记。
  • log_on_success= HOST PID:表示设置成功后记录客户机的IP地址的进程ID。
  • log_on_failure = HOST:表示设置失败后记录客户机的IP地址。
  • cps = 25 30:表示每秒25个入站连接,如果超过限制,则等待30秒。主要用于对付拒绝服务攻击。
  • includedir /etc/xinetd.d:表示告诉xinetd要包含的文件或目录是/etc/xinetd.d。

/etc/xinetd.d/*

下面以 /etc/xinetd.d/ 中的一个文件(rsync)为例。

1
2
3
4
5
6
7
8
9
service rsync
{
disable = yes
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
log_on_failure += USERID
}

下面说明每一行选项的含义。

  • disable = yes:表示禁用这个服务。
  • socket_type = stream:表示服务的数据包类型为stream。
  • wait = no:表示不需等待,即服务将以多线程的方式运行。
  • user = root:表示执行此服务进程的用户是root。
  • server = /usr/bin/rsync:启动脚本的位置。
  • log_on_failure += USERID:表示设置失败时,UID添加到系统登记表。

配置xinetd

格式:

/etc/xinetd.conf 中的每一项具有下列形式:

1
2
3
4
service service-name
{
……
}

其中 service 是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由 service-name 定义的服务。

service-name 是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括 localhost 自身发出的网络请求。有很多可以使用的属性,稍后将描述必需的属性和属性的使用规则。

操作符可以是=、+=或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。

配置文件

相关的配置文件如下:

1
2
3
4
/etc/xinetd.conf
/etc/xinetd.d/* //该目录下的所有文件
/etc/hosts.allow
/etc/hosts.deny

disabled与enabled

前者的参数是禁用的服务列表,后者的参数是启用的服务列表。他们的共同点是格式相同(属性名、服务名列表与服务中间用空格分开,例如 disabled = in.tftpd in.rexecd ),此外,它们都是作用于全局的。如果在disabled列表中被指定,那么无论包含在列表中的服务是否有配置文件和如何设置,都将被禁用;如果enabled列表被指定,那么只有列表中的服务才可启动,如果enabled没有被指定,那么disabled指定的服务之外的所有服务都可以启动。

注意问题

  • 在重新配置的时候,下列的属性不能被改变:socket_typewaitprotocoltype
  • 如果 only_fromno_access 属性没有被指定(无论在服务项中直接指定还是通过默认项指定),那么对该服务的访问IP将没有限制;
  • 地址校验是针对IP地址而不是针对域名地址。

xinetd防止拒绝服务攻击(Denial of Services)的原因

  • 限制同时运行的进程数

通过设置instances选项设定同时运行的并发进程数:

instances=20

当服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。

  • 限制一个IP地址的最大连接数

通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。

per_source=5

这里每个IP地址的连接数是5个。

  • 限制日志文件大小,防止磁盘空间被填满

许多攻击者知道大多数服务需要写入日志。入侵者可以构造大量的错误信息并发送出来,服务器记录这些错误,可能就造成日志文件非常庞大,甚至会塞满硬盘。同时会让管理员面对大量的日志,而不能发现入侵者真正的入侵途径。因此,限制日志文件大小是防范拒绝服务攻击的一个方法。

log_type FILE.1 /var/log/myservice.log 8388608 15728640

这里设置的日志文件FILE.1临界值为8MB,到达此值时,syslog文件会出现告警,到达15MB,系统会停止所有使用这个日志系统的服务。

  • 限制负载

xinetd还可以使用限制负载的方法防范拒绝服务攻击。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接。

max_load = 2.8

上面的设定表示当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。

说明 要使用这个选项,编译时应加入 --with-loadavg ,xinetd将处理 max-load 配置选项,从而在系统负载过重时关闭某些服务进程,来实现防范某些拒绝服务攻击。

  • 限制所有服务器数目(连接速率)

xinetd可以使用cps选项设定连接速率,下面的例子:

cps = 25 60

上面的设定表示服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。

  • 限制对硬件资源的利用

通过rlimit_as和rlimit_cpu两个选项可以有效地限制一种服务对内存、中央处理器的资源占用:

1
2
rlimit_as = 8M
rlimit_cpu=20

上面的设定表示对服务器硬件资源占用的限制,最多可用内存为8MB,CPU每秒处理20个进程。

xinetd的一个重要功能是它能够控制从属服务可以利用的资源量,通过它的以上设置可以达到这个目的,有助于防止某个xinetd服务占用大量资源,从而导致“拒绝服务”情况的出现。

参考:

什么是Xinetd

CentOS 7.3 Xinetd服务的安装与配置

Linux之Xinetd服务介绍

Linux基于xinetd服务的管理方法详解

查看SELinux状态

1
2
3
4
5
6
# 1, 如果SELinux status参数为enabled即为开启状态
/usr/sbin/sestatus -v
SELinux status: enabled

# 2,也可以用这个命令检查
getenforce

关闭SELinux方法

临时关闭(不用重启机器)

1
2
3
4
5
# 设置SELinux 成为permissive模式
setenforce 0

# 设置SELinux 成为enforcing模式
#setenforce 1

修改配置文件(需要重启机器)

修改 /etc/selinux/config 文件

SELINUX=enforcing 改为 SELINUX=disabled

1
vim /etc/selinux/config

参考

Linux下查看SELinux状态和关闭SELinux的方法

简介

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。

语法

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
# 1,拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时,
# 就启动这种工作模式。
# rsync -a /data /backup
rsync [OPTION]... SRC DEST

# 2,使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。
# 当DST路径地址包含单个冒号":"分隔符时启动该模式。
# rsync -avz *.c foo:src
rsync [OPTION]... SRC [USER@]host:DEST

# 3,使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。
# 当SRC地址路径包含单个冒号":"分隔符时启动该模式。
# rsync -avz foo:src/bar /data
rsync [OPTION]... [USER@]HOST:SRC DEST

# 4,从远程rsync服务器中拷贝文件到本地机。
# 当SRC路径信息包含"::"分隔符时启动该模式。
# rsync -av root@192.168.78.192::www /databack
rsync [OPTION]... [USER@]HOST::SRC DEST

# 从本地机器拷贝文件到远程rsync服务器中。
# 当DST路径信息包含"::"分隔符时启动该模式。
# rsync -av /databack root@192.168.78.192::www
rsync [OPTION]... SRC [USER@]HOST::DEST

# 列出远程机的文件列表。
# 这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
# rsync -v rsync://192.168.78.192/www
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

选项

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
-v, --verbose 详细模式输出。
-q, --quiet 精简输出模式。
-c, --checksum 打开校验开关,强制对文件传输进行校验。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive 对子目录以递归模式处理。
-R, --relative 使用相对路径信息。
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links 保留软链结。
-L, --copy-links 想对待常规文件一样处理软链结。
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links 忽略指向SRC路径目录树以外的链结。
-H, --hard-links 保留硬链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-D, --devices 保持设备文件信息。
-t, --times 保持文件时间信息。
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间。
-n, --dry-run现实哪些文件将被传输。
-w, --whole-file 拷贝文件,不进行增量检测。
-x, --one-file-system 不要跨越文件系统边界。
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete 删除那些DST中SRC没有的文件。
--delete-excluded 同样删除接收端那些被该选项指定排除的文件。
--delete-after 传输结束以后再删除。
--ignore-errors 及时出现IO错误也进行删除。
--max-delete=NUM 最多删除NUM个文件。
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force 强制删除目录,即使不为空。
--numeric-ids 不将数字的用户和组id匹配为用户名和组名。
--timeout=time ip超时时间,单位为秒。
-I, --ignore-times 不跳过那些有同样的时间和长度的文件。
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR 在DIR中创建临时文件。
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份。
-P 等同于 --partial。
--progress 显示备份过程。
-z, --compress 对备份的文件在传输时进行压缩处理。
--exclude=PATTERN 指定排除不需要传输的文件模式。
--include=PATTERN 指定不排除而需要传输的文件模式。
--exclude-from=FILE 排除FILE中指定模式的文件。
--include-from=FILE 不排除FILE指定模式匹配的文件。
--version 打印版本信息。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--blocking-io 对远程shell使用阻塞IO。
-stats 给出某些文件的传输状态。
--progress 在传输时现实传输过程。
--log-format=formAT 指定日志文件格式。
--password-file=FILE 从FILE中得到密码。
--bwlimit=KBPS 限制I/O带宽,KBytes per second。
-h, --help 显示帮助信息。

实例

SSH方式

首先在服务端确定ssh服务状态:

1
2
3
4
5
# 查看状态
service sshd status

# 启动
service sshd start

使用rsync进行同步

SSH方式是通过系统用户来进行备份的,如下,描述了整个的备份过程,以及总共备份数据的大小:

1
2
rsync -vzrtopg --progress -e ssh --delete work@172.16.78.192:/www/* /databack/experiment/rsync
work@172.16.78.192's password:

后台服务方式

启动rsync服务,编辑 /etc/xinetd.d/rsync 文件,将其中的 disable=yes 改为 disable=no ,并重启 xinetd 服务,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/xinetd.d/rsync

#default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync {
disable = no
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}

重启 xinetd:

1
2
3
/etc/init.d/xinetd restart
Stopping xinetd: [ OK ]
Starting xinetd: [ OK ]

创建配置文件,默认安装好rsync程序后,并不会自动创建rsync的主配置文件,需要手工来创建,其主配置文件为 /etc/rsyncd.conf ,创建该文件并插入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
touch /etc/rsyncd.conf
vim /etc/rsyncd.conf

uid=root
gid=root
max connections=4
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.passwd
hosts deny=172.16.78.0/22

[www]
comment= backup web
path=/www
read only = no
exclude=test
auth users=work

创建密码文件,采用这种方式不能使用系统用户对客户端进行认证,所以需要创建一个密码文件,其格式为 username:password,用户名可以和密码可以随便定义,最好不要和系统帐户一致,同时要把创建的密码文件权限设置为600。

1
2
echo "work:abc123" > /etc/rsyncd.passwd
chmod 600 /etc/rsyncd.passwd

备份,完成以上工作,现在就可以对数据进行备份了,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
rsync -avz --progress --delete work@172.16.78.192::www /databack/experiment/rsync

Password:
receiving file list ...
6 files to consider
./ files...
a
0 100% 0.00kB/s 528:20:41 (1, 50.0% of 6)
b
67 100% 65.43kB/s 0:00:00 (2, 66.7% of 6)
c
0 100% 0.00kB/s 528:20:41 (3, 83.3% of 6)
dd
100663296 100% 37.49MB/s 0:00:02 (4, 100.0% of 6)
sent 172 bytes received 98276 bytes 17899.64 bytes/sec
total size is 150995011 speedup is 1533.75

恢复,当服务器的数据出现问题时,那么这时就需要通过客户端的数据对服务端进行恢复,但前提是服务端允许客户端有写入权限,否则也不能在客户端直接对服务端进行恢复,使用rsync对数据进行恢复的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
rsync -avz --progress /databack/experiment/rsync/ work@172.16.78.192::www

Password:
building file list ...
6 files to consider
./
a
b
67 100% 0.00kB/s 0:00:00 (2, 66.7% of 6)
c
sent 258 bytes received 76 bytes 95.43 bytes/sec
total size is 150995011 speedup is 452080.87

参考:

rsync命令