什么是LVM?

LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的 分区加入其中,这样可以实现一种磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性,使用普通的磁盘分区,当一个磁盘的分区空间不够使用的时候,可 能就会带来很大的麻烦。使用LVM在一定程度上就可以解决普通磁盘分区带来的问题。 

LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。需要注意的是/boot分区不能基于LVM创建,必须独立出来。

LVM能够解决的需求痛点

  • 传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变:

1.不同的分区相对独立,无相互联系,各分区空间很易利用不平衡,空间不能充分利用;

2.当一个文件系统/分区已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更大的分区中;或采用符号连接的方式使用其它分区的空间。

3.如果要把硬盘上的多个分区合并在一起使用,只能采用再分区的方式,这个过程需要数据的备份与恢复。

  • 当采用LVM时,情况有所不同:

1.硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间;

2.文件系统建立在逻辑卷上,而逻辑卷可根据需要改变大小(在卷组容量范围内)以满足要求;

3.文件系统建立在LVM上,可以跨分区,方便使用;

4.使用LVM方便管理、增加了系统的扩展性

名词解释

  • PV(Physical Volume):物理卷,处于LVM最底层,可以是物理硬盘或者分区

  • VG(Volume Group):卷组,建立在PV之上,可以含有一个到多个PV

  • LV(Logical Volume):逻辑卷,建立在VG之上,相当于原来分区的概念。不过大小可以动态改变

磁盘配额介绍

quota软件设置的磁盘配额功能,只在指定的文件系统(分区)有效,磁盘配额的限制对象为系统中指定的用户账号、组账号进行限制。

磁盘配额的限制类型分为

磁盘容量:限制用户能够使用的磁盘数据块大小,也就是限制磁盘空间的大小,默认单位为KB。

文件数量:限制用户能够拥有的文件个数,在linux中每一个文件都有一个对应的数字标记,称为i节点号,这个编号在同一个文件系统内是唯一的。

磁盘配额的限制方法

软限制:指在固定期限内暂时允许这个用户超过这个限制(默认期限为7天超过7天后用户无法再写入数据),但是系统会给出警告。

硬限制:指绝对禁止用户超过此限制,硬限制的值不能小于软限制否则软限制失效。

实验环境介绍:

VMware Workstation虚拟机环境,Linux系统采用CentOS7

实验步骤:

首先添加两块新硬盘,重启主机(否则在系统中看不到新加的磁盘)

Linux之LVM与磁盘配额(quota)详解_第1张图片

使用fdisk -l命令可以看到两块新加的盘/sdb,/sdc

[root@localhost ~]# fdisk -l

................

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

使用fdisk命令对两块磁盘进行分区,并更改磁盘文件系统格式为物理盘格式(8e)

  • 会进入一个交互的模式,具体选择如下:

[root@localhost ~]# fdisk /dev/sdb             #对sdb进行分区
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x1ce46bfe 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n                               #按n 创建一个新的分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p                 #按p 选择创建主分区
分区号 (1-4,默认 1):1             #默认为第一分区
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):t          #按t 进行文件系统格式的转换
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e          #输入8e 转换成LVM格式
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p             #按p 查看分区信息  

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x1ce46bfe

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   8e  Linux LVM     #刚刚创建的分区/dev/sdb1  

命令(输入 m 获取帮助):w                      #按w 保存设置并退出互动模式
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

第二块磁盘/dev/sdc创建分区过程相同

再次使用fdisk -l命令可以看到新磁盘创建好的分区

[root@localhost ~]# fdisk -l

..............

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x1ce46bfe

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496   8e  Linux LVM
 

磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3dd2601b

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    41943039    20970496   8e  Linux LVM

创建PV物理卷

  • 使用pvcreate进行创建,另外还可以使用pvscan,pvdisplay查看物理卷详细信息

