Linux 温习(六): LVM 磁盘

2023-02-17 17:14:19 浏览数 (2)

LVM(逻辑卷)概念

逻辑卷管理器(Logical volume Manager)是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的低层架构和布局,就可以实现对硬盘分区的动态调整。

LVM 就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。

结构

  • 物理卷( Physical Volume)处于 LVM 的最底层,它们可以是实际物理硬盘上的分区、整个物理硬盘或 RAID 设备
  • 卷组(Volume Group)建立在物理卷之上,卷组建立后便可动态添加物理卷到卷组中
  • 逻辑卷(Logical Volume)建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后便可动态地扩展和缩小空间

LVM 的优势

  • 灵活的容量
  • 重新设定存储池大小
  • 在线数据重新定位
  • 方便设备命名

创建 LVM

创建逻辑卷的过程是把若干物理卷整合到一起组成卷组,在卷组上重新划分出新的分区。

首先添加一个 20Gb 硬盘。

创建物理卷(PV)

使用 lsblk 查看块设备

代码语言:javascript复制
> lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   40G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   39G  0 part
  ├─centos-root 253:0    0 35.1G  0 lvm  /
  └─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk

使用 pvcreate 创建物理卷PV

代码语言:javascript复制
> pvcreate /dev/sdb
 Physical volume "/dev/sdb" successfully created.

# 查看是否创建成功
> pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--  <39.00g  4.00m
  /dev/sdb          lvm2 ---   20.00g 20.00g

使用 pvdisplay 查看详情

代码语言:javascript复制
 > pvdisplay /dev/sdb
  "/dev/sdb" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb
  VG Name
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               2M2Is3-ZD7F-lZH0-Ea1o-TAiL-I7S0-xQlXH1
创建卷组(VG)

使用 vgcreate 创建卷组VG,并且此处可以 -s 选项指定PE(LE)的大小,(默认PE大小4M)

代码语言:javascript复制
> vgcreate datavg /dev/sdb
  Volume group "datavg" successfully created

# 查看是否创建成功
> vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n- <39.00g   4.00m
  datavg   1   0   0 wz--n- <20.00g <20.00g

使用 vgdisplay 查看详情

代码语言:javascript复制
> vgdisplay datavg
  --- Volume group ---
  VG Name               datavg
  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               bccduc-FvjJ-yCpe-as1Z-KeQH-W1kg-2WON8u

PE大,读取速度快,但浪费空间。反之,读取速度慢,但节省空间。类似于 socket

创建逻辑卷(LV)

使用 lvcreate 创建LV。

代码语言:javascript复制
lvcreate -n lvname -L lvsize(M,G) vgname
代码语言:javascript复制
> lvcreate -n lv1 -L 900M datavg
  Logical volume "lv1" created.
  
# 查看是否创建成功
> lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <35.12g                                                 
  swap centos -wi-ao----  <3.88g                                                 
  lv1  datavg -wi-a----- 900.00m                                                 

使用 lvdisplay 查看详情

代码语言:javascript复制
> lvdisplay /dev/datavg/lv1
  --- Logical volume ---
  LV Path                /dev/datavg/lv1
  LV Name                lv1
  VG Name                datavg
  LV UUID                FOfx3Z-Nr2j-gjdL-eMSs-7Gu3-ZtLR-ro5zF0
  LV Write Access        read/write
  LV Creation host, time centos-ps, 2023-01-13 17:06:06  0800
  LV Status              available
  # open                 0
  LV Size                900.00 MiB
  Current LE             225
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
格式化逻辑卷(LV)

xfs文件系统只支持增大,不支持减小。ext2、ext3、ext4增大减小都支持。

使用 mkfs 格式化逻辑卷

代码语言:javascript复制
> mkfs.ext4 /dev/datavg/lv1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
57600 inodes, 230400 blocks
11520 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=236978176
8 block groups
32768 blocks per group, 32768 fragments per group
7200 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
挂载并使用

使用 mount 挂载

代码语言:javascript复制
> mkdir  /opt/lv1
> mount /dev/datavg/lv1 /opt/lv1
> df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G   16K  1.9G    1% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   36G  9.4G   26G   27% /
/dev/sda1               1014M  195M  820M   20% /boot
vmhgfs-fuse              293G  144G  150G   49% /mnt/hgfs
tmpfs                    378M     0  378M    0% /run/user/1002
tmpfs                    378M     0  378M    0% /run/user/0
/dev/mapper/datavg-lv1   870M  2.3M  807M    1% /opt/lv1

