Debian安装配置MariaDB Server

MySQL

介绍

这里我们用 MariaDB 代替 MySQL,MariaDB 数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用 GPL 授权许可 MariaDB 的目的是完全兼容 MySQL,包括 API 和命令行,使之能轻松成为 MySQL 的代替品。

上面的都是书面语,我觉得 MariaDB 哪里好呢,首先 MySQL 分 CE(开发版)和 EE(企业版)区分了一部分用户,而且毕竟是 Orcale 的软件了,后期发展难免会有更大的区分。MariaDB 是完全由开源社区维护的,而且在功能开发上也更开放,光说国内,阿里云就有为其赞助了一位开发者——彭立勋,帮助完善复制功能并将 AliSQL 的优良特性合并入 MariaDB,最近腾讯云也赞助了一位开发者 —— 程斌(音译),帮助完善InnoDB 功能,并合并 TXSQL。可见 MariaDB 的开发生态其实非常棒,很活跃,一片生机勃勃。

MariaDB、MySQL 这样的数据库编译非常耗时而且编译很容易出错,所以使用编译好的版本无疑是最好的,设置页非常的方便。

安装

MariaDB 的软件源由官方提供,程序的质量和安全绝对是毋庸置疑的。

本教程适用于:

Debian 8 (Jessie) 支持安装 10.0~最新
Debian 9 (stretch) 支持安装 10.1~最新

教程以 10.2 版本为例,其他版本只需将下面的 10.2 修改为 10.1 10.0 即可

apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8add-apt-repository 'deb [arch=amd64] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.2/debian stretch main'

apt update
apt install mariadb-server

MariaDB 设置密码

MySQL

安装过程中,这里会提示设置数据库 Root 密码,需要连续输入两次。

设置

输入下面的命令,关闭一些不安全的设置:

mysql_secure_installation

首先输入密码,提出修改米啊嘛不修改,然后一路 y 即可。

  • 基本介绍:
    Enter current password for root (enter for none):
  • 解释:输入当前 root 用户密码,默认为空,直接回车。
    Set root password? [Y/n] y
  • 解释:要设置 root 密码吗?输入 y 表示愿意。
    Remove anonymous users? [Y/n] y
  • 解释:要移除掉匿名用户吗?输入 y 表示愿意。
    Disallow root login remotely? [Y/n] y
  • 解释:不想让 root 远程登陆吗?输入 y 表示愿意。
    Remove test database and access to it? [Y/n] y
  • 解释:要去掉 test 数据库吗?输入 y 表示愿意。
    Reload privilege tables now? [Y/n] y
  • 解释:想要重新加载权限吗?输入 y 表示愿意。

管理

systemctl restart mysql #重启
systemctl start mysql #启动
systemctl stop mysql #关闭
systemctl status mysql #检查状态

更新

运行下面的命令系统就会更新所有可以更新的软件包括 MariaDB

apt update
apt upgrade -y

配置MariaDB允许客户端远程连接

1、登陆mysql数据库

mysql -u root -p

查看user表

mysql> use mysql;
Database changed
mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
2 rows in set (0.00 sec)

可以看到在user表中已创建的root用户。host字段表示登录的主机,其值可以用IP,也可用主机名,

(1)有时想用本地IP登录,那么可以将以上的Host值改为自己的Ip即可

2、实现远程连接(授权法)

将host字段的值改为%就表示在任何客户端机器上能以root用户登录到mysql服务器,建议在开发时设为%。

update user set host = ’%’ where user = ’root’;

将权限改为ALL PRIVILEGES

mysql> use mysql;
Database changed
mysql> grant all privileges on . to root@'%' identified by "root";
Query OK, 0 rows affected (0.00 sec)
mysql>
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | A731AEBFB621E354CD41BAF207D884A609E81F5E |
| % | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)

这样机器就可以以用户名root密码root远程访问该机器上的MySql.

3、实现远程连接(改表法)

use mysql;
update user set host = '%' where user = 'root';

这样在远端就可以通过root用户访问Mysql.

CentOS7 YUM安装MariaDB

https://downloads.mariadb.org/mariadb/repositories/#mirror=tuna&distro=CentOS&distro_release=centos7-amd64–centos7&version=10.2

1. 配置Yum安装库

Here is your custom MariaDB YUM repository entry for CentOS. Copy and paste it into a file under /etc/yum.repos.d/ (we suggest naming the file MariaDB.repo or something similar).

#MariaDB 10.2 CentOS repository list - created 2017-06-12 03:20 UTC
#http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-
gpgcheck=1

2.执行yum安装

After the file is in place, install MariaDB with:

sudo yum install MariaDB-server MariaDB-client

3.启动MariaDB

systemctl start mariadb

4.设置root用户密码

mysqladmin -u root -p password newpassword

后面的 newpassword是要设置的密码

CentOS系统硬盘使用LVM扩容的方法

LVM扩容时或新建vg时需要使用系列命令,各个命令的用法多样,本文介绍一个最省力的姿势。

一、首先创建一块新的分区:

fdisk  /dev/sda
p
n  
    p       #选择逻辑分区,如果没有,则首先创建扩展分区,然后再添加逻辑分区(硬盘:最多四个分区P-P-P-P或P-P-P-E)
    3       #分区号(从2开始),/dev/sda3