[root@localhost ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.

[root@localhost ~]# pvscan
  PV /dev/sdb1                      lvm2 [<20.00 GiB]
  PV /dev/sdc1                      lvm2 [<20.00 GiB]
  Total: 2 [<40.00 GiB] / in use: 0 [0   ] / in no VG: 2 [<40.00 GiB]
[root@localhost ~]# pvdisplay
  "/dev/sdb1" is a new physical volume of "<20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name              
  PV Size               <20.00 GiB
  Allocatable           NO
  PE Size               0  
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               xZ0LQe-x27m-eaNv-bgw4-9RHu-wZ6C-hrRd4P
  "/dev/sdc1" is a new physical volume of "<20.00 GiB"
  --- NEW Physical volume ---
  PV Name              /dev/sdc1
  VG Name              
  PV Size               <20.00 GiB
  Allocatable           NO
  PE Size               0  
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               1oMWW7-HBje-o6Pg-UlXx-edxp-gk8B-ugMW0S

创建VG卷组,将PV物理卷/dev/sdb1,/dev/sdc1加入VG卷组benet

  • 使用vgcreate进行创建,另外还可以使用vgscan,vgdisplay查看卷组详细信息

[root@localhost ~]# vgcreate benet /dev/sdb1 /dev/sdc1
  Volume group "benet" successfully created
[root@localhost ~]# vgscan
  Reading volume groups from cache.
  Found volume group "benet" using metadata type lvm2
[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               benet
  System ID            
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               39.99 GiB                 #组成的卷组benet大小
  PE Size               4.00 MiB                  #每个PE的单位
  Total PE              10238
  Alloc PE / Size       0 / 0  
  Free  PE / Size       10238 / 39.99 GiB
  VG UUID               e1gm4p-8Z2Y-WW1G-EpiH-4rNy-1JBi-NgcJAT

在VG卷组benet中创建LV逻辑卷

  • 使用lvcreate进行创建,可以使用lvscan查看LV逻辑卷详情,也可使用lvextend进行扩容

  • 其中的选项含义:  -L 指定大小    -n 进行命名

[root@localhost ~]# lvcreate -L 15G -n lv01 benet             #创建逻辑卷lv01,大小指定为15G
  Logical volume "lv01" created.
[root@localhost ~]# lvcreate -L 15G -n lv02 benet             #创建逻辑卷lv01,大小指定为15G
  Logical volume "lv02" created.
[root@localhost ~]# lvscan          #查看LV逻辑卷信息
  ACTIVE            '/dev/benet/lv01' [15.00 GiB] inherit
  ACTIVE            '/dev/benet/lv02' [15.00 GiB] inherit

[root@localhost ~]# lvextend -L +5G /dev/benet/lv01         #将lv01进行扩容5G
  Size of logical volume benet/lv01 changed from 15.00 GiB (3840 extents) to 20.00 GiB (5120 extents).
  Logical volume benet/lv01 successfully resized.
[root@localhost ~]# lvscan
  ACTIVE            '/dev/benet/lv01' [20.00 GiB] inherit          #再次查看,可看到lv01扩容成功

  ACTIVE            '/dev/benet/lv02' [15.00 GiB] inherit

格式化lv 挂载使用

  • 在此我们将lv01格式化为EXT4格式,将lv02格式化为XFS

mkfs.ext4 /dev/benet/lv01


mkfs.xfs /dev/benet/lv02

[root@localhost ~]#  mkdir /mnt1 /mnt2
[root@localhost ~]#  mount /dev/benet/lv01 /mnt1
[root@localhost ~]#  mount /dev/benet/lv02 /mnt2
[root@localhost ~]# df -h

.............

/dev/mapper/benet-lv01   20G   45M   19G    1% /mnt1
/dev/mapper/benet-lv02   15G   33M   15G    1% /mnt2

磁盘配额(quota)

  • 使用yum安装quota软件包,关闭防火墙,关闭增强型功能(否则容易出问题)

yum install quota -y

setenforce 0

systemctl stop firewalld.service

  • 设置开机自动挂载,将lv02挂载到/mnt2下

vim /etc/fstab      

..............                           #最后一行添加配置  

/dev/benet/lv02                         /mnt2                     xfs     defaults,usrquota,grpquota 0 0  

[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep lv02                                        #可以看到lv02拥有磁盘配额功能    
/dev/mapper/benet-lv02 on /mnt2 type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)

  • 检查磁盘配额开启是否成功

    [root@localhost ~]# quotaon -p /dev/benet/lv02                         

group quota on /mnt2 (/dev/mapper/benet-lv02) is on
user quota on /mnt2 (/dev/mapper/benet-lv02) is on

  • 添加一个caiwu组,用户tom,并将tom的基本组设置为caiwu

[root@localhost ~]# groupadd caiwu
[root@localhost ~]# useradd -g caiwu tom
[root@localhost ~]# id tom
uid=1001(tom) gid=1001(caiwu) 组=1001(caiwu)

  • 给用户tom设置配额,

    第一组soft和hard是软、硬限制是空间的大小


     

    第二组soft和hard是软、硬限制是文件数量


    [root@localhost ~]# edquota -u tom

Disk quotas for user tom (uid 1001):
  Filesystem                             blocks       soft       hard     inodes     soft     hard

/dev/mapper/benet-lv02            0        1024      2048           0       2        4                #最多可写2M大小的文件,文件个数最大限额为4

  • 给caiwu组做配额

[root@localhost ~]# edquota -g caiwu

Disk quotas for group caiwu (gid 1001):
  Filesystem                              blocks       soft       hard     inodes     soft     hard
  /dev/mapper/benet-lv02            0        2048      4096          0          3        5                #最多可写4M大小的文件,文件个数最大限额为5

  • 赋予普通用户读写执行权限

chmod 777 /mnt2

验证磁盘配额结果

  • 切换到tom用户身份进行登录,在/mnt2目录下写入内容

[root@localhost ~]# su - tom

[tom@localhost ~]$ cd /mnt2

[tom@localhost mnt2]$ dd if=/dev/zero of=test1 bs=1M count=1                #从/dev/zero中取1M大小的内容写入test1文件中,总共取1次
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00484565 秒,216 MB/秒
[tom@localhost mnt2]$ dd if=/dev/zero of=test2 bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00335958 秒,312 MB/秒
[tom@localhost mnt2]$ dd if=/dev/zero of=test3 bs=1M count=1                #超出了对tom用户设定的最大限额2M,因此写入文件内容失败
dd: 打开"test3" 失败: 超出磁盘限额

[tom@localhost mnt2]$ exit
登出

  • 更改对tom用户的限额,将写入文件大小扩大为100M,caiwu组限额不变


    [root@localhost ~]# edquota -u tom

Disk quotas for user tom (uid 1001):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/mapper/benet-lv02         2048       1024      102400          2        2        4

  • 再次切换到tom身份进行验证

[root@localhost ~]# su - tom
上一次登录:日 9月 16 20:52:55 CST 2018pts/0 上
[tom@localhost ~]$ cd /mnt2
[tom@localhost mnt2]$ rm -rf *              #将之前写入的内容删掉
[tom@localhost mnt2]$ dd if=/dev/zero of=test1 bs=1M count=2
记录了2+0 的读入
记录了2+0 的写出
2097152字节(2.1 MB)已复制,0.00502173 秒,418 MB/秒
[tom@localhost mnt2]$ dd if=/dev/zero of=test2 bs=1M count=2
记录了2+0 的读入
记录了2+0 的写出
2097152字节(2.1 MB)已复制,0.00540753 秒,388 MB/秒
[tom@localhost mnt2]$ dd if=/dev/zero of=test3 bs=1M count=2            #可以看到文件大小超出caiwu组的限额,用户tom也不能进行写入操作
dd: 打开"test3" 失败: 超出磁盘限额

因此如果对组和用户同时设置磁盘配额的时候,磁盘配额小的优先生效