可以看到挂载成功了,但是重启后又需要挂载。

我们可以编辑 /etc/fstab 添加一行 /dev/datavg/lv1 /opt/lv1 ext4 defaults 0 0

代码语言:javascript复制
> vim /etc/fstab
# /etc/fstab
# Created by anaconda on Thu Jul 28 16:11:47 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=e3727324-7c1e-4dd2-8821-ab4a6fec3316 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/datavg/lv1 /opt/lv1 ext4 defaults 0 0
> mount -a
> df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G   16K  1.9G    1% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   36G  9.4G   26G   27% /
/dev/sda1               1014M  195M  820M   20% /boot
vmhgfs-fuse              293G  144G  150G   49% /mnt/hgfs
tmpfs                    378M     0  378M    0% /run/user/1002
tmpfs                    378M     0  378M    0% /run/user/0
/dev/mapper/datavg-lv1   870M  2.3M  807M    1% /opt/lv1

动态扩容

逻辑卷动态扩容

逻辑卷最大的优点是可以弹性调节容量,逻辑卷存储空间不足时,就需要扩容。 若逻辑卷需要扩容,首先查看其所属的卷组,例如,lv1属于datavg卷组;再查看卷组空间空闲量,datavg卷组可用量为 10.12g。

代码语言:javascript复制
> vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n- <39.00g   4.00m
  datavg   1   2   0 wz--n- <20.00g <10.12g

在确认有多余空间的情况下,使用 lvextend 命令的 -L 选项扩展逻辑卷LV的大小(命令 - 为缩容, 为扩容)

代码语言:javascript复制
> lvextend -L  800M /dev/datavg/lv1
  Size of logical volume datavg/lv1 changed from 900.00 MiB (225 extents) to 1.66 GiB (425 extents).
  Logical volume datavg/lv1 successfully resized.
> lvextend -L  1024M /dev/datavg/lv1
  Size of logical volume datavg/lv1 changed from 1.66 GiB (425 extents) to 2.66 GiB (681 extents).
  Logical volume datavg/lv1 successfully resized.

查看大小

代码语言:javascript复制
> lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <35.12g                                                 
  swap centos -wi-ao----  <3.88g                                                 
  lv1  datavg -wi-ao----   2.66g                                                 

通过 df -h 查看发现并没有增大

代码语言:javascript复制
> df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 1.9G     0  1.9G    0% /dev
tmpfs                    1.9G   16K  1.9G    1% /dev/shm
tmpfs                    1.9G   12M  1.9G    1% /run
tmpfs                    1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   36G  9.4G   26G   27% /
/dev/sda1               1014M  195M  820M   20% /boot
vmhgfs-fuse              293G  144G  150G   49% /mnt/hgfs
tmpfs                    378M     0  378M    0% /run/user/1002
tmpfs                    378M     0  378M    0% /run/user/0
/dev/mapper/datavg-lv1   870M  2.3M  807M    1% /opt/lv1

这是因为文件系统也需要扩容。

  • ext4 文件系统扩容使用 resize2fs [逻辑卷名称] 挂载点
  • xfs 文件系统扩容使用 xfs_growfs 挂载点
代码语言:javascript复制
> resize2fs /dev/datavg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/datavg/lv1 is mounted on /opt/lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/datavg/lv1 is now 697344 blocks long.

再次查看扩容成功了

代码语言:javascript复制
> resize2fs /dev/datavg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/datavg/lv1 is mounted on /opt/lv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/datavg/lv1 is now 697344 blocks long.

也可以使用 lvextend 命令的 -r 选项来使文件系统自动扩容

卷组(VG)动态扩容
卷组(VG)扩容

逻辑卷扩容时,若卷组中没有足够的存储空间,就需要增加卷组的容量。vgextend 命令可以将新的物理卷加入卷组。该过程首先创建物理卷,然后将物理卷加入卷组。

卷组的扩容相当简单,一般是 LVM 空间不够时,添加一块新硬盘时使用。

增加一块磁盘 /dev/sdc

