常用LVM操作

LVM是逻辑卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制。LVM通过在硬盘和文件系统之间添加一个逻辑层,来为文件系统屏蔽下层硬盘分区布局,提高硬盘分区管理的灵活性,

名词解释

  • 物理存储介质(The physical media):指系统的物理存储设备,如硬盘,系统中为/dev/hda/dev/sda/dev/vda等等,是存储系统最低层的存储单元。

NOTE: /dev/sda/dev/sda1是有区别的。 /dev/sda 表示整个sda整个硬盘, /dev/sda1表示的是硬盘上的一个分区。
好比你的电脑是256的固态, 然后划分成C, D两个盘。 sda指固态, sda1指C盘, sda2指D盘。

  • PV: 物理卷(Physical Volume):指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID), 是LVM的基本存储逻辑块。物理卷包括一个特殊的标签,该标签默认存放在第二个 512 字节扇区,但也可以将标签放在最开始的四个扇区之一。该标签包含物理卷的随机唯一识别符(UUID),记录块设备的大小和LVM元数据在设备中的存储位置。

  • VG: 卷组(Volume Group):由物理卷组成,屏蔽了底层物理卷细节。可在卷组上创建一个或多个逻辑卷且不用考虑具体的物理卷信息。

  • LV: 逻辑卷(Logical Volume):卷组不能直接用,需要划分成逻辑卷才能使用。逻辑卷可以格式化成不同的文件系统,挂载后直接使用。

  • PE: 物理块(Physical Extent):物理卷以大小相等的“块”为单位存储,块的大小与卷组中逻辑卷块的大小相同。

  • LE: 逻辑块(Logical Extent,):逻辑卷以“块”为单位存储,在一卷组中的所有逻辑卷的块大小是相同的

lvm图解

使用LVM管理硬盘的基本过程如下:

  • 1.将硬盘创建为物理卷
  • 2.将多个物理卷组合成卷组
  • 3.在卷组中创建逻辑卷
  • 4.在逻辑卷之上创建文件系统
    通过LVM管理硬盘之后,文件系统不再受限于硬盘的大小,可以分布在多个硬盘上,也可以动态扩容。

情形一: 根目录扩容(常见于CentOS)

  • 格式化磁盘并修改分区格式
    fdisk /dev/sdb [n, p, 1, size, t, 8e, w]

  • 创建 PV
    pvcreate /dev/sdb

  • 扩展 VG
    vgextend centos /dev/sdb1

  • 扩展LV
    lvextend -l +100%FREE /dev/centos/root

  • 刷新
    xfs_growfs /dev/centos/root

情形二: 根目录扩容(常见于Ubuntu)

  • 格式化磁盘并修改分区格式
    fdisk /dev/sdb [n, p, 1, size, t, 8e, w]

  • 创建 PV
    pvcreate /dev/sdb

  • 扩展 VG
    vgextend ubuntu-vg /dev/sdb1

  • 扩展LV
    lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

  • 刷新
    resize2fs /dev/ubuntu-vg/ubuntu-lv

P.S 如果碰到 xfs 提示 xfs_growfs: /dev/centos/root is not a mounted XFS filesystem
对于 xfs : xfs_growfs + 挂载点
对于 ext2/3/4: resize2fs + 挂载点

  • 确认文件系统格式和挂载点

df -Thl
df -Thl
lsblk
lsblk

情形三: 一块磁盘做成lvm单独挂载某个目录

将新磁盘分成两个区,一个挂载/data; 一个挂载/var/lib/docker

图


# 创建 pv
pvcreate /dev/sdb1

# 创建 vg0
vgcreate vg0 /dev/sdb1


# 创建 lv0 和 lv1
lvcreate -l 50%FREE -n lv0 vg0

lvcreate -l 100%FREE -n lv1 vg0

# 格式化
mkfs.xfs /dev/vg0/lv0
mkfs.xfs /dev/vg0/lv0

# 挂载
echo "/dev/vg0/lv0 /data/ xfs defaults 0 0" >> /etc/fstab
echo "/dev/vg0/lv1 /var/lib/docker xfs defaults 0 0" >> /etc/fstab

情形四: 缩减/删除某个lv

进行任何操作前,请确保拥有当前系统的备份

  • xfs不支持缩减 (其实是支持缩减, 但是需要mkfs强制格式化)
  • ext4支持缩减
  • 缩减逻辑卷之前卸载该逻辑卷所在分区(强制缩减XFS例外)

检查某个目录相关的进程
yum install psmisc
fuser -m -v -i -k /home

4.1 逻辑卷删除

  • CentOS7系统 XFS文件系统为例, 删除 home 分区, 并将其空间扩充到 /
