掘金 后端 ( ) • 2024-04-10 19:02

theme: channing-cyan

LVM逻辑卷

一、LVM逻辑卷概述

LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念

二、LVM逻辑卷的组成

image-20220223011049360.png

PV(物理卷)

  • 在逻辑卷管理系统最底层,可为整个物理硬盘或实际物理硬盘上的分区

  • 由分区和硬盘组成

VG(卷组)

  • 建立在物理卷上,一卷组中至少要包括一物理卷,卷组建立后可动态的添加卷到卷组中,一个逻辑卷管理系统工程中可有多个卷组

  • 是分区和硬盘的集合

LV(逻辑卷)

  • 逻辑卷(Logical Volume)是由逻辑磁盘形成的虚拟盘,也可称为磁盘分区

  • 逻辑卷建立在卷组基础上,卷组中未分配空间可用于建立新的逻辑卷,逻辑卷建立后可以动态扩展和缩小空间

PE(物理扩展)

  • 物理卷中可用于分配的最小存储单元

  • 物理区域大小在建立卷组时指定,一旦确定不能更改

  • 默认值为4M一个

三、LVM逻辑卷的优点

  • LVM是可以允许对卷组进行方便操作的抽象层,包括重新设定文件系统的大小。

  • 允许在多个物理设备间重新组织文件系统。

  • 可以弹性的更改LVM的容量。

注意

/boot分区用于存放引导文件,不能基于LVM创建。

四、LVM逻辑卷的命令

LVM的管理命令

功能 物理卷管理 卷组管理 逻辑卷管理 scan 扫描 pvscan vgscan lvscan create 建立 pvcreate vgcreate lvcreate display 显示 pvdisplay vgdisplay lvdisplay remove 删除 pvremove vgremove lvremove extend 扩展 —— vgextend lvextend reduce 减少 —— vgreduce lvreduce

LVM的主要命令

  • pvcreate 设备名1 【设备名2…】

  • vgcreate 卷组名(可修改) 物理卷名1 物理卷名2

  • lvcreate -L 容量大小 -n 逻辑卷名 卷组名

  • lvextend -L  +大小 /dev/卷组名/逻辑名

LVM的应用

一、LVM逻辑卷配置实验

实验内容

1.创建物理卷:将/dev/sdb1和/dev/sdc1创建成物理卷;

2.创建卷组:创建卷组vg01,将2个物理卷分配给vg01

3.创建逻辑卷:从vg01中取12G容量创建逻辑卷mysql

4.格式化逻辑卷:将逻辑卷mysql格式化为XFS文件系统

5.挂载逻辑卷:将逻辑卷mysql挂载到/data/mnt 目录下

二、LVM逻辑卷配置过程

准备:在虚拟机中添加多个硬盘

1.使用fdisk工具规划分区,将/dev/sdb1和/dev/sdc1的分区格式设置为Linux LVM(对应系统ID为8e)。

[root@localhost ~]# fdisk /dev/sdb       //管理磁盘分区,将sdb1的格式修改为LVM
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10GB
分区 1 已设置为 Linux 类型,大小设为 9.3 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk /dev/sdc       //管理磁盘分区,将sdc的格式修改为LVM
欢迎使用 fdisk (util-linux 2.23.2)。

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

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

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): 
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+5GB
分区 1 已设置为 Linux 类型,大小设为 4.7 GiB

命令(输入 m 获取帮助):t
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# partprobe                  //刷新分区,使系统识别
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。

image.png

image.png

image.png

image.png

  1. pvcreate命令:将/dev/sdb3和/dev/sdc1创建物理卷。
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdc1" successfully created.
[root@localhost ~]# pvscan
  PV /dev/sda2   VG centos          lvm2 [<50.30 GiB / 4.00 MiB free]
  PV /dev/sdb1                      lvm2 [9.31 GiB]
  PV /dev/sdc1                      lvm2 [<4.66 GiB]
  Total: 3 [<64.27 GiB] / in use: 1 [<50.30 GiB] / in no VG: 2 [<13.97 GiB]

image.png

3.vgcreate命令:创建卷组vg01,并将2个物理卷分配给vg01。

[root@localhost ~]# vgcreate vg01 /dev/sdb1 /dev/sdc1      //创建vg01卷组
  Volume group "vg01" successfully created
[root@localhost ~]# vgscan                                 //扫描卷组
  Reading volume groups from cache.
  Found volume group "vg01" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
