第0章:CentOS7的安装与初始化配置

0.1 初识Linux

    很高兴大家选择我们的课程,从现在开始我们就要一起开启愉快的Linux之旅了!

    在我们开始正式学习Linux课程之前呢,我们需要对Linux有一个初步的了解。所以,首先我们要做的就是认识Liunx,揭开它的神秘面纱!

0.1.1 生活中的Linux身影

    也许我们曾经听说过或者接触过Linux,知道它是一种操作系统,而我们都知道操作系统是使计算机运行的基本程序和工具的集合,来支配计算机硬件来进行工作,如果我们的计算机没有安装操作系统的话那这台计算机是无法接收到我们的指令而进行工作的。

    提到操作系统可能在工作学习中大家比较熟悉的就是Windows操作系统了,还会有一部分人使用MAC OS,相对来说很少会有人将Linux操作系统安装在个人计算机上,甚至很多人都不知道Linux操作系统的存在。

    但是实际上,Linux已经渗透到我们生活中的方方面面了,在互联网世界中Liunx是无处不在的。举个简单的例子,现在我们出门的时候可以不带钱,但是肯定不会忘记带手机,现在几乎每人都会至少有一部智能手机,我们都知道手机大多数使用的系统都是安卓系统,但是你可能不知道,安卓系统其实也是Linux操作系统中的一员。因为我们平时所说的Liunx操作系统实际上指的是那些内核为Liunx的操作系统。

    一个完整的Linux操作系统除了内核之外还需要有Shell、文件系统和应用程序。

在整个Linux操作系统中,内核(Kernel)是系统的心脏,实现操作系统的基本功能。在硬件方面可以控制硬件设备,管理内存,提供硬件接口,处理基本I/O。在软件方面可以管理文件系统,为程序分配内存和CPU时间等。而Shell是系统的用户界面,提供用户与内核进行交互操作的一种接口。它解释由用户输入的命令并且把它们送到内核执行。标准的Linux系统都有一套称为应用程序的程序集,包括文本编辑器、编程语言、办公套件、Internet工具、数据库等。当然,还可以有用户自己编写的具有特定功能的应用程序。文件系统则是文件存放在磁盘等存储设备上的组织方法。通常是按照目录层次的方式进行组织。每个目录可以包括多个子目录以及文件,系统以“/”为根目录。系统中的所有数据都存储在文件系统上以便用户读取、查询和写入。Linux能支持多种目前流行的文件系统,如ext2、ext3、ext4、fat、vfat、ISO9660、nfs等。而安卓系统使用的则是Linux的内核,所以我们说安卓系统也是Linux操作系统中的一员。

    那除了刚才我们所说的手机之外我们生活中还有很多娱乐影音设备如:平板电视,视频游戏控制器等使用的也是Liunx操作系统,还有像我们平时访问的百度,淘宝,谷歌等网站的服务器上绝大多数使用的也是Linux操作系统,还有世界上百分之九十的超级计算机也是使用的Linux操作系统。所以说现在Liunx已经渗透到我们生活中的方方面面了,只不过平时我们对它了解的比较少所有忽略了它的存在。

0.1.2 Linux系统的优势

    那么接下来呢我们就需要探索一下Linux为什么会在各个领域得到广泛应用:

    第一点:跨平台的硬件支持

    Linux是一种可移植的操作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。从个人电脑到大型主机,甚至包括嵌入式系统在内的各种硬件设备都可以支持。

    第二点:多用户多任务

    Linux操作系统允许多用户以本地登陆或远程连接的方式同时登陆操作系统对属于自己的资源进行读写等操作而互不影响。多任务是现代计算机的最主要的一个特点,在Linux系统上也可以同时执行多个程序,而同时各个程序的运行互相独立。

    第三点:可靠的安全性

    Linux采取了许多安全技术措施,包括对读、写控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。

    第四点:良好的稳定性

    Linux 内核的源代码是以标准规范的32 位(在64 位CPU上是64 位)的计算机来做的最佳化设计,可确保其系统的稳定性。所以使得一些安装 Linux 的主机可以常年不关而不宕机。

    第五点:完善的网络功能

    Linux 内置了很丰富的免费网络服务器软件、数据库和网页的开发工具,如Apache、Sendmail、VSFtp、SSH、MySQL、PHP和JSP 等。近年来,越来越多的企业看到了Linux 的这些强大的功能,利用Linux 担任全方位的网络服务器。

    除了这些Linux还有一个最大的特点就是开源,免费。Linux的源代码是开放的可以被任何人获取和使用,还可以根据自身需求进行定制并重新发布。

0.1.3 Linux的诞生

    那么如此强大的Linux是如何诞生的呢?

    提到Linux的诞生我们需要感谢两个人。一个是Linus Torvalds,他被成为Linux之父,Linux内核便是他开发的。在1991年8月Linus还是芬兰赫尔辛基大学的一名学生他对Minix产生了兴趣,Minix是一个开源的类UNIX系统,是赫尔辛基大学教授为课程教学而开发的,Linus想开发一个类似Minix的操作系统,用在他自己的计算机上,在1991年9月,Linus在互联网上发布了Linux版本为0.0.1,从严格意义上来说,Linux0.0.1并不是一个完整的操作系统,它只是一个操作系统的内核,只有一个内核用户是什么都做不了的,那么这个问题是如何解决的呢?这就要提到另外一个人Richard Stallman,他是自由软件运动的发起人,开发了许多Linux重要的基础应用,被称为自由软件之父。在1983年春天麻省理工人工智能实验室的程序员Richard Stallman深深的觉得UNIX商业软件极大的束缚了开发者和软件用户,有背软件自由的本意,因此他发起了GNU(自由软件运动)项目,旨在开发一个自由的类UNIX操作系统,GNU项目的创立标志着自由软件运动的开始。在1985年10月他又创立了自由软件基金会,在自由软件基金会的支持下到1991年很多GNU工具都被开发出来了,包括强大的GCC编译器和GDB调试器等等。但是建立一个自由的操作系统还差一个必不可少的一部分,那就是自由的内核,就在这时Linux0.0.1发布了,在1992年结合了Linux内核和GNU软件的Linux正式诞生了,其名称为GNU/Linux,简称Linux,经过不断发展到今天Linux已经是一个非常成熟先进的操作系统了。现在的Linux是由一些非营利性基金如自由软件基金会,相关公司如红帽公司也包括Linux开发社区组织如CentOS社区还包括许多Linux爱好者共同开发和维护。正因为有如此强大的开发团队Linux的更新速度也是非常快的,平均2-3个月Linux核心就会推出一个新的版本。

    随着Linux内核的发展各个组织和公司都推出了自己的发行版本。这些发行版本可能存在较大的差异,但是并不是内核差异,而是表现在外部程序上和各自的侧重点不同,目前Linux发行版本就有数百个。

01-centos7安装与管理命令

第一章:centos7安装与管理命令

1.1 centos7安装:

Install CentOS 7 #安装CentOS 7

Test this media & install CentOS  7 #测试安装文件并安装CentOS  7

Troubleshooting #故障修复

请选择第一项安装Centos7

选择语言:中文-简体中文(中国)

1.2 软件包定制

继续 下一步选择 “软件选择(s)” 选择“GNOME桌面” 与 “开发工具” 点击完成。

软件选择注解:

最小安装(Minimal Install)

这个选项只提供运行CentOS 的基本软件包。最小安装为单一目的服务器提供基本需要,并可在这样的安装中最大化性能和安全性。

基础设施服务器(Infrastructure Server)

这个选项提供在服务器中使用的CentOS 基本安装,不包含桌面。

文件及打印服务器(File and Print Server)

用于企业的文件、打印及存储服务器。

基本网页服务器(Basic Web Server)

基本系统平台,加上PHP,Web server,还有MySQL和PostgreSQL数据库的客户端,无桌面。

虚拟化主机(Virtualization Host)

这个选项提供 KVM 和 Virtual Machine Manager 工具以创建用于虚拟机器的主机。

带GUI的服务器(Server with GUI)

带有用于操作网络基础设施服务GUI的服务器。

GNOME桌面(GNOME Desktop)

GNOME是一个非常直观且用户友好的桌面环境。

KDE Pasma Workspaces(KDE桌面)

一个高度可配置图形用户界面,其中包括面板、桌面、系统图标以及桌面向导和很多功能强大的KDE应用程序。

开发及生成工作站(Development and Creative Workstation)

这个选项提供CentOS 编译软件所需的工具。

如果使用文本模式安装Linux,将不能进行软件包选择。安装程序只能自动从基本和核心组群中选择软件包。这些软件包足以保证系统在安装完成后可操作,并可安装更新和新的软件包。要更改软件包选择,需要在完成安装后,使用 Add/Remove Software 程序安装。

1.3 磁盘分区

继续选择 安装位置(D)。我要配置分区-点击 完成。

1.3.1 创建/boot分区

1.3.2 centos7方案:
/boot:boot分区设备类型,必须为标准分区。用来存放与Linux系统启动相关的程序,比如启动引导装载程序grub等,建议大小为500MB。

 

其他分区为了方便存储大数据充分利用磁盘资源,设备类型必须为lvm, 文件系统类型为xfs, 我自定义卷组名为“zhangbin”。


/usr :用来存放Linux系统的内核文件,其相关数据较多,建议大于6GB以上。

/usr/local: 用来存放Linu应用程序文件 建议大于6GB以上。
/var :用来存放Linux系统中经常变化的数据以及日志文件,建议大于4GB以上。
/home:存放普通用户的数据,是普通用户的宿主目录,建议根据业务需要分配大小。
/ :Linux系统的根目录,所有的目录都挂在这个目录下面,建议大小为6GB以上。
/tmp:将临时分区独立分割,可避免在文件系统被塞满时影响到系统的稳定性。建议大小为2G以上。
swap:实现虚拟内存,建议大小是物理内存的1~2倍。

1.3.3手动分区 注解:

名称(Name):分配一个名称,一个LVM或Btrfs的量。需要注意的是boot标准分区自动命名不能被编辑,如/boot被分配的名称sda1。

挂载点(Mount point):输入分区的挂载点。例如,如果分区是根分区,输入/;启动boot分区输入/ boot,依此类推。对于一个交换分区,挂载点不需要设置 – 只要设置文件系统类型交换就足够了。

标签(Label):分配一个标签的分区。标签更容易地识别分区。

所需的容量(Desired capacity):输入的分区的所需尺寸。可以使用普通大小的单位,如千字节,兆字节,GB或TB。兆是默认选项。

设备类型(Device type):标准分区,BTRFS,LVM或LVM精简配置之间进行选择。如果被选择的分区分隔在两个或多个磁盘上,RAID也是可用的。检查相邻的加密框,分区加密。系统将提示您以后设置密码。

下面是设备类型简短描述,以及它们是如何被使用:

标准分区:标准分区可以包含文件系统或交换空间。

逻辑卷(LVM):创建一个LVM分区自动生成一个LVM逻辑卷。 LVM可以提高物理磁盘利用率。

LVM精简配置:使用自动精简配置,可以管理自由空间,被称为精简池,它可以根据需要,由应用程序可以分配给设备任意数量的存储池。所需的存储空间具有成本效益的分配时,薄池可以动态地扩展。

BTRFS:它在处理大文件和大体积数据要比的ext2,ext3和ext4 甚至是xfs文件系统更有优势。缺点是稳定性相对略差。

软件RAID:创建两个或两个以上的软件RAID分区,就可以创建RAID设备。一个RAID分区被分配到不同的磁盘上。

文件系统(File system ):在下拉菜单中,选择该分区中的相应的文件系统类型。检查相邻的格式化对话框 格式化现有的分区,或将其选中保留。

下面是文件系统的描述,以及它们是如何被使用:

XFS:XFS是一个支持的文件系统多达16艾字节(约16万TB)的高度可扩展,高性能的文件系统.子目录结构支持上千万条目。 XFS支持元数据日志,有利于更快的崩溃恢复。 除此之外XFS文件系统也可以进行碎片整理和调整。这个文件系统是默认选择,并强烈推荐。单个XFS分区可以支持到500 TB大小。

EXT4:ext4文件系统是基于ext3文件系统,并采用了多项改进。这些措施包括对更大文件系统和更大的文件,磁盘空间,子目录的目录中的数量的限制,更快的文件系统检查速度更快,更有效地分配支持,更强大的日志记录 和可操控性。

