lvm(创建、扩容)、交换分区创建

一、LVM简介(LVM是 Logical Volume Manager(逻辑卷管理)的简写)

可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。

  1. PV(Physical Volume)即物理卷
    硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。

  2. VG(Volume Group)即卷组
    将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。

  3. PE(Physical Extend)
    PE是VG中的存储单元。实际存储的数据都是存储在这里面的。

  4. LV(Logical Volume)
    VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。

通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。

  1. LE(logical extent)
    PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。

LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。

  1. LVM的写入机制
    LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:
  • 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
  • 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。
    尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。
  1. LVM实现图解
  2. LVM常用命令汇总
    动作 PV阶段 VG阶段 LV阶段
    查找(scan) pvscan vgscan lvscan
    新建(create) pvcreate vgcreate lvcreate
    显示(display) pvdisplay vgdisplay lvdisplay
    增加(extend) vgextend lvextend(lvresize)
    减少(reduce) vgreduce lvreduce(lvresize)
    删除(remove) pvremove vgremove lvremove
    改变容量(resize) lvresize
    改变属性(attribute) pvchange vgchange lvchange

二、LVM实操

1. 物理磁盘

  1. 物理磁盘插入确认
[root@localhost ~]# fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors         # 新加磁盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
  1. 对物理磁盘进行分区
[root@localhost ~]# fdisk /dev/sdb          # 对/dev/sdb进行分区
Command (m for help): p         # 打印分区表
   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n         # 添加一个新分区
Select (default p):             # 默认回车,创建主分区
Partition number (1-4, default 1):          # 分区编号
First sector (2048-41943039, default 2048):             # 定义起始扇区,直接回车即可
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G            # 创建一个5G的分区
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p         # 打印分区表
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux                   # 查看新建的 5G 的分区

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



[root@localhost ~]# partprobe /dev/vdb              # 刷新分区表

  1. 查看磁盘分区信息
[root@localhost ~]# fdisk -l /dev/sdb           # 跟上面的分区编辑中的 p 作用一样

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xbb5d8a79

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux               # 查看新建的 5G 的分区
You have new mail in /var/spool/mail/root

2. 物理卷 pv

  1. 创建物理卷
[root@localhost ~]# pvcreate /dev/sdb1 
  Physical volume "/dev/sdb1" successfully created.
  1. 可以通过pvs和pvdisplay查看物理卷相关信息(不加参,查看所有)
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree
  /dev/sda2  centos lvm2 a--  <19.00g    0 
  /dev/sdb1         lvm2 ---    5.00g 5.00g


[root@localhost ~]# pvdisplay 
  "/dev/sdb1" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9CYPtz-2KS6-I1jb-fRbO-y61A-dwHZ-VPyMpA

3. 卷组 vg

物理卷 pv 创建好之后,才可以创建卷组
1. 创建卷组

[root@localhost ~]# vgcreate myvg /dev/sdb1             # 创建名字是myvg的卷组,磁盘空间来自sdb1
  Volume group "myvg" successfully created
  1. 查看卷组
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree 
  myvg     1   0   0 wz--n-  <5.00g <5.00g

