RAID及LVM的实现

RAID介绍及创建

1、mdadm工具

mdadm [mode] <raid device> [options] <任意块设备>
   [mode] 
         -C : 创建
         -A : 装配
         -F : 监控
         管理模式
             -f : 标记指定磁盘为损坏
             -a : 添加磁盘
             -r : 移除磁盘
     -C : 创建模式
         -n# : 使用#个设备来创建此RAID
         -l# : 指明要创建的RAID级别
         -a [yes | no] : 是否自动创建设备文件
         -c : 指明块大小
         -x# : 指明空闲盘个数
         -D : 显示RAID的详细信息

先介绍一下一些常见RAID阵列

     RAID 0
             利用率为100%
             无容错能力
             最小磁盘数 2
     RAID 1  
             利用率为50%
             有冗余能力
             最少磁盘数 2
     RAID 5  
             利用率为(n-1)/n ,有一块作为备用
             有容错能力
             最少磁盘数 3
     RAID 10
             利用率为50%
             有容错能力,但每组镜像只能坏一块
             最少磁盘 4

2、创建并定义RAID设备

这里以创建RAID 5为例

开始工作: 准备系统磁盘,这里小编已经先做好了,并将系统ID改为RAID类型

如下:

Device Boot         Start         End      Blocks   Id  System
/dev/sdb1               1         262     2104483+  fd  Linux raid autodetect
/dev/sdb2             263         524     2104515   fd  Linux raid autodetect
/dev/sdb3             525         786     2104515   fd  Linux raid autodetect
/dev/sdb4             787        1048     2104515   fd  Linux raid autodetect

(1)、 在/dev下创建RAID5命名为md0,且设为开机自动创建,模式为RAID 5 使用3个设备创建此RAID,/dev/sdb4作为备用

mdadm -C /dev/md0 -a yes -l5 -n3 -x1 /dev/sdb{1,2,3,4}

(2)、 对创建的md0设备进行格式化

mke2fs -j /dev/md0

(3)、 将/dev/md0进行挂载,就可以进行使用了

到此RAID 5 很简单的就创建完毕

(4)、 可以通过命令来查看RAID的设备状况

         mdadm -D /dev/md0

        [root@Centos6 ~]#mdadm -D /dev/md0
        /dev/md0 :
         Version : 1.2
   Creation Time : Mon Aug 14 12:44:33 2017
      Raid Level : raid5                        # RAID 5模式
      Array Size : 4204544 (4.01 GiB 4.31 GB)     
   Used Dev Size : 2102272 (2.00 GiB 2.15 GB)    # 使用的设备大小
    Raid Devices : 3                            # RAID 设备数
   Total Devices : 4                            # RAID 总设备数
     Persistence : Superblock is persistent

     Update Time : Mon Aug 14 12:44:56 2017
           State : clean                        # 是否被破坏
  Active Devices : 3                            # 活动设备
 Working Devices : 4                            # 工作设备
  Failed Devices : 0                            # 损坏设备
   Spare Devices : 1                            # 空闲设备

          Layout : left-symmetric
      Chunk Size : 512K                            # chunk(块)大小

            Name : Centos6.9ymd:0  (local to host Centos6.9ymd)
            UUID : 7d8465ed:f8b2c03b:8e7e2a82:0af865ee
          Events : 18

     Number   Major   Minor   RaidDevice State
        0       8       17        0      active sync   /dev/sdb1  # 活动设备
        1       8       18        1      active sync   /dev/sdb2  # 活动设备
        4       8       19        2      active sync   /dev/sdb3  # 活动设备

        3       8       20        -      spare   /dev/sdb4        # 空闲设备

(5)、 如若在最开始创建的时候并没有备用的设备,我们可以在设备中增添新成员,增加容错能力

mdadm  -G  /dev/md0  -n4 -a /dev/add

(6)、 生成配置文件,以备我们将其停止后能够重新启动它

mdadm -Ds >> /etc/mdadm.conf 

(7)、 停止RAID设备

mdadm -S /dev/md0 

(8)、重新启动RAID设备

mdadm -As /dev/md0

3、那么创建好后,怎样删除它呢?

(1)、 首先我们需要将其卸载

umount /dev/md0

(2)、 停止RAID设备

mdadm -S /dev/md0 

(3)、 删除配置文件

rm -rf /etc/mdadm.conf

(4)、 删除RAID,清除其成员的元信息

mdadm --zero-superblock /dev/sdb{1,2,3,4}

(5)、如果在/etc/fstab文件中增加了开机自动加载的信息则还要将其删除

LVM的实现

1、基本命令

  • 创建及删除物理卷LV
pvcreate  device 
pvremove  device 
  • 创建卷组VG
vgcreate vgname device
    vgname : 为自己指定的vg名称
    -s # : 可指定PE的大小,默认为4M 
  • 管理卷组
vgextend  vgname  device  在vg内添加pv
vgreduce  vgname  device  在vg内移除pv
vgchange                  配置vg是否启动
vgremove  device          删除一个vg
vgs | vgdisplay           查看vg信息
  • 创建逻辑卷LV
lvcreate  [options] [lvname] device 
    [options]
        -L # [+][G,g,T,t,M,m] 改变LV容量
        -l #% VG              以百分比形式改变容量
        -n name               设置LV名字