EXT3:ext3文件系统是基于ext2文件系统上,它有一个主要优点。使用文件系统减少花费的时间恢复崩溃后的文件系统,因为没有必要通过每次碰撞发生时运行fsck实用程序来检查元数据的一致性的文件系统。

EXT2:ext2文件系统支持标准Unix文件类型,包括普通文件,目录或符号链接。它还提供了分派长文件名,最多255个字符的能力。

VFAT:VFAT文件系统是Linux文件系统与FAT文件系统上的Microsoft Windows长文件名兼容。

swap:交换分区被用于支持虚拟内存。换句话说,数据被写入到交换分区的时候没有足够的内存来存储您的系统正在处理的数据。

BIOS boot:需要有一个GUID分区表(GPT)在BIOS中的系统引导设备一个非常小的分区。

EFI系统分区:需要有一个GUID分区表(GPT)在UEFI系统引导装置一个小分区。

1.4 配置网络与设置用户密码

完成 接受更改-开始安装。设置root用户密码 并创建用户。安装完后重启系统。

登陆root,链接网络配置有线网卡为on.主机会通过dhcp获得ip地址。

或者是右上角 右击 网络设置-有线-配置 -ipv4 设置网络。

另外还需要选择,认证选项- 勾选自动链接,否则服务器网络不会自动启用。

然后使用 systemctl restart network.service 命令来重新启动网络使设置生效。

1.5系统更新

请确定主机可以访问互联网。使用yum upgrade 或者 yum update 更新系统。

1.6系统初始配置

1.6.1安装必备的组件

yum install wget telnet perl perl-devel net-tools kernel-devel

安装这些组件之后会大大方便安装其他应用时碰到依赖关系的问题。其中net-tools是为了提供dig, nslookup, ifconfig等命令,方便配置CentOS 7初始化网络环境。如果不安装net-tools,在CentOS 7中,可以使用ip addr命令来代替ipconfig进行当前ip地址查询。

确认开发工具组已经安装 否则需要使用 yum groupinstall "Development tools" -y进行安装。

1.6.2安装第三方软件源

安装epel与remi第三方软件源,为了避免软件冲突,可自行选择是否安装。也可以安装完成后关闭,需要时再开启安装源。

yum install epel-release.noarch

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

启用remi安装源,编辑remi.repo文件

vim /etc/yum.repos.d/remi.repo

[remi]

name=Les RPM de remi pour Enterprise Linux 7 – $basearch

#baseurl=http://rpms.famillecollet.com/enterprise/7/remi/$basearch/

mirrorlist=http://rpms.famillecollet.com/enterprise/7/remi/mirror

enabled=1 #enabled改为1, 0为关闭状态。

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

或者直接下载remi源安装即可。

rpm -ivh remi-release-7.rpm

为了安全起见先使用yum clean all 清除yum缓存与旧的数据包。再用yum update重新更新源。

添加多媒体源与fedora源可选,再生产环境中不建议安装多媒体源,同样也是避免软件版本冲突:

rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

fedora源: rpm -Uh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

ElRepo源(地址:http://elrepo.org/tiki/tiki-index.php):

        导入公钥:rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

        导入源:rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

yum 指定安装某个源下的软件的方法,为了避免rpm软件包冲突,该源也可以处于关闭状态 –enablerepo选项 就可以将其开启。

yum install nginx –enablerepo=epel

nginx是要安装的软件,epel是repo源的名字。
建议安装的时候尽量选择同一个源。因为不同的源安装的软件可能会有冲突。

例如安装nginx : yum install nginx –enablerepo=epel

本例是禁用所有的源,只应用epel源,在此源中查找并安装htop包

yum –disablerepo=\* –enablerepo=epel search htop

yum –disablerepo=\* –enablerepo=epel install htop

1.6.3 关闭CentOS 7的firewall防火墙

临时关闭防火墙服务的命令是systemctl stop firewalld.service。

stop只是临时停止防火墙服务器,重启系统后防火墙服务还会开启,要想永久关闭防火墙需要使用systemctl disable firewalld.service 命令永久关闭防火墙服务。

1.6.4修改CentOS 7网络设备名称:

在centos6系列的操作系统中,安装好系统后网卡名称为eth0 eth1 eth2……。但centos7版本的系统安装好系统后网卡名称为eno1777736。网卡名称可以修改成eth0,当然不修改也可以正常使用,个人习惯问题,我习惯把网卡名称改为eth0。

修改方法如下:

输入如下命令,进入对应目录,编辑文件:

vim /etc/sysconfig/grub

然后,往这个文件中添加“net.ifnames=0 biosdevname=0”内容,如下图所示:

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="rd.lvm.lv=zhangbin/root rd.lvm.lv=zhangbin/swap rhgb quiet net.ifnames=0 biosdevname=0"

GRUB_DISABLE_RECOVERY="true"

执行如下命令更新grub使设置生效

grub2-mkconfig -o /boot/grub2/grub.cfg

NetworkManager 是linux的图形界面管理网络的工具,它支持无线,但是在工作中一般都用network来配置网络,所以可以把NetworkManager关闭(可选)。

命令如下:

关闭NetworkManager.service

临时关闭:systemctl stop NetworkManager.service

永久关闭:systemctl disable NetworkManager.service

1.6.5修改网卡配置文件

cd /etc/sysconfig/network-scripts/

mv ifcfg-eno16777736 ifcfg-eth0

vim ifcfg-eth0

TYPE=Ethernet

BOOTPROTO=none

DEFROUTE=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=no

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_FAILURE_FATAL=no

DEVICE=eth0

ONBOOT=yes

IPADDR=192.168.1.200

PREFIX=24

重启系统初始服务命令为reboot

1.6.6 删除kvm nat网络

需要删除kvm默认网络,因为它会影响物理机防火墙规则。在本书的实验中不会用到kvm的nat网络,所以可以删除。

先使用virsh net-list查看所有的虚拟网络:

使用virsh net-list可以列出kvm虚拟网络,会看到default的网络,然后将其删掉

执行以下两个命令:

virsh net-destroy default 摧毁网络,但是重启libvirtd服务会恢复

virsh net-undefine default 彻底删除,重启系统后不会恢复

1.6.7 debian/ubuntu系统注意事项

如果安装的是debian /ubuntu系统 root用户默认是不能登陆图形界面的。当然这是为了让系统更加安全。如果你觉得这样在学习过程中不是很方便。可以修改它的设置让root用户可以登陆。配置方法如下:

Debian桌面环境默认不允许root登录,所以需要修改配置。

一、让Debian可以使用root登录

1)首先修改gdm3的设定文件(/etc/gdm3/daemon.conf),在[security]字段后面追加如下一行:

[security]

AllowRoot = true

2)最后修改gdm3的登录pam文件:

vi /etc/pam.d/gdm-password

将auth required pam_succeed_if.so user != root quiet_success注释掉 在本行前加#,使之不生效。

二、让Debian以root自动登录

1)首先修改gdm3的设定文件(/etc/gdm3/daemon.conf),在[daemon]字段后面追加如下两行:

AutomaticLoginEnable =true 改为true

#AutomaticLogin =root 以root自动登录

如果想等几秒再登录,可以在[daemon]字段后面追加如下内容:

TimedLoginEnable = true

TimedLogin = root

TimedLoginDelay = 5 延迟5秒登录,可修改

2)最后修改gdm3的自动登录pam文件:

vi /etc/pam.d/gdm-autologin

将auth required pam_succeed_if.so user != root quiet_success注释掉。 在本行前加#,取消Debian不让root登录的限制。

重启系统即可生效。

1.7基本命令详解:

1.7.1 Linux服务器的维护与调试

lscpu #查看cpu

lsblk #显示硬盘布局 baobab

lspci | grep Ethernet #网卡型号

lspci | grep VGA #显卡型号

lspci | grep audio #声卡信息

lsusb #显示服务器usb接口数量

free #查看内存 ,free指令会显示内存的使用情况。包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等

-b  以Byte为单位显示内存使用情况。
 -k  以KB为单位显示内存使用情况。
 -m  以MB为单位显示内存使用情况。
 -o  不显示缓冲区调节列。
 -s<间隔秒数>  持续观察内存使用状况。
 -t  显示内存总和列。
 -V  显示版本信息。

cat /etc/redhat-release #查看系统发行版本

uname -r #显示内核版本

uname -n #显示主机名

1.7.2 服务器时钟

服务器时钟问题非常重要,因为关键点主机是不允许时间错误的。否则会导致一下三种后果。

1 网站反复注册

2 数据库数据回写

3 服务器后台无法登陆等

Cento7简单有效的应急解决办法:

设置服务器时钟为网络时钟

timedatectl set-ntp BOOL

这里的BOOL是yes或者no

1.7.3设置时区:

手动设置时区与时间的方法

查看系统所有的时区使用的命令是:

timedatectl list-timezones

Africa/Abidjan

Africa/Accra

Africa/Addis_Ababa

Africa/Algiers

Africa/Asmara

Africa/Bamako

Africa/Bangui

Africa/Banjul

Africa/Bissau

Africa/Blantyre

Africa/Brazzaville

Africa/Bujumbura

Africa/Cairo

……

timedatectl 显示时间与时区,只有在centos7中可以使用这个命令。

用以下命令设置时区:

timedatectl set-timezone time_zone

除了以上用法,timedatectl 还支持通过-H参数进行远程主机的时间设置。

Centos6版本之前的操作系统可以使用tzselect 来设置时区,centos7之后的版本设置时区都是使用timedatectl。

开启与关闭ntp自动同步时钟

timedatectl set-ntp true

timedatectl set-ntp false

timedatectl set-time 15:30 #设置系统时间

1.7.4 服务器系统时钟管理

在centos6之前的版本设置系统时钟需要使用date命令才可以。

date #查看服务器系统时钟

date -s "13:24" #设置时间

date -s "2018/10/11" #设置日期

date -s "2019/12/24 10:50" #同时设置时间与日期

hwclock –help #查看命令帮助

hwclock -s或–hctosys #从硬件时钟设置系统时间

hwclock -w 或–systohc #从当前系统时间设置硬件时钟

hwclock –set –date="03/19/2017 11:48" #设置硬件时钟的命令

1.7.5 服务器基本管理命令

1、关闭计算机的命令:

poweroff

init 0

halt

2、重启计算机的命令:

reboot

init 6

3、shutdown既可以关闭系统也可以重启系统

在Linux系统中每个命令都有很多选项。如何才能方便的记忆与使用这些选项呢?哪就需要掌握Linux帮助的使用方法了。

4、Linux 命令帮助

命令名 –help | more

显示一个简略的命令帮助(对大部分命令有效)。举个例子,试着使用 “cp help | more”。“–help”和和DOS下的“/h”开关功能类似。当输出超过一个屏幕时,加上“more”是很有必要的。

man 命令名 

显示对应命令系统的帮助手册。输入“q”退出浏览器。如果你设置了高级选项,试着输入“man man”。命令“info 命令名” 和命令“man 命令名”功能相似,但是包含更多的最新信息。帮助手册对于新手可能有点难于读懂,因为它们最初是写来给UNIX程序员看的。使用“命令名 –help”可以得到一个简略容易消化的命令帮助。有些程序自带README文件或者其他帮助信息文件—-建议你可以看看目录/usr/share /doc。在指定的部分显示命令帮助,可以使用这样的命令“man 3 exit”,这个命令只显示exit命令帮助手册的“第三部分”;或者使用命令“man –a exit”, 这个命令显示exit命令帮助手册的“所有部分”。exit命令帮助的所有部分是: 1-用户命令;2-系统调用;3-子调用;4-设备;5-文件格式;6-游戏;7-杂项;8-系统管理;9-新内容。打印完整的命令帮助,可以使用命令 “man 命令名 | col -b | lpr”(可选项col –-b删除所有的退格键和一些难以阅读的特殊字符)。

info 命令名

显示指定命令的帮助信息。info 命令取代man 命令的一个好处是,它通常带有最近更新的系统资料。多使用“空格键”和“退格键”,否则你可能会晕头转向。按“q”键退出。如果觉得用于翻阅的办法不太好用你也可以试着使用pinfo命令,看你会不会更喜欢这个替代品。

apropos 命令名

对所输入的命令名给出一个帮助一览表。

whatis 命令名

给出匹配所输入命令名的简短清单。whatis命令有点象apropos,它们使用相同的数据库。不同的是,whatis搜索的是关键字,apropos搜索的是关键字的具体描述。