[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               myvg
  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               <5.00 GiB
  PE Size               4.00 MiB
  Total PE              1279
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1279 / <5.00 GiB
  VG UUID               QzgxDN-RxIP-xtez-mH4f-xfe6-H1Kr-gHSrso

4. 逻辑卷 lv

卷组 vg 创建好之后,才可以创建逻辑卷 LV
1. 创建逻辑卷

[root@localhost ~]# lvcreate -L 4.9G -n mylv myvg       # 创建逻辑卷,名为mylv,大小4.9G,空间来自myvg这个卷组
  Rounding up size to full physical extent 4.90 GiB
  1. 查看逻辑卷
[root@localhost ~]# lvs
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
……                                                
  mylv myvg   -wi-a-----   4.90g                                                    


[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/myvg/mylv
  LV Name                mylv
  VG Name                myvg
  LV UUID                93TIxH-XRek-4M5U-lyNs-QnUy-ZuJw-dnS2QK
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2022-02-23 00:46:27 +0800
  LV Status              available
  # open                 0
  LV Size                4.90 GiB
  Current LE             1255
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
  ```

## 5. 格式化逻辑卷并挂载
```shell
[root@localhost ~]# mkfs.xfs /dev/myvg/mylv             # 格式化逻辑卷为xfs格式
meta-data=/dev/myvg/mylv         isize=512    agcount=4, agsize=321280 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1285120, 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 ~]# blkid /dev/myvg/mylv            # TYPE="xfs"既格式化成功
/dev/myvg/mylv: UUID="df286dba-435d-495e-9708-0e66e2414efa" TYPE="xfs"
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/myvg/mylv /test/         # 挂载逻辑卷mylv到  /test
[root@localhost ~]# vim /etc/fstab              # 设置开机挂载
/dev/myvg/mylv /test xfs defaults 0 0

[root@localhost ~]# mount -a            # 启用&测试开机挂载

6. 扩展逻辑卷

[root@localhost ~]# lvscan              # 找出要扩展的逻辑卷
  ACTIVE            '/dev/myvg/mylv' [4.90 GiB] inherit
……
[root@localhost ~]# blkid /dev/myvg/mylv            # 原lvm卷 TYPE="xfs"
/dev/myvg/mylv: UUID="df286dba-435d-495e-9708-0e66e2414efa" TYPE="xfs"



[root@localhost ~]# fdisk /dev/sdb              # 创建物理卷 pv
Command (m for help): n
Select (default p): 
Partition number (2-4, default 2): 
First sector (10487808-41943039, default 10487808): 
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039): +10G
Command (m for help): p  
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux
/dev/sdb2        10487808    31459327    10485760   83  Linux

Command (m for help): w


[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# vgextend myvg /dev/sdb2             # 扩展卷组 vg
  Physical volume "/dev/sdb2" successfully created.

[root@localhost ~]# lsblk
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    5G  0 part 
│ └─myvg-mylv   253:2    0  4.9G  0 lvm  /test
└─sdb2            8:18   0   10G  0 part


[root@localhost ~]# lvextend -L 9.9G /dev/myvg/mylv             # 扩展逻辑卷 lvm 
  Rounding size to boundary between physical extents: 9.90 GiB.
  New size given (2535 extents) not larger than existing size (2560 extents)

[root@localhost ~]# lvextend -l +100%FREE /dev/myvg/mylv  # 扩展vg中剩余的所有空间到lv


xfs_growfs  /dev/myvg/mylv    # 刷新,适用于xfs文件系统
resize2fs   /dev/myvg/mylv    # 刷新,适用于ext文件系统

7. 添加交换分区

为你的系统额外添加一个 512MiB 的交换分区,此交换分区应在系统启动时自动挂载,不要删除或以任何方式改动系统上原有的交换分区。

[root@localhost ~]# fdisk /dev/sdb    # 修改磁盘 vdb
Command (m for help): n           # 添加新分区
Partition number (3,4, default 3):      # 直接回车(默认)
First sector (31459328-41943039, default 31459328):         # 直接回车(默认)
Last sector, +sectors or +size{K,M,G} (31459328-41943039, default 41943039): +512M
Command (m for help): w           # 保存分区表,并退出

[root@localhost ~]# partprobe /dev/sdb   # 刷新分区表
[root@localhost ~]# mkswap /dev/sdb3     # 格式化自建分区 sdb3
[root@localhost ~]# vim /etc/fstab
/dev/sdb3 swap swap defaults 0 0

[root@localhost ~]# swapon -a   # 启用 fstab 中的交换设备
[root@localhost ~]# swapon -s   # 查看交换分区信息
Filename                Type        Size    Used    Priority
/dev/dm-1                               partition   2097148 1239352 -2
/dev/sdb3                               partition   524284  0   -3

8. 最终结果

[root@localhost ~]# lsblk
sdb               8:16   0   20G  0 disk 
├─sdb1            8:17   0    5G  0 part 
│ └─myvg-mylv   253:2    0   10G  0 lvm  /test
├─sdb2            8:18   0   10G  0 part 
│ └─myvg-mylv   253:2    0   10G  0 lvm  /test
└─sdb3            8:19   0  512M  0 part [SWAP]

Related Posts