[root@localhost ~]# vgdisplay vg01                         //显示vg01卷组列表
  --- Volume group ---
  VG Name               vg01
  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               13.96 GiB
  PE Size               4.00 MiB
  Total PE              3575
  Alloc PE / Size       0 / 0   
  Free  PE / Size       3575 / 13.96 GiB
  VG UUID               QCctIo-9RFz-ODON-hZTs-eoOM-GsQU-0YvNJg

image.png

image.png

4.lvcreate 命令:从vg01中取12G容量创建逻辑卷mysql

[root@localhost ~]# lvcreate -n mysql -L +12G vg01   //从vg01中取12G容量创建逻辑卷mysql
  Logical volume "mysql" created.
[root@localhost ~]# lvdisplay                        //显示逻辑卷的具体信息
  --- Logical volume ---
  LV Path                /dev/vg01/mysql
  LV Name                mysql
  VG Name                vg01
  LV UUID                m9z2UC-QEem-P5eh-M74e-lEdi-ISOK-gbPDFl
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-04-10 16:07:18 +0800
  LV Status              available
  # open                 0
  LV Size                12.00 GiB                   //逻辑卷容量
  Current LE             3072
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

image.png

5.mkfs命令:将逻辑卷mysql格式化为XFS文件系统。

[root@localhost ~]# mkfs.xfs /dev/vg01/mysql    //将逻辑卷mysql格式化为XFS文件系统
meta-data=/dev/vg01/mysql        isize=512    agcount=4, agsize=786432 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=3145728, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

image.png

6.将逻辑卷mysql挂载到/mnt目录下

[root@localhost ~]# mount /dev/vg01/mysql /mnt    //将逻辑卷mysql挂载到/mnt 目录下
[root@localhost ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   60G  0 disk 
├─sda1            8:1    0  1.9G  0 part /boot
└─sda2            8:2    0 50.3G  0 part 
  ├─centos-root 253:0    0 46.6G  0 lvm  /
  └─centos-swap 253:1    0  3.7G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk 
└─sdb1            8:17   0  9.3G  0 part 
  └─vg01-mysql  253:2    0   12G  0 lvm  /mnt
sdc               8:32   0   20G  0 disk 
└─sdc1            8:33   0  4.7G  0 part 
  └─vg01-mysql  253:2    0   12G  0 lvm  /mnt
sr0              11:0    1  4.2G  0 rom  

image.png

注意

永久挂载:修改/etc/fstab 文件,将逻辑卷mysql挂载到/mnt目录下

[root@localhost ~]# blkid |grep mysql           //查看逻辑卷mysql的UUID
/dev/mapper/vg01-mysql: UUID="59ffcb19-7753-4534-897a-a5b91583fdae" TYPE="xfs" 
[root@localhost ~]# vim /etc/fstab      //修改配置文件,将mysql设置为每次开机后自动挂载到/mnt目录下


#
# /etc/fstab
# Created by anaconda on Thu Mar 28 00:37:44 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d3f3c980-d425-48d5-9ee9-bb1304a5ae0c /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
UUID="59ffcb19-7753-4534-897a-a5b91583fdae /mnt    xfs    defaults     0 0  //配置信息
:wq
[root@localhost ~]# mount -a           //重新挂载所有磁盘
[root@localhost ~]# df -Th             //查看磁盘信息
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        47G  4.4G   43G   10% /
devtmpfs                devtmpfs  897M     0  897M    0% /dev
tmpfs                   tmpfs     912M     0  912M    0% /dev/shm
tmpfs                   tmpfs     912M  9.1M  903M    1% /run
tmpfs                   tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1               xfs       1.9G  179M  1.7G   10% /boot
tmpfs                   tmpfs     183M     0  183M    0% /run/user/0
tmpfs                   tmpfs     183M   12K  183M    1% /run/user/42
/dev/mapper/vg01-mysql  xfs        12G   33M   12G    1% /mnt    //mysql已成功挂载

image.png

image.png

LVM的扩容

一、LVM逻辑卷扩容实验

1.使用fdisk工具,为硬盘 /dev/sdc 创建第二个分区。分区类型设置为LVM,系统ID为8e。

[root@localhost ~]# fdisk /dev/sdc    //管理磁盘分区,将sdc的格式修改为LVM
欢迎使用 fdisk (util-linux 2.23.2)。

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


命令(输入 m 获取帮助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (9766912-41943039,默认为 9766912):
将使用默认值 9766912
Last 扇区, +扇区 or +size{K,M,G} (9766912-41943039,默认为 41943039):+5GB
分区 2 已设置为 Linux 类型,大小设为 4.7 GiB

命令(输入 m 获取帮助):t
分区号 (1,2,默认 2):
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):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)
正在同步磁盘。
[root@localhost ~]# partprobe           //刷新分区,使系统识别
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。