[root@centos7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 59G 0 part
├─centos-root 253:0 0 37G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 18.1G 0 lvm /home
sr0 11:0 1 973M 0 rom
[root@centos7 ~]#
  • 卸载 home 分区
    umount /home

  • 移除 home 逻辑卷
    lvremove /dev/centos/home

  • 调整 root 逻辑卷的大小
    lvresize -l +100%FREE /dev/centos/root

  • 更新分区
    xfs: xfs_growfs /
    ext4: resize2fs /dev/centos/root

  • 编辑 fstab
    删除 /home
    更新 /

注意前后UUID的变化

4.2 EXT4根逻辑卷缩减

  • ubuntu 系统 ext4 文件系统为例, 从/缩减10G, 并创建新分区 /data

  • ext4支持缩减

  • /缩减需要从Live CD模式操作

  • 操作之前确保拥有当前系统的备份

图

  1. 关闭Ubuntu系统, 插入CD并设置第一启动顺序

    图

  2. 选择第一个启动项

    图

  3. 右上角 help–>enter shell

    图

  4. 使用 lvreduce 缩减 /
    lvreduce --resizefs --size -50G /dev/ubuntu-vg/ubuntu-lv
    图

  5. 注意事项

  • 注意缩减前后UUID是否变化
  • Live CD 是否包含 lvm工具, 没有的话需 apt install lvm2

4.3 EXT4非根逻辑卷缩减

ubuntu 系统 ext4 文件系统为例, 从/home缩减5G

  1. 卸载/home
    umount /home
  2. 缩减/home
    lvreduce --resizefs --size -5G /dev/ubuntu-vg/ubuntu-home
    图

4.4 XFS缩减

CentOS7系统 XFS文件系统为例, 将/home缩至10G
前面说了XFS不支持缩减, 下面会解释

  • 缩减 /home 至 10G
    lvreduce -L 10G /dev/mapper/centos-home

  • 更新/home分区
    xfs_growfs /dev/centos/home

[root@centos7 ~]# 
[root@centos7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 59G 0 part
├─centos-root 253:0 0 37G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 18.1G 0 lvm /home
sr0 11:0 1 973M 0 rom
[root@centos7 ~]#
[root@centos7 ~]# lvreduce -L 10G /dev/mapper/centos-home
WARNING: Reducing active and open logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce centos/home? [y/n]: y
Size of logical volume centos/home changed from <18.09 GiB (4630 extents) to 10.00 GiB (2560 extents).
Logical volume centos/home successfully resized.
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# xfs_growfs /dev/centos/home
meta-data=/dev/mapper/centos-home isize=512 agcount=5, agsize=1185024 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=4741120, 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 size 2621440 too small, old size is 4741120
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 59G 0 part
├─centos-root 253:0 0 37G 0 lvm /
├─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
└─centos-home 253:2 0 10G 0 lvm /home
sr0 11:0 1 973M 0 rom
[root@centos7 ~]#
  • 缩减后重启失败进入救援模式
    图
  • 使用lvresize还原逻辑卷/home原来的大小后重启顺利进入系统
    图

4.5 XFS 强制缩减逻辑卷

直接 shrink, 不需要先卸载
缩减成功后uuid会发生变化

  1. 直接缩减
    lvreduce -L -5G /dev/centos/home

  2. 文件系统的大小调整为其底层逻辑卷的实际大小
    xfs_growfs /dev/centos/home

  3. 卸载 /home
    umount /home/

  4. 强制格式化 /homexfs
    mkfs.xfs -f /dev/centos/home

  5. 重新挂载 /home
    mount /dev/centos/home /home/

[root@centos7 ~]# 
[root@centos7 ~]# lvreduce -L -5G /dev/centos/home
WARNING: Reducing active and open logical volume to <13.09 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce centos/home? [y/n]: y
Size of logical volume centos/home changed from <18.09 GiB (4630 extents) to <13.09 GiB (3350 extents).
Logical volume centos/home successfully resized.
[root@centos7 ~]# xfs_growfs /dev/centos/home
meta-data=/dev/mapper/centos-home isize=512 agcount=4, agsize=1185280 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=4741120, 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 size 3430400 too small, old size is 4741120
[root@centos7 ~]#
[root@centos7 ~]#
[root@centos7 ~]# umount /home/
[root@centos7 ~]#
[root@centos7 ~]# mkfs.xfs -f /dev/centos/home
Discarding blocks...Done.
meta-data=/dev/centos/home isize=512 agcount=4, agsize=857600 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=3430400, 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@centos7 ~]#
[root@centos7 ~]# mount /dev/centos/home /home/
[root@centos7 ~]#