例如:

shutdown –help –help可以寻求帮助,help只适用内部命令。

man shutdown #man适用于外部命令

info shutdown #info是man手册的扩展

shutdown -r now #立即重启

shutdown -r +1 -k "计算机将关闭,请保存未完成的配置!"

shutdown -r +1 -k "计算机将关闭,请保存未完成的配置!"

+1默认单位为分钟,当然业主支持小时 与天数,本例事设置一分钟之后重启系统。-k 提示信息。

shutdown -r 23:30 #指定特定时间重启系统

shutdown -p now #立即执行关机任务

shutdown -c  #取消关机任务

5、基本管理命令

cp 命令复制文件,格式为 cp [源文件路径] [目标文件路径] 对于新手来说需要注意的是, 路径中间要有空格分割。否则系统会认为是一个路径。以下内容就是一次错误复制的报错结果。把/root/initial-setup-ks.cfg文件复制到 /opt/目录下。源于目标路径之间没有空格将会出现以下错误。

[root@192 ~]# cp /root/initial-setup-ks.cfg/opt/

cp: 在"/root/initial-setup-ks.cfg/opt/" 后缺少了要操作的目标文件

由于本书重点不是讲解Linux基本命令,需要读者配合Linux的帮助或其他学习资料掌握以下基本命令的基本使用。

mv 移动或重命名

rm 删除文件

rm –rf 强制删除文件与目录

mkdir 建立空文件

rmdir 删除空目录

6、linux链接

Linux 系统中有软链接和硬链接两种特殊的“文件”。

软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。

硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。

创建方法都很简单:

软链接(符号链接) ln -s source target (使用绝对路径)

硬链接 (实体链接)ln source target (使用绝对路径)

要解释清楚两者的区别和联系需要先说清楚 linux 文件系统中的 inode 。当划分磁盘分区并格式化的时候,整个分区会被划分为两个部分,即inode区和data block(实际数据放置在数据区域中)这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个文件的 inode。 Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber, 其他信息还有创建时间(ctime)、修改时间(mtime) 、文件大小、属主、归属的用户组、读写权限、数据所在block号等信息。

7、硬链接与软链接的区别:

①硬链接原文件/链接文件公用一个inode号,说明他们是同一个文件,而软链接原文件/链接文件拥有不同的inode号,表明他们是两个不同的文件;

②在文件属性上软链接明确写出了是链接文件,而硬链接没有写出来,因为在本质上硬链接文件和原文件是完全平等关系;

③链接数目是不一样的,软链接的链接数目不会增加;

④文件大小是不一样的,硬链接文件显示的大小是跟原文件是一样的。而这里软链接显示的大小与原文件就不同了。

⑤软链接没有任何文件系统的限制,任何用户可以创建指向目录的符号链接

⑥硬链接只能给文件做链接,不能跨目录 跨分区。软链接可以为目录做链接,可以跨目录 跨分区。

1.7.6 linux 查找命令的使用

find 查找命令根据文件属性查找

实例:

find /etc/ -name “*.conf” –size +20K –exec du –a –k {} \; |sort –rn

find 查找 /etc/ 在/etc/目录下查找 –name 查找名称后缀是.conf的文件 –size 文件大小大于 20K 的, -exec 可以再执行其它命令 du 显示大小 ,{} 代表前面命令输出的结果给后边的命令执行。\;代表结束。

find /etc/ -name “*.conf” –size +20K –exec du –a –k {} \; -exec cp –Rf {} /opt/ \;

在/etc/下查找名字后缀是.conf的大于20K的文件,并复制到 /opt/下。

find命令安时间查找文件

在讲解按时间查找文件之前我们首先普及一下Linux文件时间属性的相关知识;

stat查看文件时间

时间属性说明:Access访问时间,Modify修改时间,Change状态改变时间。

modification time(mtime,修改时间):当该文件的“内容数据”更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性。 
status time(ctime,状态时间):当该文件的”状态(status)”改变时,就会更新这个时间,举例来说,更改了权限与属性,就会更新这个时间。 
access time(atime,存取时间):当“取用文件内容”时,就会更新这个读取时间。

通过ls举例:

ls参数里没有–mtime这个参数,因为我们默认通过ls -l查看到的时间就是mtime 。

通过touch命令修改文件时间

创建文件我们可以通过touch来创建。同样,我们也可以使用touch来修改文件时间。touch的相关参数如下:

-a : 仅修改access time。

-c : 仅修改时间,而不建立文件。

-d : 后面可以接日期,也可以使用 –date="日期或时间"

-m : 仅修改mtime。

-t : 后面可以接时间,格式为 [YYMMDDhhmm]

如果touch后面接一个已经存在的文件,则该文件的3个时间(atime/ctime/mtime)都会更新为当前时间。若该文件不存在,则会主动建立一个新的空文件。

利用touch修改文件时间:

1. 同时修改文件的修改时间和访问时间

2. 只修改文件的修改时间

touch -m -d "2015-12-24 08:10:30" install.log

3. 只修改文件的访问时间

touch -a -d "2015-12-31 08:10:30" install.log

下面再给一个rootkit木马常用的小技巧。就是把后一个文件的时间修改成和前一个相同。

touch -acmr /bin/ls /etc/sh.conf

此外touch还支持像date命令一样参数修改文件时间:

[root@web10 ~]# touch -d "2 days ago" install.log ; ll install.log

-rw-r–r– 1 root root 33386 07-11 16:35 install.log

总结下常用的文件操作与时间的关系:

1、访问时间,读一次这个文件的内容,这个时间就会更新。例如使用more命令。ls、stat命令都不会修改文件的访问时间。

2、修改时间,对文件内容修改就会更新。比如:vim后保存文件。ls -l列出的时间就是这个时间。

3、状态改变时间。通过chmod命令更改文件属性,就会更新。查看文件的详细的状态、准确的修改时间等,可以通过stat命令 文件名。

好现在以已经具备了时Linux间相关属性的知识,

下面我们讲find根据时间查找文件的方法:

find在/log下 查找`2016-08-08`到`2016-09-01`号之间的文件,使用如下命令即可:

find /log/ -name 'production.log-2016*' -newermt '2016-08-08' ! -newermt '2016-09-01

找出 3 天”以前”被改动过的文件 (前第三天以前 > 72 小时)
find /var/log/ -mtime +3 -type f –print

找出 3 天內被改动过的文件(0 ~ 72 小时內)
find /var/log/ -mtime -3 -type f -print

find /var/log/ -mtime 3 -type f -print
找出第 3 天被改动过的文件 (也可以这样写)
find /var/log/ -mtime +2 -mtime -4 -type f -print

1.7.7 whereis 文件查找命令

whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果不制定任何参数,则返回所有信息。 和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis时,会从数据库中查找数据,可以使用updatedb手动更新数据库,默认情况下时一星期更新一次,whereis有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有更新。


whereis -m svn查出说明文档路径,whereis -s svn找source源文件。
whereis –b 查找二进制(命令)文件路径

which 查找文件、显示命令路径

which是根据使用者所配置的 PATH 变量内的目录搜寻可运行档命令!所以,不同的 PATH 配置内容所找到的命令也会有所不同!

02-Linux存储管理

第二章存储管理

2.1 parted磁盘分区

2.1.1 parted简介

parted是linux下大的磁盘分区管理工具。使用parted命令可以对分区进行建立、修改、调整等操作。此外,你还可以用来检查磁盘使用状况,在不同的磁盘间复制数据,将一个磁盘完整复制到另一个磁盘的操作。

parted是一个磁盘分区管理工具,它比fdisk更加灵活,功能也更丰富,同时还支持GUID分区表(GUID Partition Table)

全局唯一标识分区表(GUID Partition Table,缩写GPT)是一个实体硬盘分区表的结构布局的标准。它是统一可扩展固件接口标准的一部分,它使用全局唯一标识来标识设备。它是新一代分区表格式,用以替代MBR分区表。它用来解决MBR分区表的缺点。

在超过2TB时,不能使用传统的交互操作很好的fdisk命令,只能把磁盘转化为GPT格式。由于GPT格式的磁盘相当于原来MBR磁盘中原来保留4个par-tition table的4*16个字节只留第一个16个字节,其它的类似于扩展分区,真正的partition tble在512字节之后,所以对GPT磁盘表来讲没有四个主分区的限制。

GPT磁盘分区样式支持最大卷为128EB(Exabytes),理论上讲每块磁盘的分区数没有上限,只受到操作系统限制(由于分区表本身需要占用一定空间,在redhat/centos系统中每块磁盘可以分配128个分区。)

对GPT磁盘分区表进行操作,我们要使用parted命令。其实parted功能很强大,它可以像fdisk一样既可以命令行也可以用于交互式,除了能够进行分区的添加、删除等常见操作外,还可以移动分区,制作文件系统,调整文件系统大小,复制文件系统。

2.1.2 parted常用命令讲解

parted –help

选项:

-h, –help 显示此求助信息

-l, –list 列出所有块设备上的分区布局

-m, –machine 机器可解析的输出显示

-s, –script 从不提示用户

-v, –version 显示版本

-a, –align=[none|cyl|min|opt] 新分区的对齐方式

命令:

mklabel,mktable LABEL-TYPE 创建一个新的标识

mkpart PART-TYPE [FS-TYPE] START END 创建一个分区

name NUMBER NAME 名称分区编号

print [devices|free|list,all|NUMBER] 显示分区表,可用设备、可用空间、所有已找到的分区或特定分区

rm NUMBER 删除分区

select DEVICE 选择要编辑的设备

disk_set FLAG STATE 更改选定设备上的标志

disk_toggle [FLAG] 切换选定的标志状态

set NUMBER FLAG STATE 更改分区编号的标志

配置实例1

创建一个普通分区:

首先添加一块新的硬盘,然后用echo “- – -” > /sys/class/scsi_host/host0/scan命令扫描新设备,让操作系统识别新添加的硬盘。使用lsblk可以看到我们新添加的硬盘sdb。

使用parted给新添加的第二块硬盘sdb分区

parted /dev/sdb

GNU Parted 1.8.1

Using /dev/sdb

Welcome to GNU Parted! Type ‘help’ to view a list of commands.

(parted) mklabel gpt #将MBR磁盘格式化为GPT

MBR:MBR分区表(即主引导记录)大家都很熟悉。所支持的最大卷2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区

GPT: GPT(即GUID分区表)。是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,具有如下优点。突破MBR4个主分区限制,每个磁盘最多支持128个分区。支持大于2T的分区,最大卷可达18EB.

(parted) mkpart primary 1 100 #划分一个起始位置为1大小为100M的主分区

(parted) mkpart primary 100 200 #划分一个起始位置为100M大小为100M的主分区

(parted) mkpart primary 0 -1 #划分所有空间到一个分区

忽略/Ignore/放弃/Cancel? i #提示下面警告,忽略继续即可输入i或者ignore

(parted) print #打印当前分区

(parted) quit #退出parted

分好区之后使用mkfs.xfs格式化

mkfs.xfs -f /dev/sdb1

格式化完成之后使用mount命令挂载使用。也可以使用umount卸载。

2.2 LVM卷管理

LVM是逻辑卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组 (volumegroup),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logicalvolumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:"development"和"sales",而不是使用物理磁盘名"sda"和"sdb"。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,是直接扩展文件系统跨越磁盘即可。

LVM结构图如下:

Pv(物理卷) –vg(卷组) –lv(逻辑卷)

配置实例1

如果你的卷组中有空闲空间,可以直接扩大现有的逻辑卷,以扩大home为例。

lvextend –L 2G /dev/mapper/JUNXI-home

扩大逻辑卷之后需要整理文件系统,这里需要注意,如果你的逻辑卷文件系统类型是ext4的,使用resize2fs /dev/mapper/JUNXI-home命令调整文件系统大小。如果你的逻辑卷文件系统类型是xfs的使用 xfs_growfs /dev/mapper/JUNXI-home 命令扩大文件系统。

配置实例2

创建新的卷组并在新创建的卷组中创建新的逻辑卷

首先添加新的磁盘,然后给新添加的磁盘分区,把新的分区创建成物理卷,使用的命令是pvcreate /dev/sdb1。

创建好pv之后,创建卷组,使用的命令是vgcreate –s 32M leilei /dev/sdb1