t
    3
    8e   #分区类型8e表示LVM分区
w        #写入分区表
partprobe   #重读分区表,重读失败则要重启
partx /dev/sda #查看当前硬盘的分区表及使用情况

二、创建PV,扩容VG、LV

pvcreate /dev/sda3
vgdisplay #查看当前已经存在的VG信息,以存在VG:VolGroup为例
vgextend VolGroup /dev/sda3    #扩展VolGroup
lvdisplay #查看已经存在的LV信息,以存在LV:lv_root为例
lvextend /dev/VolGroup/lv_root /dev/sda3 #扩展LV
#其他用法    lvextend –L 50G /dev/VolGroup/lv_root 
#其他用法    lvextend –L +20G /dev/VolGroup/lv_root 
#其他用法    lvextend /dev/mapper/VolGroup-lv_root -l +100%FREE /dev/sdb1
resize2fs /dev/VolGroup/lv_root #执行该重设大小,对于当前正在使用的lv_root有效
#注意:在Centos7.x中,文件系统格式是xfs时,使用xfs_growfs命令重设lv大小,如 xfs_growfs  /dev/mapper/centos-root
df –h #查看挂载情况,已经扩容

三、创建新LV

pvcreate /dev/sdb1
#partprobe
#pvdisplay
vgcreate vg_mqtag /dev/sdb1
#vgdisplay
lvcreate -n lvData -l 100%FREE vg_mqtag
#lvdisplay
mkfs.ext4 /dev/vg_mqtag/lvData
mount /dev/vg_mqtag/lvData /opt/
df -h
echo "/dev/mapper/vg_mqtag-lvData /opt              ext4      defaults       0   0" >> /etc/fstab

Linux LVM入门使用教程

逻辑卷管理LVM是一个多才多艺的硬盘系统工具。无论在Linux或者其他类似的系统,都是非常的好用。传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以让管理员弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。

LVM使用分层结构,如下图所示。

系统管理

图中顶部,首先是实际的物理磁盘及其划分的分区和其上的物理卷(PV)。一个或多个物理卷可以用来创建卷组(VG)。然后基于卷组可以创建逻辑卷(LV)。只要在卷组中有可用空间,就可以随心所欲的创建逻辑卷。文件系统就是在逻辑卷上创建的,然后可以在操作系统挂载和访问。

LVM测试说明

本文将介绍怎么在linux中创建和管理LVM卷。我们将会分成两个部分。第一个部分,我们首先要在一个硬盘上创建多个逻辑卷,然后将它们挂载在/lvm-mount目录。然后我们将要对创建好的卷调整大小。而第二部分,我们将会从另外一块硬盘增加额外的卷到LVM中。

准备磁盘分区

通过使用fdisk,创建磁盘分区。我们需要创建3个1G分区,注意,并不要求分区的大小一致。同样,分区需要使用‘8e’类型来使他们可用于LVM。

# fdisk /dev/sdb 
Command (m for help): n ## 新建
Command action
   e   extended
   p   primary partition (1-4)
p ## 主分区

Partition number (1-4): 1 ## 分区号
First cylinder (1-1044, default 1):  ## 回车用默认的1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +1G ## 大小

Command (m for help): t ## 改变类型
Selected partition 1
Hex code (type L to list codes): 8e ## LVM 的分区代码
Changed system type of partition 1 to 8e (Linux LVM)

重复上面的操作来创建其他两个分区。分区创建完成后,我们应该有类似如下的输出:

# fdisk -l 
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         132     1060258+  8e  Linux LVM
/dev/sdb2             133         264     1060290   8e  Linux LVM
/dev/sdb3             265         396     1060290   8e  Linux LVM

准备物理卷(PV)

刚创建的分区是用来储存物理卷的。LVM可以使用不同大小的物理卷。

# pvcreate /dev/sdb1
# pvcreate /dev/sdb2
# pvcreate /dev/sdb3

使用下列命令检查物理卷的创建情况。下面截取部分输出。”/dev/sdb2″是一个新的”1.01 GiB”物理卷。

# pvdisplay
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name
  PV Size               1.01 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               jszvzz-ENA2-g5Pd-irhV-T9wi-ZfA3-0xo092

使用下列命令可以删除物理卷。

# pvremove /dev/sdb1

准备卷组(VG)

下列命令用来创建名为’volume-group1’的卷组,使用/dev/sdb1, /dev/sdb2 和 /dev/sdb3创建。

# vgcreate volume-group1 /dev/sdb1 /dev/sdb2 /dev/sdb3

使用下列命令可以来验证卷组。

# vgdisplay
  --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               3.02 GiB
  PE Size               4.00 MiB
  Total PE              774
  Alloc PE / Size       0 / 0
  Free  PE / Size       774 / 3.02 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

从输出中,我们可以看见卷组的使用量/总量。物理卷给卷组提供空间。只要在这个卷组中还有可用空间,我们就可以随意创建逻辑卷。

使用下列命令删除卷组。

# vgremove volume-group1

创建逻辑卷(LV)

下列命令创建一个名为’1v1’、大小为100MB的逻辑卷。我们使用小分区减少执行时间。这个逻辑卷使用之前创建的卷组的空间。