lvextend          增加LV容量
lvreduce          削减LV容量
lvremove          删除一个LV
lvresize          调整lv容量大小
lvs | lvdisplay   查看lv信息
  • 挂载使用逻辑卷

2、接下来我们开始逻辑卷的创建

将自己创建的过程及相关命令列出

如下:

  • 创建pv
[root@Centos6 ~]#pvcreate /dev/sdb{1..4}
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
Physical volume "/dev/sdb3" successfully created
Physical volume "/dev/sdb4" successfully created

[root@Centos6 ~]#pvs
PV         VG   Fmt  Attr PSize PFree 
/dev/sdb1  vg0  lvm2 a--u 2.00g     0 
/dev/sdb2  vg0  lvm2 a--u 2.00g     0 
/dev/sdb3  vg0  lvm2 a--u 2.00g     0 
/dev/sdb4  vg0  lvm2 a--u 2.00g 16.00m
  • 创建vg
[root@Centos6 ~]#vgcreate vg0 /dev/sdb{1..4}
Volume group "vg0" successfully created

[root@Centos6 ~]#vgs
VG   #PV #LV #SN Attr   VSize VFree
vg0    4   1   0 wz--n- 8.02g 16.00m
  • 创建lv
[root@Centos6 ~]#lvcreate -L +8G -n lv0 vg0
Logical volume "lv0" created.

[root@Centos6 ~]#lvdisplay 
--- Logical volume ---
LV Path                /dev/vg0/lv0
LV Name                lv0
VG Name                vg0
LV UUID                NfI3VT-QXop-Ju9V-qdzT-jZOj-Okmz-lcDAAf
LV Write Access        read/write
LV Creation host, time Centos6.9ymd, 2017-08-17 06:11:37 +0800
LV Status              available
# open                 0
LV Size                8.00 GiB
Current LE             2048
Segments               4
Allocation             inherit
Read ahead sectors     auto
- currently set to     256
Block device           253:0

3、LV扩容及缩减

(1)、扩容LV

  • 创建系统ID是LVM的分区

这里以/dev/sdc1为例

  • 将/dev/sdc1变成物理卷
pvcreate /dev/sdc1
  • 将其加入卷组中
vgcreate vg0 /dev/sdc1
  • 扩容LV
lvextend  -L +#G  /dev/vg0/lv0
  • 同步文件系统(当在磁盘上看不到增加的容量时可用)
resize2fs  /dev/vg0/lv0 #G 

也可将4、5合并成以下命令来代替

lvextend -r -L +#G  /dev/vg0/lv0

(2)、缩减LV

  • 卸载已经挂载的lv
umount
  • 强制进行磁盘检测
e2fsck -f /dev/vg0/lv0
  • 同步文件系统
resize2fs  /dev/vg0/lv0  #G
  • 缩减LV
lvreduce  -L #G  /dev/vg0/lv0 
  • 挂载重新使用
mount

4、如何跨主机迁移卷组到新系统

首先要确定被迁移的卷组是否与新卷组名称冲突,如果冲突则先要更改名字

vgrename  vg0   newvg0name
  • 先卸载被挂载的逻辑卷
umount
  • 禁用卷组中的所有逻辑卷
vgchange -an vg0
  • 让卷组处于导出状态
vgexport  vg0
  • 关机拆除硬盘,出入新的系统

  • 导入转移的vg0

vgimport vg0
  • 激活逻辑卷
vgchange -ny vg0 
  • 挂载使用

5、逻辑卷快照

快照,顾名思义,保存当前的状态,以备以后能够还原到当前的状态,其原理这里不再赘述

  • 为现有的LV创建快照
lvcreate  -s  -l 60  -n /dev/vg0/data  -p r /dev/vg0/lv0 
    -s : 创建快照
    -l : 使用PE数量,作为快照区使用
    -n : 快照区设备名称
    -p r : 设定快照为只读属性
  • 挂载快照
mount -o ro /dev/vg0/data  /mnt/snap 
  • 恢复快照
lvconvert --merge  /dev/vg0/data

LVM逻辑卷快照备份

一、简介

由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:

  • 是一种数据库管理系统

  • 是一种关联数据库管理系统

  • 是一种开放源码软件,且有大量可用的共享MySQL软件

  • MySQL数据库服务器具有快速、可靠和易于使用的特点

  • MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中

InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB。

二、MySQL备份之LVM逻辑卷快照备份

1、通过LVM逻辑卷实现MySQL备份及还原(几乎热备)

前提:

  • 数据文件要在逻辑卷上;

  • 此逻辑卷所在卷组必须有足够的空间使用快照卷;

  • 数据文件和事务日志要在同一个逻辑卷上;

2、LVM快照备份步骤:

2.1 打开会话,施加读锁,锁定所有表;

mysql> FLUSH TABLES WITH READ LOCK;  #刷新表并对表施加读锁

mysql> FLUSH LOGS;   #滚动日志

2.2 通过另一个终端,保存二进制日志文件及相关位置信息;

[root@lamp ~]# mysql -uroot -p -e 'SHOW MASTER STATUSG' > /path/to/master.info  

     #不登录mysql客户端直接查看位置状态,并保存位置信息到相应目录