-s 可以指定PE(PE(Physical Extents 物理块)是pv的基本单元,具有唯一编号的PE,是LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。物理卷的大小等同的基本单元PE组成。每个卷组最多有65535个PE, 默认是4MB的话,卷组大小可以这样计 4*65535)所以pe越大卷组越大,修改PE大小时须注意它是2的幂次方,目前单个PE最大为128。这样的话,卷组越多(最多65535),pe越小,磁盘利用就会率越高。

创建好卷组之后,创建逻辑卷,命令为lvcreate –L 4G –n web leilei

-L指定逻辑卷的大小, -n 指定逻辑卷的名称。

接下来格式化逻辑卷,命令为mkfs.xfs /dev/junxi/web

创建挂载点,mkdir /web

把逻辑卷挂载使用,mount /dev/junxi/web /web

df –T /dev/junxi/web 可以查看文件系统类型。

配置实例3

逻辑卷的动态缩小

缩小有风险,在工作中不建议缩小,xfs文件系统只支持扩大,不支持缩小,只有ext4的文件系统支持缩小。

缩小逻辑卷分以下几个步骤(注意先后顺序)

首先卸载逻辑卷,使用的命令为umount /dev/mapper/JUNXI-home

然后使用e2fsck –f /dev/mapper/JUNXI-home 命令检查分区

然后使用 resize2fs /dev/mapper/JUNXI-home 2G 命令把文件系统缩减到2G

最后使用 lvreduce –L 2G /dev/mapper/JUNXI-home 命令把逻辑卷缩减到2G

缩减完成之后使用mount –a 重新挂载测试。

2.3开机自动挂载

获取/dev/leilei/web 设备的uuid,使用的命令是 blkid。

然后编辑/etc/fstab

添加如下选项:

vi /etc/fstab

UUID="472b68d4-dea9-4ee1-880a-e943a0d9f834"/opt xfs defaults

0 0

mount -a #测试挂载

2.3 逻辑卷创建快照

创建快照的命令为 lvcreate –L 2G –n homes –s /dev/JUNXI-home

-L 指定创建快照的大小,-n 指定快照的名称,-s 给哪个逻辑卷做快照。

2.4 Lvm之数据迁移

日常运维当中,建议使用lvm作为磁盘管理的工具,在这里介绍两个linux磁盘管理的使用技巧使大家了解lvm的强大。

pv迁移

在机房中,通常都会有一些比较老旧的存储服务器,利用pv迁移可以在线将旧存储上的数据迁移到新存储上,避免硬件故障导致数据丢失。

配置实例:

需求:把/dev/sdb 中的数据迁移到/dev/sdc中。/dev/sdb属于database卷组。

首先添加一块新的磁盘作为迁移的目标,添加好磁盘之后使用pvcreate /dev/sdc命令把新添加的磁盘创建成pv。

然后把pv 加入到database卷组中,使用vgextend database /dev/sdc 命令。

使用pvs查看,确认/dev/sdc已经属于database卷组。

然后使用pvmove /dev/sdb1 /dev/sdc命令进行数据迁移,迁移过程中可以正常读写数据。

迁移完成之后,再使用pvs 查看,你会发现,/dev/sdc剩余空间为16G,而/dev/sdb 剩余空间为20G。证明数据迁移成功。

然后就可以把旧的设备移除,使用的命令是vgreduce database /dev/sdb1。

2.5.1 SSM管理工具管理lvm卷

只适用于rhel7 centos7系统。

LVM逻辑卷的管理

需求描述:

当我们需要在一个100G的磁盘中存储120G的数据时,空间不够用,这时我们应该怎么办?

一般方法时,重新分区或者是在购买一个大点磁盘

但是,在服务器中,这是不现实的,如果该磁盘上运行着非常重要的服务呢?

传统磁盘管理的限制,因为其不能够进行动态的磁盘管理。

这时就用到了我们的LVM逻辑卷

LVM(Logical volume Manager)是逻辑卷管理的简称。

它是Linux环境下对磁盘分区进行管理的一种机制。

现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制,

对于其它的类UNIX操作系统,以及windows操作系统都有类似与LVM这种磁盘管理软件。

LVM逻辑卷可以对磁盘的大小实现动态调整。

lvm 逻辑卷的原理:它就是通过将底层的物理硬盘进行封装,然后以逻辑卷的形式呈现给上层应用。

当我们对磁盘进行操作时,实际上不是对分区进行操作,而是通过一个叫做逻辑卷的东西对其进行底层磁盘的操作

PE(Physical Extend),我们的LVM磁盘管理中PE的默认大小是4M大小,其实PE就是我们逻辑卷管理的最基本单位。

比如说我有一个400M的硬盘,那么在将其格式化成PV的时候,其实际就是将这块物理硬盘划分成了100个的PE,因为PE默认的大小就是4M。

PV(Physical Volume),物理卷 ,作用就是用来装PE的,普通磁盘被分割成多个PE块,最终形成PV(物理卷)

VG即卷组 作用就是用来装PV的,我们可以把一个或者多个PV加到VG当中

LV(Logical Volume),就是基于VG来创建我们最终要使用的LV。

2.5.2 SSM管理工具的使用

系统存储管理器(system-storage-manager) SSM ,是RHEL7新增加的功能,它是一种可以管理格式格式存储设备的命令。目前,有三种可以供SSM使用的卷管理后端:LVM、brtfs和crypt。

现在源里查找有没有这个安装包,如果有直接安装

安装ssm系统存储管理器 yum -y install system-storage-manager.noarch

使用ssm list命令检查关于可用硬驱和lvm卷的信息。这个命令将显示关于现有磁盘存储设备、存储池、LVM卷和存储快照的信息。以下输出结果是CentOS 7,自定义的LVM和XFS文件系统信息。

在这个实例中,有1物理设备/dev/sda、一个存储池(“JUNXI”),以及存储池中创建的3个LVM卷(“/dev/JUNXI/swap” “/dev/JUNXI/root” “/dev/JUNXI/home”)。

ssm list dev 或者 ssm list devices #显示设备

ssm list pool #显示卷组

ssm list vol 或者 ssm list volumes #则是只显示逻辑卷

将物理磁盘添加到LVM池不妨将一个新的物理磁盘(比如/dev/sdb)添加到现有的存储池JUNXI。将新的物理磁盘添加现有存储池的命令如下:

ssm add -p <pool-name> <device>

移除磁盘的命令是不需要加-p选型的

ssm remove <pool-name> <device>

首先给新设备分区

现在从传统的BIOS+MBR模式升级到UEFI+GPT模式,现在购买的主流服务器,为了更好的支持大于2TB硬盘,预装系统都采取了GPT分区的格式,并且主板bios支持UEFI启动。(UEFI统一扩展固件接口)

BIOS Basic Input/Output System,翻译成中文是“基本输入/输出系统”,是一种所谓的“固件”,负责在开机时做硬件启动和检测等工作,并且担任操作系统控制硬件的中介角色。

因为硬件发展迅速,传统式(Legacy)BIOS 成为进步的包袱,现在已经发展最新的UEFI(Unified Extensible Firmware Interface)统一可扩展固件接口,相比传统BIOS的来说,这将是一个“没有特定BIOS”的电脑时代

bios+mbr msdos 4个主分区 ext4 单个最大文件16TB 单个最大分区1EB

uefi+gpt gpt 不受限制 xfs 单个最大文件容量9EB 单个最大分区18EB

但是收到操作系统限制(由于分区表本身需要占用一定空间,最初规划硬盘分区时,留给分区表的空间决定了最多可以有多少分区目前linux128个)

XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes。他是取代ext4的下一代文件系统。

ssm list pools 查看卷组

ssm list dev 查看分区

ssm list vol 查看逻辑卷

创建一个分区sda3

parted /dev/sda

pvcreate /dev/sda3 创建Pv

通过ssm工具管理

ssm add -p JUNXI /dev/sda3 把pv添加JUNXI 的卷组中

ssm remove /dev/sda3 #把pv移除出JUNXI的卷组

ssm remove web #删除卷组

2.5.3扩大逻辑卷

扩大之前要保证JUNXI卷组中有空闲空间

ssm resize -s +2G /dev/mapper/JUNXI-home 扩大逻辑卷/减小逻辑卷

这并不意味着你立即就可以使用在卷中创建的文件系统里面增加的额外空间。你会发现,文件系统大小(“FS size”)仍然是3.99GB。为了让文件系统识别增加后的卷大小,你需要“扩大”现有的文件系统本身。有不同的工具可用来扩大现有的文件系统,这取决于你使用哪种文件系统。比如说,有面向EXT2/EXT3/EXT4的resize2fs、面向XFS的xfs_growfs以及面向Btrfs的btrfs,不一而论。

由于在centos7 中。XFS文件系统在默认情况下创建。因而,我们使用xfs_growfs来扩大现有的XFS文件系统。

扩大XFS文件系统后,核实文件系统完全占用了整个磁盘卷的5.99G,

方法如下:

xfs_growfs /dev/JUNXI/home

2.5.4 收缩lvm逻辑卷

缩小/home分区,resize 选后跟一个绝对值即可lvm就会调整到固定大小。目前xfs文件系统无法实现。只有ext4文件系统可以收缩。

ssm resize -s 3G /dev/JUNXI/home

2.5.5创建新卷组并格式化

在这个示例中,如何在物理磁盘驱动器上创建新的存储池和新的LVM卷。如果使用传统的LVM工具,整个过程相当复杂,需要准备分区,需要创建物理卷、卷组、逻辑卷,最后还要建立文件系统。不过,若使用ssm,整个过程就一蹴而就!

下面这个命令的作用是,创建一个名为dbs的存储池(卷组vg),在卷组中创建名为web大小为500MB的LV逻辑卷,使用XFS文件系统格式化卷,并将他挂载到/mnt/test下。立即就能领略到ssm的强大功能。

pvcreate /dev/sdb2 #添加新的分区,并创建成pv。

mkdir /mnt/test

ssm create -s 500M -n web –fstype xfs -p dbs /dev/sdb2 /mnt/test

-p 卷组名 -n 逻辑卷名 –s 大小 –fstype 文件系统类型。

实例讲解:ssm创建新的卷组dbs,并在新卷组中创建新逻辑卷web,完成各式化将其挂载到/mnt/目录下

ssm create -s 1G -n web –fstype xfs -p dbs /dev/sdb1 /mnt/。

实例讲解:创建新的逻辑卷web2格式化,并挂载到/opt目录下。

ssm create -n web2 -s 1G -p dbs –fstype xfs /opt/

ssm remove /dev/dbs/web2 #删除逻辑卷

2.5.6移除卷组的方法,首先要卸载挂载的设备。

umount /mnt/test/

ssm remove dbs #移除卷组即可,是不是很简单

2.5.7ssm管理lvm快照

使用ssm工具,你还可以对现有的磁盘卷拍取快照。注意:只有含有卷的后端支持快照机制,快照才适用。LVM后端支持联机快照功能,这意味着我们没必要在离线状态下对卷拍取快照。另外,由于ssm的LVM后端支持LVM2,快照具有读取/写入功能。

ssm snapshot -s 1G /dev/abc/web -n abc #为逻辑卷web创建快照名为abc,如果不制定名称与大小的话会产生随机快照名。-s指定快照大小 –n指定快照的名字。

ssm snapshot /dev/JUNXI/home

ssm list snapshots 或者 ssm list snap #查看当前卷组快照

ssm snapshot /dev/JUNXI/home #创建快照

储快照后,你可以删除原始卷,并挂载快照卷,以访问快照中的数据。

使用umount /home/ 卸载原始卷

使用mount /dev/JUNXI/snap20151021T224228 /home/ 挂载快照

删除LVM卷

删除现有的磁盘卷或存储池就跟创建磁盘卷或存储池一样容易。如果你试图删除已挂载的卷,ssm会自动先将它卸载。这方面没有麻烦。

删除LVM卷

ssm remove <volume>

想删除存储池(卷组):

ssm remove <pool-name>

至此应领略了ssm的强大功能。在企业存储环境中,处理一大批的存储设备、磁盘卷和文件系统是相当常见的事。现在你可以运用单单一个命令行工具ssm,让其后端为你完成任务,而不是操心运用许多不同的工具管理一整套存储配置。对任何置身于复杂存储管理环境的系统管理员来说,ssm绝对是一款必备工具。

Lvm常见故障排除:

很多新手学员在添加一个pv到vg后,误删新加入的pv,报 pv * not found or rejected by a filter错误。

使用lvdisplay报警告