代码语言:javascript复制
> lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   40G  0 disk
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   39G  0 part
  ├─centos-root 253:0    0 35.1G  0 lvm  /
  └─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
sdb               8:16   0   20G  0 disk
├─datavg-lv1    253:2    0  2.7G  0 lvm  /opt/lv1
└─datavg-lv2    253:3    0    9G  0 lvm
sdc               8:32   0    1G  0 disk

扩容

代码语言:javascript复制
> vgextend datavg /dev/sdc
  Physical volume "/dev/sdc" successfully created.
  Volume group "datavg" successfully extended
> pvs
  PV         VG     Fmt  Attr PSize    PFree
  /dev/sda2  centos lvm2 a--   <39.00g    4.00m
  /dev/sdb   datavg lvm2 a--   <20.00g   <8.34g
  /dev/sdc   datavg lvm2 a--  1020.00m 1020.00m
> vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n- <39.00g 4.00m
  datavg   2   2   0 wz--n-  20.99g 9.33g
卷组(VG)缩容

当硬盘空间不足时,就需要减少卷组占用的空间。如果删除的物理卷存有数据,需要先把数据移动到其他物理卷(保证有足够的空间存储数据)。pvmove 命令可以迁移物理卷的数据,在不指定目标卷的情况下,系统默认把数据迁移到临近的物理卷。例如,将 /dev/sdb 中的数据迁移出去,默认迁移到 /dev/sdc

迁移数据

代码语言:javascript复制
> pvmove /dev/sdb

使用 vgreduce 命令从卷组中删除 /dev/sdc物理卷

代码语言:javascript复制
> vgreduce datavg /dev/sdc
  Removed "/dev/sdc" from volume group "datavg"

LVM 快照应用环境

快照的主要作用是保留数据在某一刻的状态,磁盘快照文件和系统所对应的虚拟磁盘本身大小不一样,快照比原数据小很多。

LVM 提供逻辑卷快照功能,用户可以在某个时间点创建一个逻辑卷副本,它也占用卷组的存储空间,称为快照卷,快照卷与原始的逻辑卷必须在同一个卷组。快照卷是一种特殊的逻辑卷,它可以挂载在设备上。lvcreate 命令可以创建一个快照,-s 参数指定逻辑卷,

代码语言:javascript复制
> lvcreate -L 100M -n centos-snap -s /dev/centos/root
  Logical volume "centos-snap" created.

使用 lvscan 命令查看新创建的快照卷。

代码语言:javascript复制
> lvscan
  ACTIVE            '/dev/centos/swap' [<3.88 GiB] inherit
  ACTIVE   Original '/dev/centos/root' [<35.12 GiB] inherit
  ACTIVE   Snapshot '/dev/centos/centos-snap' [100.00 MiB] inherit

/mnt 目录下创建一个挂载点 centos-snap,将快照卷挂载在上面,并设置为只读,以免破坏快照中的数据。

代码语言:javascript复制
> lvscan
  ACTIVE            '/dev/centos/swap' [<3.88 GiB] inherit
  ACTIVE   Original '/dev/centos/root' [<35.12 GiB] inherit
  ACTIVE   Snapshot '/dev/centos/centos-snap' [100.00 MiB] inherit

/mnt 目录下创建一个挂载点 centos-snap,将快照卷挂载在上面,并设置为只读,以免破坏快照卷中的数据。

代码语言:javascript复制
> mkdir /mnt/centos-snap
> mount -o ro /dev/centos/centos-snap /mnt/centos-snap

查看原来的数据

代码语言:javascript复制
> ls /mnt/centos-snap

删除 LVM

删除 LVM 步骤:

  1. umount 卸载
  2. 删除 /etc/fstab 文件下的永久挂载
  3. lvremove 移除逻辑卷(LV)
  4. vgremove 移除卷组(VG)
  5. pvremove 移除物理卷(PV)

下面只展示命令,具体细节可自行执行删除。

代码语言:javascript复制
> umount /opt/lv1
> vim /etc/fstab
> lvremove /dev/datavg/lv1
Do you really want to remove active logical volume datavg/lv1? [y/n]: y
  Logical volume "lv1" successfully removed
> vgremove datavg
> pvremove /dev/sdb

参考

  • Linux LVM详解
  • Linux 磁盘管理 | 菜鸟教程

0 人点赞