image.png

image.png

image.png

2.pvcreate 命令:创建新的物理卷 /dev/sdc2。

[root@localhost ~]# pvcreate /dev/sdc2    //创建物理卷/dev/sdc2
  Physical volume "/dev/sdc2" successfully created.
[root@localhost ~]# pvdisplay /dev/sdc2   //查看物理卷/dev/sdc2
  "/dev/sdc2" is a new physical volume of "<4.66 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc2
  VG Name               
  PV Size               <4.66 GiB
  Allocatable           NO                //该物理卷是否已分配
  PE Size               0   
  Total PE              0
  Free PE               0                 
  Allocated PE          0                 //已分配的容量
  PV UUID               fyVZMf-BFp8-LgAZ-pXct-o9bw-L5K4-ygN60N

image.png

3.vgextend 命令:将物理卷 /dev/sdc2 加入卷组 vg01。

[root@localhost ~]# vgextend vg01 /dev/sdc2    //将物理卷/dev/sdc2加入卷组 vg01
  Volume group "vg01" successfully extended
[root@localhost ~]# vgdisplay vg01             //显示卷组vg01的信息
  --- Volume group ---
  VG Name               vg01
  System ID             
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               <18.62 GiB             //卷组总容量
  PE Size               4.00 MiB
  Total PE              4766
  Alloc PE / Size       3072 / 12.00 GiB       //卷组中已被分配的容量
  Free  PE / Size       1694 / <6.62 GiB       //卷组中的空余容量
  VG UUID               O8Xtnj-LWAK-DJYK-KUfR-9ypl-fumA-K7JI0W

image.png

4.lvextend 命令:为逻辑卷/dev/vg01/mysql 增加5G的容量。

[root@localhost ~]# lvextend -L +5GB /dev/vg01/mysql    //为逻辑卷mysql扩容5G
  Size of logical volume vg01/mysql changed from 12.00 GiB (3072 extents) to 17.00 GiB (4352 extents).
  Logical volume vg01/mysql successfully resized.
[root@localhost ~]# lvdisplay /dev/vg01/mysql       //显示逻辑卷mysql信息
  --- Logical volume ---
  LV Path                /dev/vg01/mysql
  LV Name                mysql
  VG Name                vg01
  LV UUID                Gd9I4D-pXAJ-bL9I-WYCg-nlr4-zIQp-Dv85DJ
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2024-04-10 16:47:50 +0800
  LV Status              available
  # open                 1
  LV Size                17.00 GiB          //逻辑卷总容量变为17G
  Current LE             4352
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

image.png

5.xfs_growfs 命令:使XFS文件系统识别到新增的空间,实现文件系统扩容。

[root@localhost ~]# xfs_growfs /dev/vg01/mysql  //将文件系统扩容
meta-data=/dev/mapper/vg01-mysql isize=512    agcount=4, agsize=786432 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=3145728, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 3145728 to 4456448
[root@localhost ~]# df -Th              //查看磁盘信息
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        47G  4.4G   43G   10% /
devtmpfs                devtmpfs  897M     0  897M    0% /dev
tmpfs                   tmpfs     912M     0  912M    0% /dev/shm
tmpfs                   tmpfs     912M  9.1M  903M    1% /run
tmpfs                   tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1               xfs       1.9G  179M  1.7G   10% /boot
tmpfs                   tmpfs     183M     0  183M    0% /run/user/0
tmpfs                   tmpfs     183M   12K  183M    1% /run/user/42
/dev/mapper/vg01-mysql  xfs        17G   33M   17G    1% /mnt      //容量已变为17G

image.png

磁盘配额管理

一、磁盘配额管理概述

磁盘配额(Quota)就是 Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。

在此概念中,有以下几个重点需要注意:

  • 磁盘配额限制的用户和用户组,只能是普通用户和用户组,也就是说超级用户 root 是不能做磁盘配额的;

  • 磁盘配额限制只能针对分区,而不能针对某个目录,换句话说,磁盘配额仅能针对文件系统进行限制,举个例子,如果你的 /dev/sda5 是挂载在 /home 底下,那么,在 /home 下的所有目录都会受到磁盘配额的限制;

  • 我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)

二、磁盘配额的使用条件

磁盘配额要想正常使用,有以下几个前提条件:

  • 内核必须支持磁盘配额。

  • 系统中必须安装了 Quota 工具。我们的 Linux 中默认安装了 Quoted 工具

  • 要支持磁盘配额的分区必须开启磁盘配额功能。这项功能可以手动开启,不再是默认开启的。