[root@localhost ~]# lvdisplay 或 vgscan

WARNING: Device /dev/xvdb1 has size of 6291456 sectors which is smaller than corresponding PV size of 20969472 sectors. Was device resized?

One or more devices used as PVs in VG cl have changed sizes.

PV Name [unknown] #这里显示未知说明有问题

解决方法如下

方法1:从lvdisplay那里我们可以推测,vg有问题

所以我们来看一下卷组有哪些

可以看到vgs,vgscan都可以用来检查vg,其中vgremove和vgreduce和删除和缩减选项,所以我们重点关注vgreduce命令

尝试用removemissing选项删除错误信息 cl为卷组名称

vgreduce –removemissing cl

重启系统 再次使用vgdisplay可以恢复正常

方法2: 把卷组中报错的uuid复制出来 再次添加一个新的分区 在创建pv时指定uuid为丢失报错uuid "iUJdjw-C9S6-bRE7-jIdl-6kQ6-esLL-5vDGYE" 如下/dev/sdb1所示:

pvcreate /dev/sdb1 –u iUJdjw-C9S6-bRE7-jIdl-6kQ6-esLL-5vDGYE –norestorefile

也可以恢复正常

2.6 扩展swap分区

swap分区是虚拟内存对swap消耗比较大的应用有很多,例如:web服务器 数据库服务器 虚拟化与云计算等。运维有时需要对swap进行扩展的操纵。

首先使用free –m 查看我系统中swap分区的大小。

扩大swap分区的方法有两种,一种是以分区的方式扩大swap分区,一种是以镜像文件的方式扩大swap分区。首先介绍第一中方法:

需要有一个分区,来扩大swap分区的大小。创建好分区之后,使用mkswap命令格式化新的分区

mkswap /dev/sdb1

使用swapon /dev/sdb1 命令开启/dev/sdb1 swap分区,开启之后使用free –m 查看swap 分区的大小

也可以使用swapoff /dev/sdb1关闭。

可以使用cat /proc/swaps 查看新的分区启动情况。

如果想开机自动挂载的话需要编辑/etc/fstab中添加如下内容

/dev/sdb1 swap swap defaults 0 0

第二中扩大swap分区的方法:

因为服务器在某些特殊状态下不能再添加新的分区。也可以镜像文件的方式来添加swap分区。

先使用dd 命令创建一个大小为2G的镜像文件

dd if=/dev/zero of=/home/swap bs=2048MB count=1

镜像文件创建在/home/下,名称为swap,bs=2048M 一次写入2048MB,count=1只写一次,镜像文件的大小是2G。

创建好镜像文件之后把它格式化为swap文件系统类型。用mkswap /home/swap 命令,然后激活swap分区,使用swapon /home/swap。使用free –m查看swap的大小。

这里提到一个镜像文件,那什么是镜像文件?镜像文件是一种稀疏文件,在unix文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成空洞。位于文件中但没有写过的字节都被设为0。如果offset比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”在文件里创建“空洞(hole)”。没有被实际写入文件的所有字节由重复的0表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

2.7 Loop设备及losetup命令讲解

losetup命令用于循环设备。

循环设备可把文件虚拟成区块设备,籍以模拟整个文件系统,让用户得以将其视为硬盘驱动器,光驱或软驱等设备,并挂入当作目录来使用。

Loop设备介绍

在类unix系统里,loop设备是一种伪设备(pseudodevice),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。

在使用之前,一个loop设备必须要和一个镜像文件进行连接。这种结合方式给用户提供了一个替代块特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被mount起来。

在上面说的文件格式,我们经常见到的是CD或DVD的ISO光盘镜像文件或者是软盘(硬盘)的*.img镜像文件。通过这种loop mount(回环mount)的方式,这些镜像文件就可以被mount到当前文件系统的一个目录下。

Loop的含义

对于第一层文件系统,它直接安装在我们计算机的物理设备之上;而对于这种被mount起来的镜像文件(它引入包含有文件系统),它是建立在第一层文件系统上,这样看来,它就像是在第一层文件系统之上再绕了一圈的文件系统,所以称为loop。或者叫二层伪设备。

losetup命令讲解

losetup [-d][-e <加密方式>][-o <平移数目>][循环设备代号][文件]

参数:

-d 卸除设备

-e<加密方式> 启动加密编码

-o<平移数目> 设置数据平移的数目

使用dd命令创建一个镜像dd if=/dev/zero of=/twoing.img bs=1024MB count=2

bs=1024MB一次读写1024G ,count=2一共读写两次。所以是2G镜像文件。

用dd创建好镜像文件后,使用losetup /dev/loop0 /twoimg.img命令将创建的镜像文件映射成loop0。映射成功之后可以使用losetup –a命令查看映射关系。

要想挂载使用,需要格式化,命令为mkfs.ext4 /dev/loop0 。格式化完成之后在centos7系列的操作系统中,它会自动被挂载。我们也可以手动挂载到自己指定的目录中。

如下所示为手动挂载到自己指定的/mnt目录中:

[root@192 ~]# losetup /dev/loop0 /swaps

[root@192 ~]# losetup

NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

/dev/loop0 0 0 0 0 /swaps

[root@192 ~]# mount /dev/loop0 /mnt/

[root@192 ~]# df -h /mnt/

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

/dev/loop0 2.0G 6.1M 1.8G 1% /mnt

[root@192 ~]# umount /mnt/

[root@192 ~]# losetup

NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE

/dev/loop0 0 0 0 0 /swaps

[root@192 ~]# losetup -d /dev/loop0

[root@192 ~]# losetup

如果不使用了可以用umount /mnt (/mnt为挂载点) 卸载伪设备。然后用losetup -d /dev/loop0 命令关闭镜像映射。

2.8 dd命令详解

dd与cp的区别

dd:块界别拷贝

cp:文件目录界别拷贝

dd将原始数据(raw data)按照数据源的格式原封不动的拷贝到目的地;cp将文件和目录拷贝到目的地后按照目的地的格式排列新数据。注意:对于不能以文件或目录格式呈现的数据(如引导启动块的数据),cp无能为力。

2.8.dd命令选项注解

dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。注意:指定数字的地方若以下列字符结尾则乘以相应的数字:b=512;c=1;k=1024;w=2

参数:

1. if=文件名:输入文件名,缺省为标准输入。

2. of=文件名:输出文件名,确定缺省为标准输出。即指定目的文件。

3. ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。

obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。

bs=bytes:同时设置读入/输出的块大小为bytes个字节。

4. cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。

5. skip=blocks:从输入文件开头跳过blocks个块后再开始复制。

6. seek=blocks:从输出文件开头跳过blocks个块后再开始复制。

注意:通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。

7. count=次数:copy几次以bs为单位。

8. conv=conversion:用指定的参数转换文件

ascii:转换ebcdic为ascii

ebcdic:装换ascii为ebcdic

ibm:装换ascii为alternate ebcdic

block:把每一个转换为长度为cbs,不足部分用空格填充

unblock:使每一行的长度都为cbs,不足部分用哪个空格填充

lcase:把大写字符转换成小写字符

ucase:把小写字符装换成大写字符

swab:交换输入的每对字节

noerror:出错是不停止

notrunc :不截短输出文件

sync:将每个输入块填充到ibs个字节下啊,不足部分用空字符(NUL)补齐

2.9 dd应用实例

1、将本地的/dev/sda整盘备份到/dev/sdb

dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror

noerror出错时不停止 notrunc:不间断输出文件

2、将/dev/sdb全盘数据备份到指定路径的image文件

dd if=/dev/sdb of=/root/image

3、将备份文件恢复到指定盘

dd if=/root/image of=/dev/sdb

4、备份/dev/sdb全盘数据,并利用gzip工具进行压缩,保存到指定路径

dd if=/dev/sdb | gzip > /root/image.gz

5、将压缩的备份文件恢复到指定盘

gzip -dc /root/image.gz | dd of=/dev/sdb

6、备份磁盘开始的512个字节大小的MBR信息到指定文件

dd if=/dev/sda of=/root/image count=1 bs=512

count=1指仅拷贝一个块bs=512指块大小为512个字节

恢复:dd if=/root/image of=/dev/sda

7、拷贝内存内容到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024(指定块大小为1 K)

8、拷贝光盘内容到指定文件夹,并保存为cd.iso文件

dd if=/dev/sr0 of=/root/cd.iso bs=1024

9、销毁磁盘数据

dd if=/dev/urandom of=/dev/sda1

注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。

10、测试硬盘的读写速度

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

dd if=/root/1Gb.file bs=64k | dd of=/dev/null

通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。

14、修复硬盘:

dd if=/dev/sda of=/dev/sda

当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetio flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生,并且这个过程是安全、高效的。

15、把分区制作成镜像裸设备予以KVM虚拟机转移

dd if=/dev/VolGroup00/lv001 of=lv001.img bs=1M

16、测试磁盘读能力

time dd if=/dev/sdb1 of=/dev/null bs=8k

因为/dev/sdb1是一个物理分区,对它的读取会产生IO,/dev/null是伪设备

相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1

上,也相当于测试磁盘的读写能力。

测试同时读写能力

time dd if=/dev/sdb1 of=/test1.dbf bs=8k

这个命令一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb1是读。对/test1.db是写),假设他们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。

得到最恰当的block.size,通过比较dd指令输出中所显示的命令执行时间(选时间最少的那个),即可确定系统最佳的block.size大小

dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file

dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file

dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file

dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

2.10 lusk加密卷

2.10.1 luks简介

LUKS(Linux Unified Key Setup)为Linux硬盘加密提供了一种标准工具cryptsetup(centos与RHEL 默认已经安装。Debian/ubuntu 需另行安装,安装命令为aptitude install cryptsetup libcryptsetup-dev)

常用参数:luksFormat、luksOpen、luksClose、luksAddKey

使用cryptsetup对分区进行了加密后,这个分区就不再允许直接挂载。LUKS也是一种基于device mapper 机制的加密方案。如果要使用这个分区,必须对这个分区做一个映射,映射到/dev/mapper这个目录中,我们只能挂载这个映射设备才能使用。然而做映射的过程中需要输入解密密码。
首先,你将需要确认安装cryptsetup软件包,如果没有安装可以使用yum install cryptsetup命令进行安装。

配置实例1

使用ssm工具配置luks磁盘加密。在JUNXI卷组中创建一个大小为1G的luks加密卷组,并挂载到/opt下。

ssm create -s 1G -n luks -p junxi –fstype xfs –encrypt luks /opt/

C:\Users\李雪蕾\Documents\Tencent Files\1547462309\Image\C2C\{B4EE279B-4D69-1533-7360-2D9BA0AB9924}.png

也可以手动挂载luks加密设备,先把设备卸载,使用umount /opt

然后使用命令cryptsetup luksOpen /dev/JUNXI/luks open 映射加密设备为open。

然后挂载设备 mount /dev/mapper/open /opt

卸载加密设备的方法

[root@localhost ~]# umount /opt/

关闭映射设备

[root@localhost ~]# cryptsetup luksClose /dev/mapper/open

配置实例2

使用cryptsetup工具一步一步创建磁盘加密(这种方法适用于centos6之前版本的系统,centos7建议使用ssm创建磁盘加密)

必须首先对加密的卷进行解密,才能进行挂载文件系统
(1) dd if=/dev/zero of=/luks.img bs=1G count=1 #创建伪设备

losetup /dev/loop0 /luks.img #把镜像映射成块设备

(2)cryptsetup luksFormat /dev/loop0 #格式化加密层(提示大写的YES并输入密码)


(3) cryptsetup open /dev/loop0 junxi    #开启加密层(设置虚拟设备名为junxi)

(4)ll /dev/mapper/junxi #查看加密的虚拟设备
lrwxrwxrwx. 1 root root 7 4月 29 00:12 /dev/mapper/junxi -> ../dm-5

(5)mkfs.xfs /dev/mapper/junxi  #格式化虚拟设备

(6)mount /dev/mapper/junxi /opt/ #挂载虚拟加密设备

[root@node1 ~]# df -h /opt/

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

/dev/mapper/junxi 1019M 33M 987M 4% /opt


(7) touch /opt/files-{1..10} #使用加密设备
(8) umount /opt/ #卸载设备
(9) cryptsetup close junxi  #关闭加密虚拟设备(/dev/mapper/下不会查看到junxi虚拟设备)