# lvcreate -L 100M -n lv1 volume-group1

逻辑卷可使用lvdisplay命令查看。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                YNQ1aa-QVt1-hEj6-ArJX-I1Q4-y1h1-OFEtlW
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

现在逻辑卷已经准备好了,我们可以格式化和挂载逻辑卷,就像其它ext2/3/4分区一样!

# mkfs.ext4 /dev/volume-group1/lv1
# mkdir /lvm-mount
# mount /dev/volume-group1/lv1 /lvm-mount/

一旦逻辑卷挂载,我们就可以到挂载点 /lvm-mount/ 上读写了。要创建和挂载其它的逻辑卷,我们重复这个过程。

最后,使用lvremove我们可以删除逻辑卷。

# umount /lvm-mount/
# lvremove /dev/volume-group1/lv1

扩展一个LVM卷

调整逻辑卷大小的功能是LVM最有用的功能。这个部分会讨论我们怎么样扩展一个存在的逻辑卷。下面,我们将会扩展先前创建的逻辑卷‘lv1’扩大到200MB。

注意,调整逻辑卷大小之后,也需要对文件系统调整大小进行匹配。这个额外的步骤各不相同,取决于创建文件系统的类型。在本文中,我们使用’lv1’创建了ext4类型的文件系统,所以这里的操作是针对ext4文件系统的。(ext2/3文件系统也类同)。命令的执行顺序是很重要的。

首先,我们卸载掉lv1卷

# umount /lvm-mount/

然后,设置卷的大小为200M

# lvresize -L 200M /dev/volume-group1/lv1

接下来,检查磁盘错误

# e2fsck -f /dev/volume-group1/lv1

运行以下命令扩展文件系统以后,ext4信息就更新了。

# resize2fs /dev/volume-group1/lv1

现在,这个逻辑卷应该已经扩展到200MB了。我们检查LV的状态来验证。

# lvdisplay
  --- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                9RtmMY-0RIZ-Dq40-ySjU-vmrj-f1es-7rXBwa
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                200.00 MiB
  Current LE             50
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

现在,这个逻辑卷可以再次挂载,同样这个方法也可用于其他分区。

缩减一个LVM卷

这章节介绍缩减LVM卷大小的方法。命令的顺序同样重要。并且,下列命令对ext2/3/4文件系统同样有效。

注意减少逻辑卷的大小值若小于储存的数据大小,存储在后面的数据会丢失。

首先,卸载掉卷。

# umount /dev/volume-group1/lv1

然后,检测磁盘错误。

# e2fsck -f /dev/volume-group1/lv1

接下来缩小文件系统,更新ext4信息。

# resize2fs /dev/volume-group1/lv1 100M

完成以后,减少逻辑卷大小

# lvresize -L 100M /dev/volume-group1/lv1
WARNING: Reducing active logical volume to 100.00 MiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv1? [y/n]: y Reducing logical volume lv1 to 100.00 MiB Logical volume lv1 successfully resized

最后,验证调整后的逻辑卷大小。

# lvdisplay
--- Logical volume ---
  LV Name                /dev/volume-group1/lv1
  VG Name                volume-group1
  LV UUID                9RtmMY-0RIZ-Dq40-ySjU-vmrj-f1es-7rXBwa
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                100.00 MiB
  Current LE             25
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

扩展一个卷组

本节将讨论扩展卷组的方法,将一个物理卷添加到卷组。让我们假设我们的卷组’volume-group1’已经满了,需要扩大。手上的硬盘(sdb)已经没有其他空闲分区,我们添加了另外一个硬盘(sdc)。我们将看到如何把sdc的分区添加到卷组以扩展。

检测现在卷组状态

# vgdisplay volume-group1
 --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  8
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               3.02 GiB
  PE Size               4.00 MiB
  Total PE              774
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       749 / 2.93 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

首先,我们创建一个2GB分区sdc1,类型为LVM(8e),如教程前所述。

# fdisk /dev/sdc
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +2G

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w
The partition table has been altered!

然后,我们创建一个物理卷 /dev/sdc1

# pvcreate /dev/sdc1

现在,物理卷已经准备好了,我们可以简单地将它增加到已存在的卷组’volume-group1’上。

# vgextend volume-group1 /dev/sdc1

使用vgdisplay来验证(可以看到卷组大小已经增大)。

# vgdisplay
  --- Volume group ---
  VG Name               volume-group1
  System ID
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  9
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               5.03 GiB
  PE Size               4.00 MiB
  Total PE              1287
  Alloc PE / Size       25 / 100.00 MiB
  Free  PE / Size       1262 / 4.93 GiB
  VG UUID               bwd2pS-fkAz-lGVZ-qc7C-TaKv-fFUC-IzGNBK

注意,尽管我们使用一个单独的磁盘做示范,其实只要是‘8e’类型的磁盘分区都可以用来扩展卷组。

总结一下,LVM是一个非常给力的工具,用来创建和管理可变大小的分区。本文中,我们已经介绍了动态分区如何在LVM中创建和使用。我们也介绍了扩展/缩小逻辑卷和卷组的方法,和如何增加一个新的磁盘到LVM。

Linux的logrotate日志轮询原理介绍