[root@lamp ~]# cat /tmp/master.info

*************************** 1. row ***************************

            File: mysql-bin.000005

        Position: 107

    Binlog_Do_DB: 

Binlog_Ignore_DB: 

2.3 创建快照卷

[root@lamp ~]# lvcreate -L SIZE -s -p r -n LV_NAME /path/to/source_lv #创建快照卷

-s: 指定为所创建的是快照卷s=snapshot快照;  -p: 指定权限p=permission许可;

r: 读权限;      -n: 指定快照名称;    LV_NAME: 快照名称;

/path/to/source_lv: 针对哪个逻辑卷目录;   -L: 指定快照卷大小

2.4 释放锁

mysql> UNLOCK TABLES;   #释放锁

2.5 挂载快照卷,并备份;

mount /dev/myvg/mydata-snap  /mnt -o ro  #挂载快照卷至/mnt目录,只读挂载

cp -a ./* /backup/full-backup-2017-06-06/  #挂载后把数据复制到备份目录, -a:表示

复制文件的所有属性及内容,保留源文件的所有属性及权限

2.6 删除快照卷

umount /mnt  #备份完后卸载快照卷挂载的目录

lvremove --force /dev/myvg/mydata-snap  #强制移除快照卷

rm -rf mysql-bin.*    #把备份目录中的日志文件删除掉,节省空间

2.7 增量备份二进制日志

mysqlbinlog --start-datetime='2017-06-06 10:11:02' mysql-bin.000005 mysql-bin.000006 > /backup/incremental-`date +%F-%H-%M-%S`.sql  #备份二进制日志,如果增量备份的二进制日志

含有2个或以上的日志文件,需要通过指定开始时间点来备份。

3、LVM快照备份实例演示

3.1 首先打开mysql客户端

[root@lamp ~]# mysql    #打开mysql客户端

mysql> FLUSH TABLES WITH READ LOCK;  #首先刷新表并施加读锁

Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH LOGS;   #滚动日志

Query OK, 0 rows affected (0.06 sec)

mysql> SHOW MASTER STATUS;  #查看二进制日志位置状态

+------------------+----------+--------------+------------------+

| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000005 |  107 |       |        |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

3.2 不退出或关闭此mysql客户端,重新打开一个服务器终端,执行位置信息的保存;

[root@lamp ~]# mkdir /backup   #新建一个备份目录

[root@lamp ~]# mysql -e 'SHOW MASTER STATUSG;' > /backup/master-`date +%F`.info 

    #不登录mysql客户端,直接通过mysql -e直接编辑数据库,把查看二进制日志位置状态备份

[root@lamp ~]# ls -lh /backup/

total 4.0K

-rw-r--r--. 1 root root 158 Jun 22 15:02 master-2017-06-22.info

3.3 对mysql数据目录执行快照(数据文件必须是存放在逻辑卷上)

[root@lamp ~]# lvcreate -L 50M -s -p r -n mydata-snap /dev/myvg/mydata

  Rounding up size to full physical extent 52.00 MiB

  Logical volume "mydata-snap" created

   #对/dev/myvg/mydata逻辑卷做快照,大小为50M,

   -s:表示snapshot快照; -p:指定权限permission;r:读的权限read; -n:指定快照卷的名称


[root@lamp ~]# lvs      #查看逻辑卷,刚新建的快照逻辑卷

  LV       VG    Attr   LSize  Origin Snap%  Move Log Copy%  Convert

  mydata    myvg  owi-ao   10.00g 

 mydata-snap  myvg  sri-a-  52.00m mydata   0.02 

[root@lamp ~]# mount       #查看挂载相关信息

/dev/sda7 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")

/dev/sda1 on /boot type ext4 (rw)

/dev/sda3 on /home type ext4 (rw)

/dev/sda5 on /tmp type ext4 (rw)

/dev/sda2 on /usr/local type ext4 (rw)

/dev/mapper/myvg-mydata on /mydata type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

3.4 执行完快照后,即可解锁表;

mysql> UNLOCK TABLES;    #解锁

Query OK, 0 rows affected (0.00 sec)

对快照进行挂载并备份;

[root@lamp ~]# mount /dev/myvg/mydata-snap  /mnt -o ro  #以只读方式挂载刚做的快照卷

[root@lamp ~]# cd /mnt  #进入挂载目录

[root@lamp mnt]# ls

data  lost+found

[root@lamp mnt]# cd data/

[root@lamp data]# ls

hellodb      ib_logfile1  lamp.pid  mysql-bin.000001  mysql-bin.000004  performance_schema  testdb    ibdata1      jiaowu       mydb      mysql-bin.000002  mysql-bin.000005  stu

ib_logfile0  lamp.err     mysql     mysql-bin.000003  mysql-bin.index   test

[root@lamp data]# mkdir /backup/full-backup-`date +%F`  #创建备份目录并以时间格式命名

[root@lamp data]# cp -a ./* /backup/full-backup-2017-06-06/  #-a:复制当前目录的所有内容及其权限属性到备份的目录

[root@lamp data]# cd 

[root@lamp ~]# umount /mnt  #卸载挂载的目录/mnt

[root@lamp ~]# lvremove --force /dev/myvg/mydata-snap  #移除刚才创建的快照卷--force强制性

  Logical volume "mydata-snap" successfully removed

[root@lamp ~]# cd /backup/full-backup-2017-06-06/

[root@lamp full-backup-2017-06-06]# ls

hellodb      ib_logfile1  lamp.pid  mysql-bin.000001  mysql-bin.000004  performance_schema  testdb   ibdata1      jiaowu       mydb      mysql-bin.000002  mysql-bin.000005  stu

ib_logfile0  lamp.err     mysql     mysql-bin.000003  mysql-bin.index   test

[root@lamp full-backup-2017-06-06]# rm -rf mysql-bin.*   #删除相关的二进制日志文件以便节省空间

[root@lamp full-backup-2017-06-06]# ls

hellodb  ib_logfile0  jiaowu    lamp.pid  mysql               stu   testdb

ibdata1  ib_logfile1  lamp.err  mydb      performance_schema  test

root@lamp ~]# cd /mydata/data

[root@lamp data]# ls

hellodb      ib_logfile1  lamp.pid  mysql-bin.000001  mysql-bin.000004  performance_schema  testdb     ibdata1      jiaowu       mydb      mysql-bin.000002  mysql-bin.000005  stu

ib_logfile0  lamp.err     mysql     mysql-bin.000003  mysql-bin.index   test

[root@lamp data]# cat /backup/master-2017-06-06.info 

*************************** 1. row ***************************

            File: mysql-bin.000005  #记录的二进制日志文件

        Position: 107    #二进制日志的位置

    Binlog_Do_DB: 

Binlog_Ignore_DB: 

mysql> FLUSH LOGS;  #滚动日志

Query OK, 0 rows affected (0.01 sec)

mysql> USE jiaowu 

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> INSERT INTO tutors(Tname) VALUES ('stu0003');  #往表tutors中插入数据,字段Tname 值stu0003

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tutors(Tname) VALUES ('stu0004');  #往表tutors中插入数据,字段Tname 值stu0004

Query OK, 1 row affected (0.00 sec)

mysql> SHOW MASTER STATUS;  #查看此时二进制日志的位置状态信息 

+------------------+----------+--------------+------------------+

| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000006 |  575 |       |        |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql> q

Bye

[root@lamp data]# mysqlbinlog --start-datetime='2017-06-06 10:11:02' mysql-bin.000005 mysql-bin.000006 > /backup/incremental-`date +%F-%H-%M-%S`.sql  

#导出二进制日志文件bin.000005和bin.000006时间点从2017-06-06 10:11:02开始后的内容

[root@lamp data]# ls /backup/incremental-2017-06-06-17-01-41.sql 

/backup/incremental-2017-06-06-17-01-41.sql

[root@lamp data]# service mysqld stop  #停止mysqld进程

Shutting down MySQL..             [  OK  ]

[root@lamp data]# rm -rf ./*    #模拟mysql数据库数据目录内容丢失(手动删除)

[root@lamp data]# ls     #目录中的内容全部删除,查看显示为空

[root@lamp data]# cp -a /backup/full-backup-2017-06-06/* ./  #复制之前快照卷备份的内容至当前数据目录,-a:复制文件的内容及权限属性。

[root@lamp data]# ll   #确保所有文件的属主为mysql用户

total 28712

drwx------. 2 mysql mysql     4096 Jun  2 15:30 hellodb

-rw-rw----. 1 mysql mysql 18874368 Jun  5 14:00 ibdata1

-rw-rw----. 1 mysql mysql  5242880 Jun  5 14:00 ib_logfile0

-rw-rw----. 1 mysql mysql  5242880 Jun  2 15:28 ib_logfile1

drwx------. 2 mysql mysql     4096 Jun  5 14:00 jiaowu

-rw-rw----. 1 mysql root      1853 Jun  2 15:28 lamp.err

-rw-rw----. 1 mysql mysql        6 Jun  2 15:28 lamp.pid

drwx------. 2 mysql mysql     4096 Jun  2 15:30 mydb

drwx------. 2 mysql root      4096 Jun  2 15:30 mysql

drwx------. 2 mysql mysql     4096 Jun  2 15:28 performance_schema

drwx------. 2 mysql mysql     4096 Jun  2 15:30 stu

drwx------. 2 mysql root      4096 Jun  2 15:28 test

drwx------. 2 mysql mysql     4096 Jun  2 15:30 testdb

[root@lamp data]# service mysqld start  #开启mysqld进程

Starting MySQL              [  OK  ]

[root@lamp data]# mysql -uroot -p  #登录mysql客户端

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 3

Server version: 5.5.28-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> USE jiaowu

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> SELECT * FROM tutors;   #查询tutors表的内容(此时后插入的2行数据没有)

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

mysql> SET sql_log_bin=0;  #导入二进制日志前,先关闭日志记录功能0为关闭,1为打开

Query OK, 0 rows affected (0.00 sec)

mysql> SOURCE /backup/incremental-2017-06-06-17-01-41.sql  #导入备份的二进制日志数据

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tutors;    #再次查询tutors表的内容,此时后插入的2行数据已经生成

+-----+--------------+--------+------+

| TID | Tname    | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

|  10 | stu0003      | M      | NULL |

|  11 | stu0004      | M      | NULL |

+-----+--------------+--------+------+

11 rows in set (0.00 sec)

mysql> SET sql_log_bin=1;   #二进制日志导入后再打开二进制日志记录功能

Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;  #查看此时的二进制日志位置状态信息

+------------------+----------+--------------+------------------+

| File   | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001 |    107 |        |       |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

至此通过lvm逻辑卷和二进制cp功能实现了mysql数据库备份和还原。

Linux如何使用LVM逻辑卷

背景

在学习Linux中,学习到了逻辑卷LVM,发现LVM是个十分好用的一个技术,可以多个硬盘合并在一起使用,同时还可以动态的增加和减少。在这里将Linux逻辑卷的具体实现记录下来。

介绍

逻辑卷LVM:Logica Volum Manager,它是Linux环境下对磁盘分区进行管理的一种机制,普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而LVM解决了这个问题,它可以动态的改变逻辑卷大小,以及跨分区使用。

实现LVM

在实现LVM前,需要准备一些磁盘,当然一个磁盘的多个分区也可以做,不过那没什么意义,这里我准备了4个磁盘来做这个实验,分别是每个磁盘分出10个G的分区来做实验,其中一个使用整个磁盘做分区。在做分区时要,注意要将分区类型改为8e类型,最后要记得输入w保存退出,不然分区不会生效,如果保存退出出现warning,记得同步分区,命令是:partx -a /dev/sdc 。

如图:

未分类

使用同样的方法分了4个分区,结果如图:

未分类

准备好分区后,开始制作LVM,第一步就是将这些分区或者磁盘做成物理卷,命令:pvcreate /dev/sd{b,c1,d1,e1}

未分类

然后使用pvs命令或者pvdisplay来查看物理卷列表。

未分类

然后开始创建卷组,使用命令vgcreate 卷组名(自己取) 物理卷(需要加入到卷组的物理卷),使用vgs可以产看卷组列表

未分类

使用vgdisplay查看卷组详细信息

未分类

创建好卷组后就可以在卷组上创建逻辑卷,命令:/lvcreate -n 逻辑卷名 -L 10G 卷组名

在配置大小时,可以用 -l 或者 -L 选项,-l 表示用PE个数做单位,-L 可以指定大小为多大,还可以用百分比:50%vg 卷组名

未分类

使用lvdisplay查看逻辑卷详细信息

未分类

这样我们的逻辑卷就创建成功了,现在为这个逻辑卷做一个文件系统,如果你做xfs文件系统,这个逻辑卷是不可用减少的,只能增加,如果是ext4就可以增加和减少。命令:mkfs.ext4 /dev/vg0/lv0

未分类

在创建一个挂载点将这个卷挂载就可以使用了,如果需要开机知道挂载,需要写配置文件/etc/fstab。

未分类

如果我们要增加逻辑卷的大小用命令:lvextend -r -L +10G /dev/vg0/lv0

-r 可以为增加的空间同步文件系统,如果没加-r ,增加的空间是没有文件系统的,所以并不能使用,也可以用

resize2fs /dev/vg0/lv0 30G 来同步,后面的30g为增加后整个空间的大小

未分类

如果卷组的空间不够,也可以扩展。命令为:vgextend vg0 /dev/sdf1 ;在sdf1也需要像之前创建分区时那样操作。

未分类

这样就实现了LVM的增加,这时如果我们不需要这么大的空间还可以减少LVM空间。

  • 首先取消挂载:umount /mnt/lv0

  • 再检查文件系统:fsck -f /dev/vg0/lv0 这个步骤是必须的,而且必须加 -f 强制检查,不然后面会报错。

  • 再减少文件系统空间:resize2fs /dev/vg0/lv0 10G 减少到10G大小

  • 再减少逻辑卷空间:lvreduce -L 10G /dev/vg0/lv0 减少到10G大小

  • 最后在挂载:mount -a

未分类

确认逻辑卷大小变为10G

未分类

从逻辑卷中删除正在使用的物理分区

未分类

如果这个物理分区上有数据或者空间被分配出去了,可以使用pvmove /dev/sdc1 将上面的数据或者空间,转移到其他分区,具体转到哪个分区系统自己分配。

先将需要移除的分区从卷组里移除,命令:vgreduce vg0 /dev/sdb

再从物理分区中移除,命令:pvremove /dev/sdb

未分类

对CentOS-7使用xfs文件系统的LVM进行扩容

Xfs是CentOS7的默认文件系统类型,而不同文件系统类型对应的创建、检查、调整命令不同。

未分类

在xfs文件系统中,只能增大分区而不能减小。

[root@localhost ~]# ls /lib//modules/3.10.0-229.20.1.el7.x86_64/kernel/fs   #查看内核所支持的所有文件系统类型
binfmt_misc.ko  ceph    dlm    fat      gfs2   lockd       nfs_common  overlayfs  udf
btrfs           cifs    exofs  fscache  isofs  mbcache.ko  nfsd        pstore     xfs
cachefiles      cramfs  ext4   fuse     jbd2   nfs         nls         squashfs

我之前已经新建了分区并加入到vg中,对物理边界也已扩展。

扩展逻辑边界时,报错如下所示:

[root@localhost ~]# resize2fs -p /dev/mapper/centos-root     
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/mapper/centos-root 时
找不到有效的文件系统超级块.

首先想到使用fsck进行修复下,并没有用,看到错误信息,才知道xfs文件要使用xfs_repair进行修复

[root@localhost ~]# fsck /dev/mapper/centos-root      
fsck,来自 util-linux 2.23.2
If you wish to check the consistency of an XFS filesystem or
repair a damaged filesystem, see xfs_repair(8).

然后尝试修复下,然而并没有用,需要卸载才能进行修复,而此文件系统是挂载到 / 下的,所以想都别想。

[root@localhost ~]# xfs_repair /dev/mapper/centos-root 
xfs_repair: /dev/mapper/centos-root contains a mounted filesystem
xfs_repair: /dev/mapper/centos-root contains a mounted and writable filesystem

fatal error -- couldn't initialize XFS library

最后在网上查了一番后,才知道xfs文件系统在进行逻辑扩展后,还要进行一步才能完成:

[root@localhost ~]# lvs
  LV   VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- 95.00g                                                    
  swap centos -wi-ao----  3.88g             
[root@localhost ~]# df  -lh
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   46G   42G  4.5G   91% /   ------------>46G
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G  164K  1.9G    1% /dev/shm
tmpfs                    1.9G  8.7M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                497M  208M  290M   42% /boot                                       
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root      #执行调整,扩展后需要执行此步骤
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=2987776 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=11951104, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=5835, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 11951104 to 24903680

[root@localhost ~]# df -lh
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   95G   42G   54G   44% /      ------------>已经完成扩展
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G  164K  1.9G    1% /dev/shm
tmpfs                    1.9G  8.7M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                497M  208M  290M   42% /boot

xfs相关常用命令

xfs_admin: 调整 xfs 文件系统的各种参数  
xfs_copy: 拷贝 xfs 文件系统的内容到一个或多个目标系统(并行方式)  
xfs_db: 调试或检测 xfs 文件系统(查看文件系统碎片等)  
xfs_check: 检测 xfs 文件系统的完整性  
xfs_bmap: 查看一个文件的块映射  
xfs_repair: 尝试修复受损的 xfs 文件系统  
xfs_fsr: 碎片整理  
xfs_quota: 管理 xfs 文件系统的磁盘配额  
xfs_metadump: 将 xfs 文件系统的元数据 (metadata) 拷贝到一个文件中  
xfs_mdrestore: 从一个文件中将元数据 (metadata) 恢复到 xfs 文件系统  
xfs_growfs: 调整一个 xfs 文件系统大小(只能扩展)  
xfs_freeze    暂停(-f)和恢复(-u)xfs 文件系统
xfs_logprint: 打印xfs文件系统的日志  
xfs_mkfile: 创建xfs文件系统  
xfs_info: 查询文件系统详细信息  
xfs_ncheck: generate pathnames from i-numbers for XFS  
xfs_rtcp: XFS实时拷贝命令   
xfs_io: 调试xfs I/O路径

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。

RedHat6.5系统LVM扩容根文件系统

一、新增物理空间

系统管理

系统管理

二、linux中创建新分区

1、首先查看硬盘信息,用fdisk -l命令,如果有硬盘有剩余空间就可以对其进行分区。

[root@master 桌面]# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 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: 0x0004bbc1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM

Disk /dev/mapper/vg_hadoop-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/vg_hadoop-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

2、下面对/dev/sda进行分区

fdisk /dev/sda

Command (m for help): m   //输入m查看帮助文档

Command (m for help): n   //输入n新建分区
[root@master ~]# fdisk /dev/sda

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)

3、建立扩展分区

有扩展分区和主分区,逻辑分区在扩展分区中建立。注意到括号中的1-4,最多只能建四个主分区(包括扩展分区)。这里创建扩展分区,

输入 : e  #建立扩展分区

Partition number (1-4)  :  3   #因为已经有sda1、sda2了

First cylinder (2611-7832, default 2611):Last cylinder, +cylinders or +size{K,M,G} (2611-7832, default 7832): #直接Enter键,默认即可

Command (m for help): p   #查看分区结果
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 3
First cylinder (2611-7832, default 2611): 
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-7832, default 7832): 
Using default value 7832

Command (m for help): p

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 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: 0x0004bbc1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM
/dev/sda3            2611        7832    41939020    5  Extended

4、扩展分区建好就可以在扩展分区建立逻辑分区了

Command (m for help): n

输入 : l  建立逻辑分区

Command (m for help): p   #查看分区结果
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (2611-7832, default 2611): 
Using default value 2611
Last cylinder, +cylinders or +size{K,M,G} (2611-7832, default 7832): 
Using default value 7832

Command (m for help): p

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 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: 0x0004bbc1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM
/dev/sda3            2611        7832    41939020    5  Extended
/dev/sda5            2611        7832    41938988+  83  Linux

5、上面显示已经建好一个主分区,一个逻辑分区,但是这些现在还没有生效,需要保存退出。

Command (m for help):w   #保存退出

输入 reboot 重启系统生效。
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.

三、 Linux系统LVM增加新硬盘实现根文件系统扩容

1、创建物理卷

fdisk -l
[root@master local]# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 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: 0x0004bbc1

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM
/dev/sda3            2611        7832    41939020    5  Extended
/dev/sda5            2611        7832    41938988+  83  Linux

Disk /dev/mapper/vg_hadoop-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/vg_hadoop-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

pvcreate /dev/sda5

[root@master local]# pvcreate /dev/sda5
  Physical volume "/dev/sda5" successfully created

2、查看创建好的物理卷

pvdisplay /dev/sda5
[root@master local]# pvdisplay /dev/sda5
  "/dev/sda5" is a new physical volume of "40.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda5
  VG Name               
  PV Size               40.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               qX00lY-nkpd-4txl-HFwM-6NuT-wMqu-yEFehV

3、卷组扩容

vgdisplay
[root@master local]# vgdisplay
  --- Volume group ---
  VG Name               vg_hadoop
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.51 GiB
  PE Size               4.00 MiB
  Total PE              4994
  Alloc PE / Size       4994 / 19.51 GiB
  Free  PE / Size       0 / 0   
  VG UUID               iQqDwB-Ft3T-aFfh-7nwK-alS3-LSMo-Uid9nz

vgextend vg_hadoop /dev/sda5

[root@master local]# vgextend vg_hadoop /dev/sda5
  Volume group "vg_hadoop" successfully extended

4、查看扩容之后的卷组信息

vgdisplay
[root@master local]# vgdisplay
  --- Volume group ---
  VG Name               vg_hadoop
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               59.50 GiB
  PE Size               4.00 MiB
  Total PE              15232
  Alloc PE / Size       4994 / 19.51 GiB
  Free  PE / Size       10238 / 39.99 GiB
  VG UUID               iQqDwB-Ft3T-aFfh-7nwK-alS3-LSMo-Uid9nz

5、逻辑卷扩容

df -h
[root@master local]# df -h
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/vg_hadoop-lv_root   18G   12G  5.1G  70% /
tmpfs                          1.9G  224K  1.9G   1% /dev/shm
/dev/sda1                      485M   40M  421M   9% /boot
/dev/sr0                       3.6G  3.6G     0 100% /media/RHEL_6.5 x86_64 Disc 1

lvextend -L +38G /dev/mapper/vg_hadoop-lv_root

[root@master local]# lvextend -L +38G /dev/mapper/vg_hadoop-lv_root 
  Extending logical volume lv_root to 55.51 GiB
  Logical volume lv_root successfully resized

6、查看扩容之后的逻辑卷

lvdisplay /dev/vg_hadoop/lv_root
[root@master local]# lvdisplay /dev/vg_hadoop/lv_root
  --- Logical volume ---
  LV Path                /dev/vg_hadoop/lv_root
  LV Name                lv_root
  VG Name                vg_hadoop
  LV UUID                wv0vJ6-c5Dd-Su9k-7dSV-P3KE-CF88-ElqYFA
  LV Write Access        read/write
  LV Creation host, time hadoop, 2017-07-05 18:56:16 +0800
  LV Status              available
  # open                 1
  LV Size                55.51 GiB
  Current LE             14210
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

7、文件系统扩容

resize2fs /dev/vg_hadoop/lv_root
[root@master local]# resize2fs /dev/vg_hadoop/lv_root
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg_hadoop/lv_root is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 4
Performing an on-line resize of /dev/vg_hadoop/lv_root to 14551040 (4k) blocks.
The filesystem on /dev/vg_hadoop/lv_root is now 14551040 blocks long.

8、成功

df -h
[root@master local]# df -h
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/vg_hadoop-lv_root   55G   12G   41G  22% /
tmpfs                          1.9G  224K  1.9G   1% /dev/shm
/dev/sda1                      485M   40M  421M   9% /boot
/dev/sr0                       3.6G  3.6G     0 100% /media/RHEL_6.5 x86_64 Disc 1

LVM的安装和使用方法

LVM简介

LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是一种磁盘管理工具,最主要的功能就是可以随时在线调整分区的大小,解决了安装Linux系统时需要评估分区大小的烦恼。

LVM相关术语

物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。
物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group)
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
逻辑卷(logical volume)
LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
PE(physical extent)
每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
LE(logical extent)
逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
下面的图示有助于理解:
系统管理

LVM的安装

加载device-mapper模块

从linux内核2.6.9开始,device-mapper模块就已经包含在内,所以你只需加载即可。
加载mapper模块:

  1. modprobe dm_mod

查看是否已经加载:

  1. lsmod | grep dm_mod

出现如下输出,即表示加载成功:

  1. dm_mod                 63097  4 dm_mirror,dm_multipath,dm_raid45,dm_log

如果你的内核高于2.6.9却没有此模块,可以使用yum install device-mapper命令安装。
如果你的内核低于2.6.9,则需要编译安装device-mapper模块,地址ftp://sources.redhat.com/pub/dm/

LVM2安装

直接yum安装:

  1. yum install lvm2

LVM的使用

创建PV(物理卷)

这个阶段有几个可用命令:
pvcreate :将实体partition创建成为PV;
pvscan :搜索目前系统里面任何具有PV的磁盘或分区;
pvdisplay :显示出目前系统上面的PV状态;
pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
1、在磁盘上创建PV

  1. pvcreate /dev/hdb

2、在分区上创建PV
在分区上创建PV,首先得使用fdisk设置分区类型为8e。然后执行以下命令:

  1. pvcreate /dev/hdb1

创建VG(卷组)

这一阶段有如下命令:
vgcreate :创建vg命令;
vgscan :搜索系统上面是否有 VG 存在?
vgdisplay :显示目前系统上面的 VG 状态;
vgextend :在 VG 内添加额外的 PV ;
vgreduce :在 VG 内移除 PV;
vgchange :配置 VG 是否启动 (active);
vgremove :删除一个 VG
把物理卷/dev/hda1和/dev/hdb1添加进my_volume_group卷组:

  1. vgcreate myvg /dev/hda1 /dev/hdb1

创建LV(逻辑卷)

LV阶段几个命令:
lvcreate :创建 LV
lvscan :查询系统上面的 LV ;
lvdisplay :显示系统上面的 LV 状态
lvextend :在 LV 里面添加容量!
lvreduce :在 LV 里面减少容量;
lvremove :删除一个 LV !
lvresize :对 LV 进行容量大小的调整!

  1. [root@www ~]# lvcreate [-L N[mgt]] [-n LV名称] VG名称
  2. [root@www ~]# lvcreate [-l N] [-n LV名称] VG名称
  3. 选项与参数:
  4. -L  :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,
  5.       因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。
  6. -l  :后面可以接 PE 的『个数』,而不是容量。若要这么做,得要自行计算 PE 数。
  7. -n  :后面接的就是 LV 的名称。
  8. 更多的说明应该可以自行查阅! man lvcreate

在myvg创建1500M,名称为mylv的LV:

  1. lvcreate -L 1500M -n mylv myvg

在myvg创建一个名称为mylv,PE个数为100的LV:

  1. lvcreate -l 100 -n mylv myvg

格式化并挂载LV

我们格式化成为ext3,并挂载到/mylv目录

  1. mkdir /mylv
  2. mkfs -t ext3 /dev/my_volume_group/mylv
  3. mount /dev/my_volume_group/mylv /mylv

通过df -h检查发现,/dev/my_volume_group/mylv已经成功挂载到/mylv目录。

LVM其它功能

删除一个vg

停止vg:

  1. vgchange -a n my_volume_group

删除vg:

  1. vgremove my_volume_group

添加pv到vg

  1. vgextend my_volume_group /dev/hdc1

从vg中删除pv

使用pvdisplay命令确保pv不被lv使用:

  1. # pvdisplay /dev/hda1
  2.  
  3. — Physical volume —
  4. PV Name               /dev/hda1
  5. VG Name               myvg
  6. PV Size               1.95 GB / NOT usable 4 MB [LVM: 122 KB]
  7. PV#                   1
  8. PV Status             available
  9. Allocatable           yes (but full)
  10. Cur LV                1
  11. PE Size (KByte)       4096
  12. Total PE              499
  13. Free PE               0
  14. Allocated PE          499
  15. PV UUID               Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7

如果pv已经被使用,需要使用pvmove命令把pv的数据迁移到另外空闲的pv。
然后使用vgreduce命令删除pv:

  1. vgreduce my_volume_group /dev/hda1

删除一个LV

  1. # umount /dev/myvg/homevol
  2. # lvremove /dev/myvg/homevol
  3. lvremove — do you really want to remove "/dev/myvg/homevol"? [y/n]: y
  4. lvremove — doing automatic backup of volume group "myvg"
  5. lvremove — logical volume "/dev/myvg/homevol" successfully removed

扩展LV容量

扩展lv容量到12G:

  1. # lvextend -L12G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 12 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

增加LV容量1G:

  1. # lvextend -L+1G /dev/myvg/homevol
  2. lvextend — extending logical volume "/dev/myvg/homevol" to 13 GB
  3. lvextend — doing automatic backup of volume group "myvg"
  4. lvextend — logical volume "/dev/myvg/homevol" successfully extended

下一步还需要修改文件系统的大小:
对于ext2/ext3格式的文件系统:

  1. # umount /dev/myvg/homevol
  2. # resize2fs /dev/myvg/homevol
  3. # mount /dev/myvg/homevol /home

对于reiserfs格式的文件系统:
在线扩展:

  1. # resize_reiserfs -f /dev/myvg/homevol

离线扩展:

  1. # umount /dev/myvg/homevol
  2.  # resize_reiserfs /dev/myvg/homevol
  3.  # mount -treiserfs /dev/myvg/homevol /home

缩小LV容量

对于ext2/ext3格式的文件系统:

  1. umount /mylv
  2. e2fsck -f /dev/my_volume_group/mylv
  3. resize2fs /dev/my_volume_group/mylv 800M
  4. lvreduce -L -200M /dev/my_volume_group/mylv
  5. mount /dev/my_volume_group/mylv /mylv

800M为减小容量后最终的大小。
对于reiserfs格式的文件系统:

  1. # umount /home
  2. # resize_reiserfs -s-1G /dev/myvg/homevol
  3. # lvreduce -L-1G /dev/myvg/homevol
  4. # mount -treiserfs /dev/myvg/homevol /home

参考:http://www.tldp.org/HOWTO/LVM-HOWTO/