(10)losetup -d /dev/loop0 #关闭映射
(11)
注意:以后使用就需要进行open打开进行读写操作,结束之后使用close进行关闭。

自动挂载加密设备,下例中是使用分区的方法创建加密分区。

例:

lvcreate -L 4G -n luks junxi #创建逻辑卷lusk

aptitude install cryptsetup libcryptsetup-dev #debian8安装cryptsetup

cryptsetup luksFormat /dev/junxi/luks #格式化成加密设备

WARNING!

========

This will overwrite data on /dev/loop0 irrevocably.

Are you sure? (Type uppercase yes): YES #此处必须为大写YES

Enter passphrase: #输入8位长度密码,密码无回显

Verify passphrase: #输入8位长度密码,密码无回显

Cannot format device /dev/loop0 which is still in use.

如果你的实验环境是centos7系统此处会弹出的密码框,如下图需要点击取消(Cancel)。否则centos7会自动挂载。

开启加密层(根据应用命名为web)

cryptsetup open /dev/junxi/luks web

格式化加密设备

mkfs.xfs /dev/mapper/web

格式化完成之后可以使用 mount /dev/mapper/web /mnt/命令挂载并访问加密设备

用touch命令创建文件进行测试touch /mnt/files{1..10}

最安全的密码是什么? 是连管理员自己都不知道的密码。使用/dev/random创建的随机密码是一个不错的选择。

/dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。

首先生成一个4096比特的随机二进制密码并重复10次,文件名为/root/passwd

dd if=/dev/random of=/root/passwd bs=4096 count=10

编辑/etc/crypttab配置文件。
# vim /etc/crypttab

打开后的卷名 原设备名 密钥文件 加密选项

# <target name> <source device> <key file> <options>

web /dev/junxi/luks none #(注:none表示密码为空) luks

或者自动应答密码,none的部分添加密码文件绝对路径/root/passwd:

# <target name> <source device> <key file> <options>

web /dev/junxi/luks /root/passwd luks

调整密钥文件权限

chmod 600 /root/passwd

在设备中添加key文件,使用密码文件生效。

cryptsetup luksAddKey /dev/junxi/luks /root/passwd

下面设置开机自动挂载:

# vim /etc/fstab
/dev/mapper/web /mnt xfs defaults 0 0


#reboot #重新启动系统

cryptsetup status /dev/mapper/junxi #查看加密状态

linux多网卡的7种bond模式原理

多网卡的7种bond模式原理

Linux网卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6

常用的有三种
mode=0:平衡负载模式,有自动备援,但需要”Switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援,不必”Switch”支援及设定。
需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里options bond0 miimon=100 mode=0是不够的,与网卡相连的交换机必须做特殊配置(这两个端口应该采取聚合方式),因为做bonding的这两块网卡是使用同一个MAC地址.从原理分析一下(bond运行在mode 0下):
mode 0下bond所绑定的网卡的IP都被修改成相同的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多 个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。所以 mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为 ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址.我们的解 决办法是,两个网卡接入不同的交换机即可。
mode6模式下无需配置交换机,因为做bonding的这两块网卡是使用不同的MAC地址。

七种bond模式说明
第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略)
特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环下去,直到最后一个传输完毕),此模式提供负载平衡和容错能力;但是我们知道如果一个连接或者会话的数据包从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降

第二种模式:mod=1,即: (active-backup) Active-backup policy(主-备份策略)
特点:只有一个设备处于活动状态,当一个宕掉另一个马上由备份转换为主设备。mac地址是外部可见得,从外面看来,bond的MAC地址是唯一的,以避免switch(交换机)发生混乱。此模式只提供了容错能力;由此可见此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为1/N

第三种模式:mod=2,即:(balance-xor) XOR policy(平衡策略)
特点:基于指定的传输HASH策略传输数据包。缺省的策略是:(源MAC地址 XOR 目标MAC地址) % slave数量。其他的传输策略可以通过xmit_hash_policy选项指定,此模式提供负载平衡和容错能力

第四种模式:mod=3,即:broadcast(广播策略)
特点:在每个slave接口上传输每个数据包,此模式提供了容错能力

第五种模式:mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)
特点:创建一个聚合组,它们共享同样的速率和双工设定。根据802.3ad规范将多个slave工作在同一个激活的聚合体下。
外出流量的slave选举是基于传输hash策略,该策略可以通过xmit_hash_policy选项从缺省的XOR策略改变到其他策略。需要注意的 是,并不是所有的传输策略都是802.3ad适应的,尤其考虑到在802.3ad标准43.2.4章节提及的包乱序问题。不同的实现可能会有不同的适应 性。
必要条件:
条件1:ethtool支持获取每个slave的速率和双工设定
条件2:switch(交换机)支持IEEE 802.3ad Dynamic link aggregation
条件3:大多数switch(交换机)需要经过特定配置才能支持802.3ad模式

第六种模式:mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
特点:不需要任何特别的switch(交换机)支持的通道bonding。在每个slave上根据当前的负载(根据速度计算)分配外出流量。如果正在接受数据的slave出故障了,另一个slave接管失败的slave的MAC地址。
该模式的必要条件:ethtool支持获取每个slave的速率

第七种模式:mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
特点:该模式包含了balance-tlb模式,同时加上针对IPV4流量的接收负载均衡(receive load balance, rlb),而且不需要任何switch(交换机)的支持。接收负载均衡是通过ARP协商实现的。bonding驱动截获本机发送的ARP应答,并把源硬件地址改写为bond中某个slave的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。
来自服务器端的接收流量也会被均衡。当本机发送ARP请求时,bonding驱动把对端的IP信息从ARP包中复制并保存下来。当ARP应答从对端到达 时,bonding驱动把它的硬件地址提取出来,并发起一个ARP应答给bond中的某个slave。使用ARP协商进行负载均衡的一个问题是:每次广播 ARP请求时都会使用bond的硬件地址,因此对端学习到这个硬件地址后,接收流量将会全部流向当前的slave。这个问题可以通过给所有的对端发送更新 (ARP应答)来解决,应答中包含他们独一无二的硬件地址,从而导致流量重新分布。当新的slave加入到bond中时,或者某个未激活的slave重新 激活时,接收流量也要重新分布。接收的负载被顺序地分布(round robin)在bond中最高速的slave上
当某个链路被重新接上,或者一个新的slave加入到bond中,接收流量在所有当前激活的slave中全部重新分配,通过使用指定的MAC地址给每个 client发起ARP应答。下面介绍的updelay参数必须被设置为某个大于等于switch(交换机)转发延时的值,从而保证发往对端的ARP应答 不会被switch(交换机)阻截。
必要条件:
条件1:ethtool支持获取每个slave的速率;
条件2:底层驱动支持设置某个设备的硬件地址,从而使得总是有个slave(curr_active_slave)使用bond的硬件地址,同时保证每个bond 中的slave都有一个唯一的硬件地址。如果curr_active_slave出故障,它的硬件地址将会被新选出来的 curr_active_slave接管
其实mod=6与mod=0的区别:mod=6,先把eth0流量占满,再占eth1,….ethX;而mod=0的话,会发现2个口的流量都很稳定,基本一样的带宽。而mod=6,会发现第一个口流量很高,第2个口只占了小部分流量
Linux网口绑定
通过网口绑定(bond)技术,可以很容易实现网口冗余,负载均衡,从而达到高可用高可靠的目的。前提约定:
2个物理网口分别是:eth0,eth1
绑定后的虚拟口是:bond0
服务器IP是:192.168.0.100

第一步,配置设定文件:
/etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
#BROADCAST广播地址
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

第二步,修改modprobe相关设定文件,并加载bonding模块:
1.在这里,我们直接创建一个加载bonding的专属设定文件/etc/modprobe.d/bonding.conf
[root@test ~]# vi /etc/modprobe.d/bonding.conf
#追加
alias bond0 bonding
options bonding mode=0 miimon=200
2.加载模块(重启系统后就不用手动再加载了)
[root@test ~]# modprobe bonding
3.确认模块是否加载成功:
[root@test ~]# lsmod | grep bonding
bonding 100065 0

第三步,重启一下网络,然后确认一下状况:
[root@test ~]# /etc/init.d/network restart
[root@test ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
……
 [root@test ~]# ifconfig | grep HWaddr
bond0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth0 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
eth1 Link encap:Ethernet HWaddr 00:16:36:1B:BB:74
从上面的确认信息中,我们可以看到3个重要信息:
1.现在的bonding模式是active-backup
2.现在Active状态的网口是eth0
3.bond0,eth1的物理地址和处于active状态下的eth0的物理地址相同,这样是为了避免上位交换机发生混乱。
任意拔掉一根网线,然后再访问你的服务器,看网络是否还是通的。

第四步,系统启动自动绑定、增加默认网关:
[root@test ~]# vi /etc/rc.d/rc.local
#追加
ifenslave bond0 eth0 eth1
route add default gw 192.168.0.1
#如可上网就不用增加路由,0.1地址按环境修改.
------------------------------------------------------------------------
留心:前面只是2个网口绑定成一个bond0的情况,如果我们要设置多个bond口,比如物理网口eth0和eth1组成bond0,eth2和eth3组成bond1,
那么网口设置文件的设置方法和上面第1步讲的方法相同,只是/etc/modprobe.d/bonding.conf的设定就不能像下面这样简单的叠加了:
alias bond0 bonding
options bonding mode=1 miimon=200
alias bond1 bonding
options bonding mode=1 miimon=200

正确的设置方法有2种:
第一种,你可以看到,这种方式的话,多个bond口的模式就只能设成相同的了:
alias bond0 bonding
alias bond1 bonding
options bonding max_bonds=2 miimon=200 mode=1

第二种,这种方式,不同的bond口的mode可以设成不一样:
alias bond0 bonding
options bond0 miimon=100 mode=1
install bond1 /sbin/modprobe bonding -o bond1 miimon=200 mode=0
仔细看看上面这2种设置方法,现在如果是要设置3个,4个,甚至更多的bond口,你应该也会了吧!
后记:简单的介绍一下上面在加载bonding模块的时候,options里的一些参数的含义:
miimon 监视网络链接的频度,单位是毫秒,我们设置的是200毫秒。
max_bonds 配置的bond口个数
mode bond模式,主要有以下几种,在一般的实际应用中,0和1用的比较多,
如果你要深入了解这些模式各自的特点就需要靠读者你自己去查资料并做实践了。

多网卡绑定图解
1 、用 root 用户登录
2 、用ifconfig 命令看一下 ip 地址,看一下 eth0 和 eth1 是否获取到 IP 地址(因为linux 这台服务器是连接在一台 DHCP 的服务器)
查看到 IP 地址为 eth0 16.157.125.78 eth1 16.157.125.113
broadcast : 16.157.125.255 mask : 255.255.254.0 ( eth0 和 eth1 都是这个 broadcast 和 mask )
3 、编辑虚拟网络接口配置文件 , 指定网卡 IP
vi /etc/sysconfig/ network-scripts/ ifcfg-bond0 创建一个虚拟网络接口配置文件
  
  4 、 [root@rhas-13 root]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0 把 ifcfg-eth0 里面的配置文件复制到 ifcfg-bond0 里面去
  然后用 vi ifcfg-bond0 命令修改虚拟配置端口。
  
  5 、修改第一行 DEVICE=bond0 ,然后把配置改成 eth0 的配置(配置完成为下边的图)
  按此在新窗口浏览图片
  6 、用 cat 命令查看一下 eth0 和 eth1 的配置
  按此在新窗口浏览图片
  7 、 # vi /etc/modules.conf
  编辑 /etc/modules.conf 文件,加入如下一行内容,以使系统在启动时加载 bonding 模块
  按此在新窗口浏览图片
  8 、加入下列两行
  alias bond0 bonding
  options bond0 miimon=100 mode=1
  说明: miimon 是用来进行链路监测的。比如 :miimon=100 ,那么系统每 100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路; mode 的值表示工作模式,他共有 0 , 1,2,3 四种模式,常用的为 0,1 两种。
  mode=0 表示 load balancing (round-robin) 为负载均衡方式,两块网卡都工作。
  mode=1 表示 fault-tolerance (active-backup) 提供冗余功能,工作方式是主备的工作方式 , 也就是说默认情况下只有一块网卡工作 , 另一块做备份 .
  bonding 只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路 down 掉了,而交换机本身并没有故障,那么 bonding 会认为链路没有问题而继续使用。
  按此在新窗口浏览图片
  9 、 # vi /etc/rc.d/rc.local
  按此在新窗口浏览图片
  10 、加入两行
  ifenslave bond0 eth0 eth1
  route add -net 16.157.125.255 netmask 255.255.255.0 bond0
  添加后为下图:
  按此在新窗口浏览图片
  11 、 reboot 开机自检时候看红色框里面就成功了 .
  按此在新窗口浏览图片
  12 、可以进入系统里面查看一下 ip 就可以了.
  按此在新窗口浏览图片
  上图可以看出来 bond0 已经获取到 eth0 初始化的地址,而且 eth0 和 eth1 的 mac 地址都是一样的,说明两块已经绑定成一块网卡.

进程

linux 多用户多任务 进程/线程
ps     显示系统中所有进程
ps -ef
ps -aux
ps -auxfww
ps -u postfix -aflww   #查看指定用户的详细进程
pstree  #树形方式显示
pgrep   #从运行进程队列中查找进程
linux命令可以从两个地方读取要处理的内容,一个是通过命令行参数,一个是标准输入。
通过xargs命令,可以在管道后面使用那些不接收标准输入的命令了
例如:
find /etc -name *.conf | ls -l
find /etc -name *.conf | xargs ls -l

pgrep -u postfix -l    #查看特定用户的所有进程
pgrep -u apache -l | xargs kill -9   #杀死apache用户的所有进程

pidof cp  #查看pid号
3504
sleep 10; kill -s 18 3504 ; sleep 10 ; kill -s 19 3504 ; sleep 10 ; kill -s 9 3504

tty 物理终端  7个 ctrl+alt+f1~7
pts 虚拟终端

apache80端号跳转443端口

apache80端号跳转443端口调取的虚拟主机的配置文件

 

调取虚拟主机内容,80端口的顶级域名,跳转至www的443端口

<VirtualHost ip:80>      80重写443端口

ServerAdmin aaa.com       需要跳转的域名

DocumentRoot “/home/wwwroot/baoxian_program”    访问网页路径

ServerName aaa.com               网页域名

RewriteEngine On                         url重写向开启

RewriteCond %{SERVER_PORT} !^443$        指定跳转至443端口

RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R,L]      跳转至https://www.域名.com/url