对于Linux系统安全来说,日志文件是极其重要的工具。不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具。用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到“转储”作用。可以节省磁盘空间。下面就对logrotate日志轮转操作做一梳理记录:

1. 配置文件介绍

Linux系统默认安装logrotate工具,它默认的配置文件在:

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置文件,logrotate.d 是一个目录,该目录里的所有文件都会被主动的读入/etc/logrotate.conf中执行。
另外,如果 /etc/logrotate.d/ 里面的文件中没有设定一些细节,则会以/etc/logrotate.conf这个文件的设定来作为默认值。

Logrotate是基于CRON来运行的,其脚本是/etc/cron.daily/logrotate,日志轮转是系统自动完成的。
实际运行时,Logrotate会调用配置文件/etc/logrotate.conf。
可以在/etc/logrotate.d目录里放置自定义好的配置文件,用来覆盖Logrotate的缺省值。

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

如果等不及cron自动执行日志轮转,想手动强制切割日志,需要加-f参数;不过正式执行前最好通过Debug选项来验证一下(-d参数),这对调试也很重要

# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

logrotate命令格式:

logrotate [OPTION...] 
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。

根据日志切割设置进行操作,并显示详细信息

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

根据日志切割设置进行执行,并显示详细信息,但是不进行具体操作,debug模式

[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf 
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

查看各log文件的具体执行情况

[root@fangfull_web1 ~]# cat /var/lib/logrotate.status

2. 切割介绍

比如以系统日志/var/log/message做切割来简单说明下:
第一次执行完rotate(轮转)之后,原本的messages会变成messages.1,而且会制造一个空的messages给系统来储存日志;
第二次执行之后,messages.1会变成messages.2,而messages会变成messages.1,又造成一个空的messages来储存日志!
如果仅设定保留三个日志(即轮转3次)的话,那么执行第三次时,则 messages.3这个档案就会被删除,并由后面的较新的保存日志所取代!也就是会保存最新的几个日志。
日志究竟轮换几次,这个是根据配置文件中的dateext 参数来判定的。

看下logrotate.conf配置:

# cat /etc/logrotate.conf
# 底下的设定是 "logrotate 的默认值" ,如果別的文件设定了其他的值,
# 就会以其它文件的设定为主
weekly          //默认每一周执行一次rotate轮转工作
rotate 4       //保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
create         //自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
dateext       //这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式
compress      //是否通过gzip压缩转储以后的日志文件,如xxx.log-20131216.gz ;如果不需要压缩,注释掉就行

include /etc/logrotate.d
# 将 /etc/logrotate.d/ 目录中的所有文件都加载进来

/var/log/wtmp {                 //仅针对 /var/log/wtmp 所设定的参数
monthly                    //每月一次切割,取代默认的一周
minsize 1M              //文件大小超过 1M 后才会切割
create 0664 root utmp            //指定新建的日志文件权限以及所属用户和组
rotate 1                    //只保留一个日志.
}
# 这个 wtmp 可记录用户登录系统及系统重启的时间
# 因为有 minsize 的参数,因此不见得每个月一定会执行一次喔.要看文件大小。

由这个文件的设定可以知道/etc/logrotate.d其实就是由/etc/logrotate.conf 所规划出来的目录,虽然可以将所有的配置都写入/etc/logrotate.conf ,但是这样一来这个文件就实在是太复杂了,尤其是当使用很多的服务在系统上面时, 每个服务都要去修改/etc/logrotate.conf的设定也似乎不太合理了。
所以,如果独立出来一个目录,那么每个要切割日志的服务, 就可以独自成为一个文件,并且放置到 /etc/logrotate.d/ 当中

其他重要参数说明:

  • compress 通过gzip 压缩转储以后的日志
  • nocompress 不做gzip压缩处理
  • copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
  • nocopytruncate 备份日志文件不过不截断
  • create mode owner group 轮转时指定创建新文件的属性,如create 0777 nobody nobody
  • nocreate 不建立新的日志文件
  • delaycompress 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
  • nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
  • missingok 如果日志丢失,不报错继续滚动下一个日志
  • errors address 专储时的错误信息发送到指定的Email 地址
  • ifempty 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
  • notifempty 当日志文件为空时,不进行轮转
  • mail address 把转储的日志文件发送到指定的E-mail 地址
  • nomail 转储时不发送日志文件
  • olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  • noolddir 转储后的日志文件和当前日志文件放在同一个目录下
  • sharedscripts 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
  • prerotate 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
  • postrotate 在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行
  • daily 指定转储周期为每天
  • weekly 指定转储周期为每周
  • monthly 指定转储周期为每月
  • rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
  • dateext 使用当期日期作为命名格式
  • dateformat .%s 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
  • size(或minsize) log-size 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
  • 当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
  • size = 5 或 size 5 (>= 5 个字节就转储)
  • size = 100k 或 size 100k
  • size = 100M 或 size 100M

小示例:下面一个切割nginx日志的配置

[root@master-server ~]# vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
daily
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
    if [ -f /usr/local/nginx/logs/nginx.pid ]; then
        kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    fi
endscript
}

分享一例曾经使用过的nginx日志切割处理脚本

2.1 logrotate日志分割配置:

[root@bastion-IDC ~# vim /etc/logrotate.d/nginx
/data/nginx_logs/*.access_log        
{
nocompress                                   
daily                                  
copytruncate                                  
create                              
ifempty                                   
olddir /data/nginx_logs/days           
rotate 0                                        
}

2.2 日志分割脚本

[root@bastion-IDC ~# vim /usr/local/sbin/logrotate-nginx.sh
#!/bin/bash
#创建转储日志压缩存放目录
mkdir -p /data/nginx_logs/days
#手工对nginx日志进行切割转换
/usr/sbin/logrotate -vf /etc/logrotate.d/nginx
#当前时间
time=$(date -d "yesterday" +"%Y-%m-%d")
#进入转储日志存放目录
cd /data/nginx_logs/days
#对目录中的转储日志文件的文件名进行统一转换
for i in $(ls ./ | grep "^(.*).[[:digit:]]$")
do
mv ${i} ./$(echo ${i}|sed -n 's/^(.*).([[:digit:]])$/1/p')-$(echo $time)
done
#对转储的日志文件进行压缩存放,并删除原有转储的日志文件,只保存压缩后的日志文件。以节约存储空间
for i in $(ls ./ | grep "^(.*)-([[:digit:]-]+)$")
do
tar jcvf ${i}.bz2 ./${i}
rm -rf ./${i}
done
#只保留最近7天的压缩转储日志文件
find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} ;

2.3 crontab定时执行

[root@bastion-IDC ~# crontab -e
#logrotate
0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1

手动执行脚本,测试下看看:

[root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
[root@bastion-IDC ~# cd /data/nginx_logs/days
[root@bastion-IDC days# ls
huantest.access_log-2017-01-18.bz2

php脚本

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/php
/Data/logs/php/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
        if [ -f /Data/app/php5.6.26/var/run/php-fpm.pid ]; then
            kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid`
        fi
    endscript
    postrotate
        /bin/chmod 644 /Data/logs/php/*gz
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid
-rw-r--r-- 1 root root 4 Dec 28 17:03 /Data/app/php5.6.26/var/run/php-fpm.pid

[root@huanqiu_web1 ~]# cd /Data/logs/php
[root@huanqiu_web1 php]# ll
total 25676
-rw-r--r-- 1 root   root         0 Jun  1  2016 error.log
-rw-r--r-- 1 nobody nobody     182 Aug 30  2015 error.log-20150830.gz
-rw-r--r-- 1 nobody nobody     371 Sep  1  2015 error.log-20150901.gz
-rw-r--r-- 1 nobody nobody     315 Sep  7  2015 error.log-20150907.gz
.........
.........

nginx日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx
/Data/logs/nginx/*/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
    /etc/init.d/nginx reload
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/logs/nginx/www.huanqiu.com/
..........
-rw-r--r-- 1 root root      1652 Jan  1 00:00 error.log-20170101.gz
-rw-r--r-- 1 root root      1289 Jan  2 00:00 error.log-20170102.gz
-rw-r--r-- 1 root root      1633 Jan  3 00:00 error.log-20170103.gz
-rw-r--r-- 1 root root      3239 Jan  4 00:00 error.log-20170104.gz

系统日志

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

[root@huanqiu_web1 ~]# ll /var/log/messages*
-rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages
-rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225
-rw------- 1 root root 51800210 Jan  1 03:05 /var/log/messages-20170101
-rw------- 1 root root 51981366 Jan  8 03:36 /var/log/messages-20170108
-rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115
[root@huanqiu_web1 ~]# ll /var/log/cron*
-rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron
-rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225
-rw------- 1 root root 2939305 Jan  1 03:06 /var/log/cron-20170101
-rw------- 1 root root 2951820 Jan  8 03:37 /var/log/cron-20170108
-rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115
[root@huanqiu_web1 ~]# ll /var/log/secure*
-rw------- 1 root root  275343 Jan 19 18:36 /var/log/secure
-rw------- 1 root root 2111936 Dec 25 03:06 /var/log/secure-20161225
-rw------- 1 root root 2772744 Jan  1 02:57 /var/log/secure-20170101
-rw------- 1 root root 1115543 Jan  8 03:26 /var/log/secure-20170108
-rw------- 1 root root  731599 Jan 15 03:40 /var/log/secure-20170115
[root@huanqiu_web1 ~]# ll /var/log/spooler*
-rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler
-rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225
-rw------- 1 root root 0 Dec 25 03:11 /var/log/spooler-20170101
-rw------- 1 root root 0 Jan  1 03:06 /var/log/spooler-20170108
-rw------- 1 root root 0 Jan  8 03:37 /var/log/spooler-20170115

tomcat日志

[root@huanqiu-backup ~]# cat /etc/logrotate.d/tomcat
/Data/app/tomcat-7-huanqiu/logs/catalina.out {
rotate 14
daily
copytruncate
compress
notifempty
missingok
}

[root@huanqiu-backup ~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
-rw-r--r--. 1 root root     0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out
-rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

早期用过的nginx日志

[root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh
#!/bin/bash
# 你的日志文件存放目录
logs_path="/letv/logs/"
# 日志文件的名字,多个需要空格隔开
logs_names=(error access pv_access)
dates=`date -d "yesterday" +"%Y%m%d"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i /dev/null 2>$1

3. 尝试解决logrotate无法自动轮询日志的办法

现象说明:
使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,这是为什么呢??
然后开始检查日志切割的配置文件是否有问题,检查后确定配置文件一切正常。
于是怀疑是logrotate预定的cron没执行,查看了cron的日志,发现有一条Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)这样的日志,证明cron在04:02分时已经执行/etc/cron.daily目录下的程序。
接着查看/etc /cron.daily/logrotate(这是logrotate自动轮转的脚本)的内容:

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

没有发现异常,配置好的日志轮转操作都是由这个脚本完成的,一切运行正常,脚本应该就没问题。
直接执行命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

这些系统日志是正常轮询了,但nginx日志却还是没轮询

接着强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将 -t 参数替换成 -f 参数

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

最后最后重启下cron服务:

[root@huanqiu_test ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]

logrotate的日志每天切割都是默认在凌晨3点进行,现在需要将切割时间调整到每天的晚上12点,即每天切割的日志是前一天的0-24点之间的内容。
按照下面的方法几乎做到了安全按照每天来清晰的分隔日志:

1. 去掉了/etc/cron.daily/logrotate 
2. 直接crontab -e
#log logrotate
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nginx >/dev/null 2>&1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/tomcat >/dev/null 2>&1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog >/dev/null 2>&1

安装配置KVM虚拟机

1、硬件环境检测

grep -E –color ‘vmx|svm’ /proc/cpuinfo

有输出代表cpu支持

2、软件包安装

yum install qemu-kvm qemu-img libvirt-python python-virtinst libvirt-client virt-viewer bridge-utils

—>少了一些组件也可

yum groupinstall -y Virtualization “Virtualization Client” “Virtualization Platform” “Virtualization Tools”

使用桥接网络安装bridge-utils包

yum -y install bridge-utils

3、关闭防火墙对IPv6支持并关闭selinux功能

chkconfig ip6tables off
setenforce 0 临时关闭
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

4、查看模块并启动进程

查看KVM模块:lsmod | grep kvm
service libvirtd restart启动libvirt进程
modprobe kvm
modprobe kvm-intel
modprobe -ls | grep kvm

5、将网卡模式修改为桥接模式

首先复制原em1和em2网卡为br1和br2,将em1的配置文件修改为:

DEVICE=”em1“
BOOTPROTO=”static”
HWADDR=”30:85:A9:9F:67:74″
NM_CONTROLLED=”no”
ONBOOT=”yes”
TYPE=”Ethernet”
UUID=”34096e10-ff72-4142-b7b3-e290d200b68a”
BRIDGE=”br1″
命令:virsh iface-bridge em3 br3

虚拟安装脚本create_kvm.sh内容:

virt-install 
–name Test 
–ram 1536 
–vcpus=1 
–disk path=/data/img/kvm_Test.img,size=50 
–network bridge=br0 
–cdrom=/opt/iso/CentOS-6.8-x86_64-minimal.iso 
–accelerate 
–vnclisten=0.0.0.0 
–vncport=5911 
–vnc

启动虚机:

virsh start Test

查看虚拟状态:

virsh list –all

raw转换为qcow2格式:

qemu-img convert -f raw -0 qcow2 /data/img/kvm-Test.img /data/img/kvm-Test.qcow2
确认:
qemu-img info /data/img/kvm-Test.qcow2

修改虚机配置文件:

virsh edit Test

复制(克隆)一台虚拟服务器:

virt-clone -o Test -n Test -f /data/img/kvm-Test1.qcow2

虚机当前运行产生的相关文件所在目录:

/var/run/libvirt/qemu/
/etc/libvirt/qemu配置文件目录
virsh shutdown Test

如果报错,先暂停该虚机业务

virsh suspend Test
cp -av /data/img/kvm-Test1.qcow2  /data/img/kvm-Test2.qcow2
virsh dumpxml Test1 > /etc/libvirt/qemu/Test2.xml
virsh define /etc/libvirt/qemu/Test2.xml

虽然克隆完毕,但我们还不能启动,需编辑配置文件先修改vnc端口

virsh edit Test2

注意:与其他虚拟服务器vnc端口不一致而且要在可用范围内。
保存配置后尝试启动

virsh start Test2

通过vnc viewer连接
ifconfig命令查看后发现没网卡相关信息

more /etc/udev/rules.d/70-persistent-net.rules >>/etc/sysconfig/network-scripts/ifcfg-eth0

然后修改MAC地址和对应IP并注释无关代码后保存

service network restart

重启服务:

service libvirtd restart

再次尝试启动虚拟机Test2(略)

yum install -y acpid
service acpid start
chkconfig acpid on

kvm 基础镜像与增量镜像

KVM虚拟机的基本镜像和增量镜像

1、概述

实验目的:通过一个基础镜像(node.img),里面把各个虚拟机都需要的环境都搭建好,然后基于这个镜像建立起一个个增量镜像,每个增量镜像对应一个虚拟机,虚拟机对镜像中所有的改变都记录在增量镜像里面,基础镜像始终保持不变。
功能:节省磁盘空间,快速复制虚拟机。
环境:
基本镜像文件:node.img 虚拟机ID:node
增量镜像文件:node4.img 虚拟机ID:node4
要求:以基本镜像文件node.omg为基础,创建一个镜像文件node4.img,以此创建一个虚拟机机node4,虚拟机node4的改变将存储于node4.img中。

2、创建增量镜像文件

[root@target kvm_node]#qemu-img create -b node.img -f qcow2 node4.img
[root@target kvm_node]# qemu-img info node4.img 
image: node4.img
file format: qcow2
virtual size: 20G (21495808000 bytes)
disk size: 33M
cluster_size: 65536
backing file: node.img (actual path: node.img)

注:该实验只是针对qcow2格式的镜像文件,未测试raw格式的镜像文件是否可行。

3、创建虚拟机node4的XML配置文件

[root@target kvm_node]# cp /etc/libvirt/qemu/node.xml /etc/libvirt/qemu/node4.xml
[root@target kvm_node]# vim /etc/libvirt/qemu/node4.xml 
<domain type='kvm'>
  <name>node4</name>                                  #node4的虚拟机名,须修改,否则与基本虚拟机冲突
  <uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fe4</uuid>   #node4的UUID,必须修改,否则与基本虚拟机冲突
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu cpuset='0-1'>2</vcpu>
  <os>
    <type arch='x86_64' machine='rhel5.4.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='localtime'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/virhost/kvm_node/node4.img'/>    #将原指向/virhost/kvm_node/node.img改为node4.img
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <interface type='bridge'>
      <mac address='54:52:00:69:d5:f4'/>             #修改网卡MAC,防止冲突
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='54:52:00:69:d5:e4'/>            #修改网卡MAC,防止冲突
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0' passwd='xiaobai'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>

4、根据xml配置定义虚拟机node4

[root@target kvm_node]#virsh define /etc/libvirt/qemu/node4.xml
[root@target kvm_node]#virsh start node4  

5、测试

[root@target kvm_node]# du -h node.img

6.3G node.img

[root@target kvm_node]# du -h node4.img

33M node4.img

[root@node4 ~]# dd if=/dev/zero of=test bs=1M count=200   #在虚拟机node4上增量200M大小文件
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 1.00361 seconds, 209 MB/s
[root@target kvm_node]# du -h node.img                    #基本镜像文件node.img大小未变

6.3G node.img

[root@target kvm_node]# du -h node.img                    #增量镜像文件node4.img增加200M了
234M    node4.img

KVM虚拟机virsh管理常用命令

管理kvm虚拟机

常用的虚拟机管理命令

  • 列出所有的虚拟机
1  virsh list --all
  • 显示虚拟机信息
1  virsh dominfo kvm-1
  • 显示虚拟机内存和cpu的使用情况
1  yum install virt-top -y
2  virt-top
  • 显示虚拟机分区信息
1  virt-df kvm-1
  • 关闭虚拟机(shutodwn)
1  virsh shutdown kvm-1
  • 启动虚拟机
1  virsh start kvm-1
  • 设置虚拟机(kvm-1)跟随系统自启
1  virsh autostart kvm-1
  • 关闭虚拟及自启
1  virsh autostart --disable kvm-1
  • 删除虚拟机
1  virsh undefine kvm-1
  • 通过控制窗口登录虚拟机
virsh console kvm-1

给虚拟机添加硬盘

添加硬盘(lvm卷)或者USB到虚拟机上

1  virsh attach-disk kvm-1 /dev/sdb vbd --driver qemu --mode shareable
  • 使用完成之后可以卸载usb
1  virsh detach-disk kvm vdb

添加lvm卷,并挂载

[root@sh-kvm-1 ~]# lvcreate -n kvm-1-data -L 50G vg_shkvm1
[root@sh-kvm-1 ~]# virsh attach-disk kvm-1 /dev/vg_shkvm1/kvm-1-data vdb --driver qemu --mode shareable
Disk attached successfully
# 登录到kvm-1上查看lvm是否已经被挂载
[root@sh-kvm-1 ~]# virsh console kvm-1 # 输入kvm-1的用户和密码
[root@sh-kvm-1-1 ~]# fdisk -l # 查看硬盘挂载情况

Disk /dev/vda: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00058197

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *           3        1018      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/vda2            1018       41611    20458496   8e  Linux LVM
Partition 2 does not end on cylinder boundary.

Disk /dev/mapper/VolGroup-lv_root: 18.8 GB, 18798870528 bytes
255 heads, 63 sectors/track, 2285 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/VolGroup-lv_swap: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/vdb: 53.7 GB, 53687091200 bytes  # 新添加的硬盘
16 heads, 63 sectors/track, 104025 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
  • 格式化新添加的vdb,并添加到lvm组中
# 对新添加的硬盘分区
[root@sh-kvm-1-1 ~]# fdisk /dev/vdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf04b6807.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): m  # 查看帮助
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)
Command (m for help): n  #添加一个分区
Command action
   e   extended
   p   primary partition (1-4)
p  #选择添加一个扩展分区
Partition number (1-4):
Value out of range.
Partition number (1-4): 1
First cylinder (1-104025, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-104025, default 104025):
Using default value 104025

Command (m for help): t  #改变分区的格式
Selected partition 1
Hex code (type L to list codes): 8e  #改成lvm
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w  # 保存更改
root@sh-kvm-1-1 ~]# mkfs.ext4 /dev/vdb1  # 格式化分区
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3276800 inodes, 13107142 blocks
655357 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
400 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@sh-kvm-1-1 ~]# pvc reate /dev/vdb1   # 创建pv
vdb   vdb1
[root@sh-kvm-1-1 ~]# vgextend VolGroup /dev/vdb  # 扩展lvm vg
vdb   vdb1
[root@sh-kvm-1-1 ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree
  VolGroup   2   2   0 wz--n- 69.50g 50.00g
# 从上面能看出,新添加的 已经加到lvm组中

改变虚拟机的参数

通过命令行更改创建之后虚拟机的内存,cpu等信息

  • 更改内存
# 1. 查看虚拟机当前内存
[root@sh-kvm-1 ~]# virsh dominfo kvm-1 | grep memory
Max memory:     4194304 KiB
Used memory:    4194304 KiB

# 2、动态设置内存为512MB,内存减少
virsh setmem kvm-1 524288
# 注意单位必须是KB

# 3、查看内存变化
# virsh dominfo kvm-1 | grep memory
Max memory: 14194304 KiB
Used memory: 524288 kiB

# 4、内存增加
virsh shutdown kvm-1
virsh edit kvm-1  # 直接更改memory
virsh create /etc/libvirt/demu/kvm-1/xml
# 之后操作1,2,3步骤增加内存
  • 更改CPU

需要修改配置文件,因此需要停止虚拟机

virsh shutdown kvm-1
virsh edit kvm-1
#  2  # 4 &gt; 2
virsh create /etc/libvirt/demu/kvm-1/xml
  • 硬盘扩容
1. Create a 10-GB non-sparse file:
# dd if=/dev/zero of=/vm-images/vm1-add.img bs=1M count=10240
2. Shutdown the VM:
 # virsh shutdown vm1
3. Add an extra entry for ‘disk’ in the VM's XML file in /etc/libvirt/qemu. You can look copy &amp; paste
the entry for your mail storage device and just change the target and address tags. For example:
 # virsh edit vm1




 <address />

 Add:




 <address />

 # 这里建议使用上面的添加硬盘的方式添加

删除虚拟机

  • 第一步,停掉虚拟机
1  virsh shutdown kvm-1
  • 第二步
1  virsh destroy kvm-1
  • 第三步
1  virsh undefine kvm-1
  • 第四部
1  rm /dev/vg_shkvm1/kvm-1  # 不建议删除硬盘

CentOS7 nginx keepalived主备实例配置

nginx1 ip:192.168.12.4 #MASTER
nginx2 ip:192.168.12.10 #BACKUP
nginx_vip :192.168.12.100

原理可参考:
http://www.keepalived.org/documentation.html
系统为CentOS7

1、配置一下yum源

curl -L http://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/CentOS-Base.repo
curl -L http://mirrors.aliyun.com/repo/epel-7.repo > /etc/yum.repos.d/epel.repo

yum -y install keepalived nginx

2、设置服务器基本环境

关闭防火墙:iptables -F;service iptables save
关闭seLinux:setenforce 0;sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

3、配置一下nginx,好区分测试环境

192.168.12.4:
echo 192.168.12.4 > /usr/share/nginx/html/index.html

192.168.12.10:
echo 192.168.12.10 > /usr/share/nginx/html/index.html

4、配置keepalived.conf

[[email protected]]# cat keepalived.conf 
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_script check_nginx {
script "sh /etc/keepalived/check_nginx.sh" 
interval 2 
}

vrrp_instance VI_1 {
state MASTER
interface eth0
mcast_src_ip 192.168.12.4
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.12.100
}
track_script {
check_nginx
}
}

[[email protected]]# cat keepalived.conf 
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_script check_nginx {
script "sh /etc/keepalived/check_nginx.sh" 
interval 2 
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
mcast_src_ip 192.168.12.10
virtual_router_id 51
priority 99
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.12.100
}
track_script {
check_nginx
}
}

脚本check_nginx.sh内容如下

#!/bin/bash

A=`pgrep nginx|wc -l` 
if [ $A -eq 0 ];then 
/bin/systemctl start nginx.service
if [ `pgrep nginx|wc -l` -eq 0 ];then
/bin/systemctl stop keepalived.service
fi
fi

5、启动

在两个服务器执行启动命令

service nginx start
service keepalived start

6、检查

[[email protected] keepalived]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:85:83:e8 brd ff:ff:ff:ff:ff:ff
inet 192.168.12.4/24 brd 192.168.12.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.12.100/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe85:83e8/64 scope link 
valid_lft forever preferred_lft forever
[[email protected] keepalived]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:62:6a:50 brd ff:ff:ff:ff:ff:ff
inet 192.168.12.10/24 brd 192.168.12.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe62:6a50/64 scope link 
valid_lft forever preferred_lft forever

仔细观察可以发现192.168.12.4的服务器多了一个IP,就是192.168.12.100,这个就是VIP
再看日志发现主服务器日志有这下面一条:

Jul 12 10:30:57 localhost Keepalived_vrrp[2510]: VRRP_Instance(VI_1) Entering MASTER STATE

备服务器日志

Jul 11 00:01:00 localhost Keepalived_vrrp[111937]: VRRP_Instance(VI_1) Entering BACKUP STATE

综上主备已搭建成功

7、模拟主nginx宕机