LVM逻辑卷

262 阅读12分钟

1. LVM基本概念

LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。
LVM可以允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小,允许在多个物理设备间重新组织文件系统,LVM可以弹性的更改LVM的容量
  • 物理卷(Physical Volume,PV):就是真正的物理硬盘或分区。
  • 卷组(Volume Group,VG):将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷可以是同一块硬盘的不同分区,也可以是不同硬盘上的不同分区。我们可以把卷组想象为一块逻辑硬盘。
  • 逻辑卷(Logical Volume,LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。我们可以把逻辑卷想象为分区。
  • 物理扩展(Physical Extend,PE):PE 是用来保存数据的最小单元,我们的数据实际上都是写入 PE 当中的。PE 的大小是可以配置的,默认是 4MB。

2. LVM管理

功能物理卷管理卷组管理逻辑卷管理
Scan扫描pvscanvgscanlvscan
Create建立pvcreatevgcreatelvcreate
Display显示pvdisplayvgdisplaylvdisplay
Remove删除pvremovevgremovelvremovr
Extend扩展vgextendlvextend
Reduce减少vgreducelvreduce

2.1 建立逻辑卷

2.1.1创建过程

第一步建立物理卷
[root@localhost ~]# pvcreate /dev/sdb  ##pvcreate 设备名(分区 也可以是一整块磁盘)
  Physical volume "/dev/sdb" successfully created.

[root@localhost ~]# pvscan    ## 扫描系统中所有物理卷
  PV /dev/sdb    VG vg0             lvm2 [<20.00 GiB / <20.00 GiB free]
  PV /dev/sda2   VG centos          lvm2 [54.00 GiB / 4.00 MiB free]
  Total: 2 [74.00 GiB] / in use: 2 [74.00 GiB] / in no VG: 0 [0   ]

 [root@localhost ~]# pvdisplay   ## pvdisplay命令—显示物理卷详情
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               centos
  PV Size               <54.01 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              13825
  Free PE               1
  Allocated PE          13824
  PV UUID               08xD1s-49Z4-BE2F-yi72-zgEv-K1Il-XCZsbW
   
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               vg0
  PV Size               20.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              5119
  Free PE               1279
  Allocated PE          3840
  PV UUID               qRSeMY-i0eX-H2lT-bTxQ-kk2Q-wzeB-EuuoL3

###############################################################################
  
第二步建立卷组
[root@localhost ~]# vgcreate vg0 /dev/sdb  ##vgcreate 卷组名 物理卷名
  Volume group "vg0" successfully created

[root@localhost ~]# vgscan   ## 扫描系统中已建立的LVM卷组
  Reading volume groups from cache.
  Found volume group "vg0" using metadata type lvm2
  Found volume group "centos" using metadata type lvm2
  
  [root@localhost ~]# vgdisplay  ## 显示各卷组信息
  --- Volume group ---
  VG Name               vg0
  System ID             
  Format                lvm2
  Metadata Areas        1
  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                1
  Act PV                1
  VG Size               <20.00 GiB
  PE Size               4.00 MiB
  Total PE              5119
  Alloc PE / Size       0 / 0   
  Free  PE / Size       5119 / <20.00 GiB
  VG UUID               a83e96-smaA-HrIZ-oweB-AIST-VDrO-eddmJx
   
  --- Volume group ---
  VG Name               centos
  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               54.00 GiB
  PE Size               4.00 MiB
  Total PE              13825
  Alloc PE / Size       13824 / 54.00 GiB
  Free  PE / Size       1 / 4.00 MiB
  VG UUID               cwRul0-keVB-z973-1Z5z-TbQK-c07I-7pnzqZ
  
################################################################################

第三步建立逻辑卷
[root@localhost ~]# lvcreate -L 10G -n ky22 vg0  ##lvcreate 指定逻辑卷大小 创建逻辑卷的名字 从哪个卷组中取
  Logical volume "ky22" created.

[root@localhost ~]# lvscan   ## 扫描系统已有的逻辑卷信息
  ACTIVE            '/dev/vg0/ky22' [10.00 GiB] inherit
  ACTIVE            '/dev/centos/swap' [4.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit

[root@localhost ~]# lvdisplay  ## 显示逻辑卷详情信息
  --- Logical volume ---
  LV Path                /dev/vg0/ky22
  LV Name                ky22
  VG Name                vg0
  LV UUID                12hb9O-82cN-M5g5-kfDu-AyHB-pJUv-xkUPHg
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2022-08-03 14:08:31 +0800
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                6mynL7-yzKm-LqfY-nfIV-EqOP-MydA-H5sna6
  LV Write Access        read/write
  LV Creation host, time localhost, 2022-07-22 00:55:36 +0800
  LV Status              available
  # open                 2
  LV Size                4.00 GiB
  Current LE             1024
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
   
  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                NK4QiK-8SHj-CWwD-pMUB-K36S-51SB-jSkEJA
  LV Write Access        read/write
  LV Creation host, time localhost, 2022-07-22 00:55:36 +0800
  LV Status              available
  # open                 1
  LV Size                50.00 GiB
  Current LE             12800
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0


选项:
-L指定逻辑卷大小
-n创建逻辑卷的名字

逻辑卷建立成功,但是还无法使用

解决方案:

[root@localhost ~]# mkfs.xfs /dev/vg0/ky22    ##建立文件系统
meta-data=/dev/vg0/ky22          isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, 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

[root@localhost ~]#mount /dev/vg0/ky22 /mnt/  ##挂载成功以后才可以使用

[root@localhost ~]# df -Th  ##查看挂载情况
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.8G   49G    4% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  8.6M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       4.0G  143M  3.9G    4% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/mapper/vg0-ky22    xfs        10G   33M   10G    1% /mnt

2.1.2 从逻辑卷还原成磁盘

[root@localhost ~]# lvremove /dev/vg0/ky22   ## 删除逻辑卷
Do you really want to remove active logical volume vg0/ky22? [y/n]: y
  Logical volume "ky22" successfully removed

[root@localhost ~]# lvscan  ## 扫描系统已有的逻辑卷信息
  ACTIVE            '/dev/centos/swap' [4.00 GiB] inherit
  ACTIVE            '/dev/centos/root' [50.00 GiB] inherit

[root@localhost ~]# vgremove vg0  ## 删除指定卷组
  Volume group "vg0" successfully removed

[root@localhost ~]# vgscan   ## 扫描系统中已建立的LVM卷组
  Reading volume groups from cache.
  Found volume group "centos" using metadata type lvm2

[root@localhost ~]# pvremove /dev/sdb   ## 将物理卷还原成普通的分区或磁盘
  Labels on physical volume "/dev/sdb" successfully wiped.

[root@localhost ~]# pvremove /dev/sdc  ## 将物理卷还原成普通的分区或磁盘
  Labels on physical volume "/dev/sdc" successfully wiped.

[root@localhost ~]# pvscan   ## 扫描系统中所有物理卷
  PV /dev/sda2   VG centos          lvm2 [54.00 GiB / 4.00 MiB free]
  Total: 1 [54.00 GiB] / in use: 1 [54.00 GiB] / in no VG: 0 [0   ]

2.2 逻辑卷扩容

第一种情况: 原来卷组有足够空间

第二种情况: 原来卷组没有足够空间

        1. 得先给卷组扩容
        2. 然后再给逻辑卷扩容

卷组空间容量不够时,扩展卷组磁盘空间

[root@localhost ~]# pvcreate /dev/sdc  ##创建新的物理卷
  Physical volume "/dev/sdc" successfully created.

[root@localhost ~]# vgextend vg0 /dev/sdc ##添加物理卷/dev/sdc到卷组vg0中
  Volume group "vg0" successfully extended

xfs格式扩容

[root@localhost ~]# mkfs.xfs /dev/vg0/ky22   ##建立xfs类型的文件系统
meta-data=/dev/vg0/ky22          isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=2621440, 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

[root@localhost ~]# mount /dev/vg0/ky22 /mnt/   ##挂载

 [root@localhost ~]# df -Th  ##首先查看原有逻辑卷容量大小
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.8G   49G    4% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  8.6M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       4.0G  143M  3.9G    4% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/mapper/vg0-ky22    xfs        10G   33M   10G    1% /mnt

[root@localhost ~]# lvextend -L +5G /dev/vg0/ky22  ##给逻辑卷扩容,扩容前一定要有+号
  Size of logical volume vg0/ky22 changed from 10.00 GiB (2560 extents) to 15.00 GiB (3840 extents).
  Logical volume vg0/ky22 successfully resized.

[root@localhost ~]# xfs_growfs /mnt/   ##如果是xfs 文件系统要使用挂载点刷新
meta-data=/dev/mapper/vg0-ky22   isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621440, 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 2621440 to 3932160

[root@localhost ~]# df -Th   ##查看扩容后容量变化
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.8G   49G    4% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  8.6M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       4.0G  143M  3.9G    4% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/mapper/vg0-ky22    xfs        15G   33M   15G    1% /mnt

ext4格式扩容

[root@localhost ~]# df -Th   ##首先查看原有逻辑卷容量大小
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.8G   49G    4% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  8.6M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       4.0G  143M  3.9G    4% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/mapper/vg0-ky22    ext4      9.8G   37M  9.2G    1% /mnt

[root@localhost ~]# lvextend -L +5G /dev/vg0/ky22  ##给逻辑卷扩容 逻辑卷名 一定要有+号
  Size of logical volume vg0/ky22 changed from 10.00 GiB (2560 extents) to 15.00 GiB (3840 extents).
  Logical volume vg0/ky22 successfully resized.

[root@localhost ~]# mkfs.ext4 /dev/vg0/ky22  ##建立ext4类型的文件系统  
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2151677952
80 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

Allocating group tables: 完成                            
正在写入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

[root@localhost ~]# mount /dev/vg0/ky22 /mnt/   ##挂载

[root@localhost ~]# resize2fs /dev/vg0/ky22
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg0/ky22 is mounted on /mnt; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/vg0/ky22 is now 3932160 blocks long.

[root@localhost ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  1.8G   49G    4% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G  8.6M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs       4.0G  143M  3.9G    4% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/mapper/vg0-ky22    ext4       15G   41M   14G    1% /mnt

扩容有一个选项-r直接扩容

[root@localhost ~]#lvextend -r -L +2G /dev/vg0/ky22

扩容后刷新文件系统命令

xfg_growfs  /dev/挂载点位置   //刷新xfs文件系统容量
resize2fs   /dev/vgname1/lvname1   //刷新ext4类型文件系统容量

2.3 磁盘配额

2.3.1实现磁盘限额条件

  • 需要Linux内核支持

  • 安装xfsprogs与quota软件包Linux磁盘限额的特点

     查看是否安装:rpm -q xfsprogs quota
     安装命令:yum install -y xfsprogs quota
    

2.3.2 Linux磁盘限额的特点

  • 作用范围:针对指定的文件系统(分区)
  • 限制对象:用户帐号、组帐号
  • 限制类型:磁盘容量、文件数量
  • 限制方法:软限制、硬限制

2.3.3 配置过程

[root@localhost ~]# mount -o remount,usrquota,grpquota /dev/sdb1 /mnt  #添加磁盘配额属性

手动添加的方式,会在下次重新挂载时消失,因此我们可以直接修改 /etc/fstab 文件,将挂载参数写入到 配置文件中,这样,即便重新挂载也不会消失,

[root@localhost ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 22 00:55:36 2022
#
# 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=d4892f01-2262-4577-90af-db5a19c5d272 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdc      /mnt        xfs      defaults,usrquota,grpquota     0 0

[root@localhost ~]# mount -a   ##刷新 /etc/fstab 文件
[root@localhost ~]#xfs_quota -x -c 'limit -u bsoft=80M bhard=100M isoft=40 ihard=50 lisi' /mnt/

 -x:表示启动专家模式,在当前模式下允许对配额系统进行修改的所有管理命令可用。
 -c:表示直接调用管理命令。
 -u:指定用户账号对象
 -g:指定组账号对象
 
bsoft: 设置磁盘容量的软限制数值(默认单位为KB)。
bhard:设置磁盘容量的硬限制数值(默认单位为KB)。
isoft:设置磁盘文件数的软限制数值。
ihard:设置磁盘文件数的硬限制数值。
  • 仅限制磁盘容量:[root@localhost ~]#xfs_ quota -x -c 'limit -u bsoft=80M bhard=100M can' /opt/
  • 仅限制文件数:[root@localhost ~]#xfs quota -x -c 'limit -u isoft=4 ihard=5 can' /opt/
  • 查看can磁盘:容量限制:[root@localhost ~]#xfs_ quota -C 'quota -uv can' /opt/
  • 查看can文件数限制:[root@localhost ~]#xfs quota -c 'quota -i -uv lisi' /opt/

验证磁盘配额功能

[root@localhost ~]# chmod 777 /opt   ##给/opt增加满权限
[root@localhost ~]# Su can   ##进入can用户
[can@localhost root]$  cd /mnt  ##进入/mnt目录

验证磁盘容量超限

[can@localhost mnt]$ dd if=/dev/zero of=/mnt/kgc.txt bs=10M count=12  ##从/dev/zero复制到/mnt下创建文件kgc.txt,大小为10M,复制12dd: 写入"/mnt/kgc.txt" 出错: 超出磁盘限额
记录了11+0 的读入
记录了10+0 的写出
104857600字节(105 MB)已复制,0.0673266 秒,1.6 GB/秒

验证磁盘文件数超限

[can@localhost mnt]$ touch {1.10}.txt ##创建1-10的txt文件
touch: 无法创建"{1.10}.txt": 超出磁盘限额