<Directory “/home/wwwroot/baoxian_program”>       所需访问页面存放路径

Options none

AllowOverride none

Order allow,deny

Allow from all

Require all granted

 

</Directory>

</VirtualHost>

 

 

<VirtualHost ip:443>            443端口配置

SSLEngine On                         ssl开启

SSLCertificateKeyFile /home/ssl/www.aaa.com.key    私钥文件

SSLCertificateChainFile /home/ssl/www.aaa.com_ca.crt   安全证书

SSLCertificateFile /home/ssl/www.aaa.com.cer      安全证书

DocumentRoot “/home/wwwroot/baoxian_program”     网页存放路径

ServerName www.aaa.com                 访问域名

ServerAlias www.aaa.com                    域名别名

#RewriteEngine On

#RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]

<Directory “/home/wwwroot/baoxian_program”>

Options FollowSymLinks ExecCGI     选项

AllowOverride All                  指令 所有

Order allow,deny                  订单允许,拒绝

Allow from all                       允许所有

Require all granted                   需要开启

</Directory>

</VirtualHost>

shell显示操作用户以及路径

 

修改/.profile文件,这样做可以在操作的时候显示操作用户以及路径。方法如下:

针对所有用户设置可以 /etc/profile中设置

针对单个用户设置可以/home/.profile中设置。

以root用户为例:

vi /.profile

PS1='[\u@\h:$PWD]#’

export PS1

保存退出文件wq

tomcat设置编码格式utf8

要设置GET的编码,可以修改server.xml文件中,相应的端口的Connector的属性:URIEncoding=”UTF-8″,这样,GET方式提交的数据才会被正确解码。

<Connector port=”8080″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ URIEncoding=”UTF-8″ />

MySQL的数据类型

一、MySQL的数据类型

主要包括以下五大类:

整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT

浮点数类型:FLOAT、DOUBLE、DECIMAL

字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB

日期类型:Date、DateTime、TimeStamp、Time、Year

其他数据类型:BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection等

 

1、整型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节  范围(-128~127)
smallint(m) 2个字节  范围(-32768~32767)
mediumint(m) 3个字节  范围(-8388608~8388607)
int(m) 4个字节  范围(-2147483648~2147483647)
bigint(m) 8个字节  范围(+-9.22*10的18次方)

取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。

int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。

 

2、浮点型(float和double)

MySQL数据类型 含义
float(m,d) 单精度浮点型    8位精度(4字节)     m总个数,d小数位
double(m,d) 双精度浮点型    16位精度(8字节)    m总个数,d小数位

设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。整数部分最大是3位,如果插入数12.123456,存储的是12.1234,如果插入12.12,存储的是12.1200.

 

3、定点数

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。

decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

 

4、字符串(char,varchar,_text)

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

char和varchar:

1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),

所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text:

1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字

节。

2.text类型不能有默认值。

3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

 

5.二进制数据(_Blob)

1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。

2._BLOB存储的数据只能整体读出。

3._TEXT可以指定字符集,_BLO不用指定字符集。

 

6.日期时间类型

MySQL数据类型 含义
date 日期 ‘2008-12-2’
time 时间 ’12:25:36′
datetime 日期时间 ‘2008-12-2 22:06:44’
timestamp 自动存储记录修改时间

若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

 

数据类型的属性

 

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name 指定一个字符集

 

二、MYSQL数据类型的长度和范围

各数据类型及字节长度一览表:

数据类型 字节长度 范围或用法
Bit 1 无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节
TinyInt 1 整数[0,255]
SmallInt 2 无符号[0,65535],有符号[-32768,32767]
MediumInt 3 无符号[0,2^24-1],有符号[-2^23,2^23-1]]
Int 4 无符号[0,2^32-1],有符号[-2^31,2^31-1]
BigInt 8 无符号[0,2^64-1],有符号[-2^63 ,2^63 -1]
Float(M,D) 4 单精度浮点数。天缘博客提醒这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
Double(M,D) 8  双精度浮点。
Decimal(M,D) M+1或M+2 未打包的浮点数,用法类似于FLOAT和DOUBLE,天缘博客提醒您如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。
Date 3 以YYYY-MM-DD的格式显示,比如:2009-07-19
Date Time 8 以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
TimeStamp 4 以YYYY-MM-DD的格式显示,比如:2009-07-19
Time 3 以HH:MM:SS的格式显示。比如:11:22:30
Year 1 以YYYY的格式显示。比如:2009
Char(M) M
定长字符串。
VarChar(M) M 变长字符串,要求M<=255
Binary(M) M 类似Char的二进制存储,特点是插入定长不足补0
VarBinary(M) M 类似VarChar的变长二进制存储,特点是定长不补0
Tiny Text Max:255 大小写不敏感
Text Max:64K 大小写不敏感
Medium Text Max:16M 大小写不敏感
Long Text Max:4G 大小写不敏感
TinyBlob Max:255 大小写敏感
Blob Max:64K 大小写敏感
MediumBlob Max:16M 大小写敏感
LongBlob Max:4G 大小写敏感
Enum 1或2 最大可达65535个不同的枚举值
Set 可达8 最大可达64个不同的值
Geometry
Point
LineString
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection

三、使用建议

1、在指定数据类型的时候一般是采用从小原则,比如能用TINY INT的最好就不用INT,能用FLOAT类型的就不用DOUBLE类型,这样会对MYSQL在运行效率上提高很大,尤其是大数据量测试条件下。

2、不需要把数据表设计的太过复杂,功能模块上区分或许对于后期的维护更为方便,慎重出现大杂烩数据表

3、数据表和字段的起名字也是一门学问

4、设计数据表结构之前请先想象一下是你的房间,或许结果会更加合理、高效

5、数据库的最后设计结果一定是效率和可扩展性的折中,偏向任何一方都是欠妥的

 

选择数据类型的基本原则

前提:使用适合存储引擎。

选择原则:根据选定的存储引擎,确定如何选择合适的数据类型。

下面的选择方法按存储引擎分类:

  • MyISAM 数据存储引擎和数据列:MyISAM数据表,最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。
  • MEMORY存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理的。
  • InnoDB 存储引擎和数据列:建议使用 VARCHAR类型。

对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因 此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

下面说一下固定长度数据列与可变长度的数据列。

char与varchar

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

CHAR(4) 存储需求 VARCHAR(4) 存储需求
‘    ‘ 4个字节 1个字节
‘ab’ ‘ab  ‘ 4个字节 ‘ab ‘ 3个字节
‘abcd’ ‘abcd’ 4个字节 ‘abcd’ 5个字节
‘abcdefgh’ ‘abcd’ 4个字节 ‘abcd’ 5个字节

请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值保存,并且会出现错误。

从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。通过下面的例子说明该差别:
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO vc VALUES (‘ab  ‘, ‘ab  ‘);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT CONCAT(v, ‘+’), CONCAT(c, ‘+’) FROM vc;
+—————-+—————-+
| CONCAT(v, ‘+’) | CONCAT(c, ‘+’) |
+—————-+—————-+
| ab  +          | ab+            |
+—————-+—————-+
1 row in set (0.00 sec)

text和blob

 

在使用text和blob字段类型时要注意以下几点,以便更好的发挥数据库的性能。

①BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的”空洞”,以后填入这些”空洞”的记录可能长度不同,为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理.

②使用合成的(synthetic)索引。合成的索引列在某些时候是有用的。一种办法是根据其它的列的内容建立一个散列值,并把这个值存储在单独的数据列中。接下来你就可以通过检索散列值找到数据行了。但是,我们要注意这种技术只能用于精确匹配的查询(散列值对于类似<或>=等范围搜索操作符 是没有用处的)。我们可以使用MD5()函数生成散列值,也可以使用SHA1()或CRC32(),或者使用自己的应用程序逻辑来计算散列值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部空格,就不要把它们存储在CHAR或VARCHAR列中,它们会受到尾部空格去除的影响。

合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。

③在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT *查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。这也是 BLOB或TEXT标识符信息存储在合成的索引列中对我们有所帮助的例子。你可以搜索索引列,决定那些需要的数据行,然后从合格的数据行中检索BLOB或 TEXT值。

④把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中 的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行 SELECT *查询的时候不会通过网络传输大量的BLOB或TEXT值。

浮点数与定点数

为了能够引起大家的重视,在介绍浮点数与定点数以前先让大家看一个例子:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)

mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)

mysql> select * from test;
+———–+———–+
| c1        | c2        |
+———–+———–+
| 131072.31 | 131072.32 |
+———–+———–+
1 row in set (0.00 sec)

从上面的例子中我们看到c1列的值由131072.32变成了131072.31,这就是浮点数的不精确性造成的。

在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。在今后关于浮点数和定点数的应用中,大家要记住以下几点:

  1. 浮点数存在误差问题;
  2. 对货币等对精度敏感的数据,应该用定点数表示或存储;
  3. 编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
  4. 要注意浮点数中一些特殊值的处理。

MySQL的binlog日志

binlog 基本认识
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

一般来说开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。二进制有两个最重要的使用场景:
其一:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。
其二:自然就是数据恢复了,通过使用mysqlbinlog工具来使恢复数据。

二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
一、开启binlog日志:
vi编辑打开mysql配置文件
# vi /usr/local/mysql/etc/my.cnf
在[mysqld] 区块
设置/添加 log-bin=mysql-bin 确认是打开状态(值 mysql-bin 是日志的基本名或前缀名);

重启mysqld服务使配置生效
# pkill mysqld
# /usr/local/mysql/bin/mysqld_safe –user=mysql &
二、也可登录mysql服务器,通过mysql的变量配置表,查看二进制日志是否已开启 单词:variable[ˈvɛriəbəl] 变量

登录服务器
# /usr/local/mysql/bin/mysql -uroot -p123456

mysql> show variables like ‘log_%’;
+—————————————-+—————————————+
| Variable_name | Value |
+—————————————-+—————————————+
| log_bin | ON | ——> ON表示已经开启binlog日志
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | /usr/local/mysql/data/martin.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+—————————————-+—————————————+

三、常用binlog日志操作命令
1.查看所有binlog日志列表
mysql> show master logs;

2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;

3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4.重置(清空)所有binlog日志
mysql> reset master;
四、查看某个binlog日志内容,常用有两种方式:

1.使用mysqlbinlog自带查看命令法:
注: binlog是二进制文件,普通文件查看器cat more vi等都无法打开,必须使用自带的 mysqlbinlog 命令查看
binlog日志与数据库文件在同目录中(我的环境配置安装是选择在/usr/local/mysql/data中)
在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “–no-defaults”选项

# /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000013
下面截取一个片段分析:

…………………………………………………………………….
# at 552
#131128 17:50:46 server id 1 end_log_pos 665 Query thread_id=11 exec_time=0 error_code=0 —->执行时间:17:50:46;pos点:665
SET TIMESTAMP=1385632246/*!*/;
update zyyshop.stu set name=’李四’ where id=4 —->执行的SQL
/*!*/;
# at 665
#131128 17:50:46 server id 1 end_log_pos 692 Xid = 1454 —->执行时间:17:50:46;pos点:692
…………………………………………………………………….

注: server id 1 数据库主机的服务号;
end_log_pos 665 pos点
thread_id=11 线程号
2.上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令:

mysql> show binlog events [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count];

选项解析:
IN ‘log_name’ 指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos 指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查询总条数(不指定就是所有行)

截取部分查询结果:
*************************** 20. row ***************************
Log_name: mysql-bin.000021 ———————————————-> 查询的binlog日志文件名
Pos: 11197 ———————————————————-> pos起始点:
Event_type: Query ———————————————————-> 事件类型:Query
Server_id: 1 ————————————————————–> 标识是由哪台服务器执行的
End_log_pos: 11308 ———————————————————-> pos结束点:11308(即:下行的pos起始点)
Info: use `zyyshop`; INSERT INTO `team2` VALUES (0,345,’asdf8er5′) —> 执行的sql语句
*************************** 21. row ***************************
Log_name: mysql-bin.000021
Pos: 11308 ———————————————————-> pos起始点:11308(即:上行的pos结束点)
Event_type: Query
Server_id: 1
End_log_pos: 11417
Info: use `zyyshop`; /*!40000 ALTER TABLE `team2` ENABLE KEYS */
*************************** 22. row ***************************
Log_name: mysql-bin.000021
Pos: 11417
Event_type: Query
Server_id: 1
End_log_pos: 11510
Info: use `zyyshop`; DROP TABLE IF EXISTS `type`

这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数;

A.查询第一个(最早)的binlog日志:
mysql> show binlog events\G;

B.指定查询 mysql-bin.000021 这个文件:
mysql> show binlog events in ‘mysql-bin.000021’\G;

C.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起:
mysql> show binlog events in ‘mysql-bin.000021’ from 8224\G;

D.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,查询10条
mysql> show binlog events in ‘mysql-bin.000021’ from 8224 limit 10\G;

E.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,偏移2行,查询10条
mysql> show binlog events in ‘mysql-bin.000021’ from 8224 limit 2,10\G;
五、恢复binlog日志实验(zyyshop是数据库)
1.假设现在是凌晨4:00,我的计划任务开始执行一次完整的数据库备份:

将zyyshop数据库备份到 /root/BAK.zyyshop.sql 文件中:
# /usr/local/mysql/bin/mysqldump -uroot -p123456 -lF –log-error=/root/myDump.err -B zyyshop > /root/BAK.zyyshop.sql
……

大约过了若干分钟,备份完成了,我不用担心数据丢失了,因为我有备份了,嘎嘎~~~

由于我使用了-F选项,当备份工作刚开始时系统会刷新log日志,产生新的binlog日志来记录备份之后的数据库“增删改”操作,查看一下:
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000023 | 120 | | |
+——————+———-+————–+——————+
也就是说, mysql-bin.000023 是用来记录4:00之后对数据库的所有“增删改”操作。
2.早9:00上班了,业务的需求会对数据库进行各种“增删改”操作~~~~~~~
@ 比如:创建一个学生表并插入、修改了数据等等:
CREATE TABLE IF NOT EXISTS `tt` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum(‘m’,’w’) NOT NULL DEFAULT ‘m’,
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
导入实验数据
mysql> insert into zyyshop.tt(`name`,`sex`,`age`,`classid`) values(‘yiyi’,’w’,20,’cls1′),(‘xiaoer’,’m’,22,’cls3′),(‘zhangsan’,’w’,21,’cls5′),(‘lisi’,’m’,20,’cls4′),(‘wangwu’,’w’,26,’cls6′);
查看数据
mysql> select * from zyyshop.tt;
+—-+———-+—–+—–+———+
| id | name | sex | age | classid |
+—-+———-+—–+—–+———+
| 1 | yiyi | w | 20 | cls1 |
| 2 | xiaoer | m | 22 | cls3 |
| 3 | zhangsan | w | 21 | cls5 |
| 4 | lisi | m | 20 | cls4 |
| 5 | wangwu | w | 26 | cls6 |
+—-+———-+—–+—–+———+
中午时分又执行了修改数据操作
mysql> update zyyshop.tt set name=’李四’ where id=4;
mysql> update zyyshop.tt set name=’小二’ where id=2;

修改后的结果:
mysql> select * from zyyshop.tt;
+—-+———-+—–+—–+———+
| id | name | sex | age | classid |
+—-+———-+—–+—–+———+
| 1 | yiyi | w | 20 | cls1 |
| 2 | 小二 | m | 22 | cls3 |
| 3 | zhangsan | w | 21 | cls5 |
| 4 | 李四 | m | 20 | cls4 |
| 5 | wangwu | w | 26 | cls6 |
+—-+———-+—–+—–+———+
假设此时是下午18:00,莫名地执行了一条悲催的SQL语句,整个数据库都没了:
mysql> drop database zyyshop;
3.此刻杯具了,别慌!先仔细查看最后一个binlog日志,并记录下关键的pos点,到底是哪个pos点的操作导致了数据库的破坏(通常在最后几步);

备份一下最后一个binlog日志文件:
# ll /usr/local/mysql/data | grep mysql-bin
# cp -v /usr/local/mysql/data/mysql-bin.000023 /root/

此时执行一次刷新日志索引操作,重新开始新的binlog日志记录文件,理论说 mysql-bin.000023 这个文件不会再有后续写入了(便于我们分析原因及查找pos点),以后所有数据库操作都会写入到下一个日志文件;
mysql> flush logs;
mysql> show master status;

4.读取binlog日志,分析问题
方式一:使用mysqlbinlog读取binlog日志:
# /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000023

方式二:登录服务器,并查看(推荐):
mysql> show binlog events in ‘mysql-bin.000023′;

以下为末尾片段:
+——————+——+————+———–+————-+————————————————————+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+——————+——+————+———–+————-+————————————————————+
| mysql-bin.000023 | 922 | Xid | 1 | 953 | COMMIT /* xid=3820 */ |
| mysql-bin.000023 | 953 | Query | 1 | 1038 | BEGIN |
| mysql-bin.000023 | 1038 | Query | 1 | 1164 | use `zyyshop`; update zyyshop.tt set name=’李四’ where id=4|
| mysql-bin.000023 | 1164 | Xid | 1 | 1195 | COMMIT /* xid=3822 */ |
| mysql-bin.000023 | 1195 | Query | 1 | 1280 | BEGIN |
| mysql-bin.000023 | 1280 | Query | 1 | 1406 | use `zyyshop`; update zyyshop.tt set name=’小二’ where id=2|
| mysql-bin.000023 | 1406 | Xid | 1 | 1437 | COMMIT /* xid=3823 */ |
| mysql-bin.000023 | 1437 | Query | 1 | 1538 | drop database zyyshop |
+——————+——+————+———–+————-+————————————————————+

通过分析,造成数据库破坏的pos点区间是介于 1437–1538 之间,只要恢复到1437前就可。
5.现在把凌晨备份的数据恢复:

# /usr/local/mysql/bin/mysql -uroot -p123456 -v < /root/BAK.zyyshop.sql;

注: 至此截至当日凌晨(4:00)前的备份数据都恢复了。
但今天一整天(4:00–18:00)的数据肿么办呢?就得从前文提到的 mysql-bin.000023 新日志做文章了……
6.从binlog日志恢复数据

恢复语法格式:
# mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

常用选项:
–start-position=953 起始pos点
–stop-position=1437 结束pos点
–start-datetime=”2013-11-29 13:18:54″ 起始时间点
–stop-datetime=”2013-11-29 13:21:53″ 结束时间点
–database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

不常用选项:
-u –user=name Connect to the remote server as username.连接到远程主机的用户名
-p –password[=name] Password to connect to remote server.连接到远程主机的密码
-h –host=name Get the binlog from server.从远程主机上获取binlog日志
–read-from-remote-server Read binary logs from a MySQL server.从某个MySQL服务器上读取binlog日志

小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;

A.完全恢复(本例不靠谱,因为最后那条 drop database zyyshop 也在日志里,必须想办法把这条破坏语句排除掉,做部分恢复)
# /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000021 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop

B.指定pos结束点恢复(部分恢复):
@ –stop-position=953 pos结束点
注:此pos结束点介于“导入实验数据”与更新“name=’李四’”之间,这样可以恢复到更改“name=’李四’”之前的“导入测试数据”
# /usr/local/mysql/bin/mysqlbinlog –stop-position=953 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop

在另一终端登录查看结果(成功恢复了):
mysql> select * from zyyshop.tt;
+—-+———-+—–+—–+———+
| id | name | sex | age | classid |
+—-+———-+—–+—–+———+
| 1 | yiyi | w | 20 | cls1 |
| 2 | xiaoer | m | 22 | cls3 |
| 3 | zhangsan | w | 21 | cls5 |
| 4 | lisi | m | 20 | cls4 |
| 5 | wangwu | w | 26 | cls6 |
+—-+———-+—–+—–+———+

C.指定pso点区间恢复(部分恢复):
更新 name=’李四’ 这条数据,日志区间是Pos[1038] –> End_log_pos[1164],按事务区间是:Pos[953] –> End_log_pos[1195];

更新 name=’小二’ 这条数据,日志区间是Pos[1280] –> End_log_pos[1406],按事务区间是:Pos[1195] –> End_log_pos[1437];

c1.单独恢复 name=’李四’ 这步操作,可这样:
# /usr/local/mysql/bin/mysqlbinlog –start-position=1038 –stop-position=1164 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop

也可以按事务区间单独恢复,如下:
# /usr/local/mysql/bin/mysqlbinlog –start-position=953 –stop-position=1195 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop
c2.单独恢复 name=’小二’ 这步操作,可这样:
# /usr/local/mysql/bin/mysqlbinlog –start-position=1280 –stop-position=1406 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop

也可以按事务区间单独恢复,如下:
# /usr/local/mysql/bin/mysqlbinlog –start-position=1195 –stop-position=1437 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop
c3.将 name=’李四’、name=’小二’ 多步操作一起恢复,需要按事务区间,可这样:
# /usr/local/mysql/bin/mysqlbinlog –start-position=953 –stop-position=1437 –database=zyyshop /usr/local/mysql/data/mysql-bin.000023 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop
D.在另一终端登录查看目前结果(两名称也恢复了):
mysql> select * from zyyshop.tt;
+—-+———-+—–+—–+———+
| id | name | sex | age | classid |
+—-+———-+—–+—–+———+
| 1 | yiyi | w | 20 | cls1 |
| 2 | 小二 | m | 22 | cls3 |
| 3 | zhangsan | w | 21 | cls5 |
| 4 | 李四 | m | 20 | cls4 |
| 5 | wangwu | w | 26 | cls6 |
+—-+———-+—–+—–+———+

E.也可指定时间区间恢复(部分恢复):除了用pos点的办法进行恢复,也可以通过指定时间区间进行恢复,按时间恢复需要用mysqlbinlog命令读取binlog日志内容,找时间节点。
比如,我把刚恢复的tt表删除掉,再用时间区间点恢复
mysql> drop table tt;

@ –start-datetime=”2013-11-29 13:18:54″ 起始时间点
@ –stop-datetime=”2013-11-29 13:21:53″ 结束时间点

# /usr/local/mysql/bin/mysqlbinlog –start-datetime=”2013-11-29 13:18:54″ –stop-datetime=”2013-11-29 13:21:53″ –database=zyyshop /usr/local/mysql/data/mysql-bin.000021 | /usr/local/mysql/bin/mysql -uroot -p123456 -v zyyshop

总结:所谓恢复,就是让mysql将保存在binlog日志中指定段落区间的sql语句逐个重新执行一次而已。