---
title: "Lvm 笔记"
date: 2019-10-29T21:44:02+08:00
lastmod: 2019-10-29T21:44:02+08:00
keywords: []
tags: ["lvm"]
categories: ["storage"]
---

## LVM 一览
![lvm一览](/img/lvm.jpg "lvm一览")

## LVM 结构
- PE 物理扩展
- PV 物理卷，在设备起始处放置一个标签，包括 uuid，lvm 配置元数据位置以及剩余空间
    - PV 可以由分区创建，也可以直接用磁盘创建
- VG 卷组
- LV 逻辑卷
    - Linear 线性卷
    - Stripe 条带卷
    - RAID raid 逻辑卷
    - Mirror 镜像卷
    - Thinly-Provision 精简配置逻辑卷
    - Snapshot 快照卷
    - Thinly-Provisioned Snapshot 精简配置快照卷
    - Cache 缓存卷

## LVM 相关命令

### PV
- pvchange 更改物理卷属性
- pvck 检查物理卷元数据
- pvcreate 初始化磁盘或分区以供lvm使用
- pvdisplay 显示物理卷的属性
- pvmove 移动物理Exent
- pvremove 删除物理卷
- pvresize 调整lvm2使用的磁盘或分区的大小
- pvs 报告有关物理卷的信息
- pvscan 扫描物理卷的所有磁盘

### VG
- vgcfgbackup 备份卷组描述符区域
- vgcfgrestore 恢复卷组描述符区域
- vgchange 更改卷组的属性
- vgck 检查卷组元数据
- vgconvert 转换卷组元数据格式
- vgcreate 创建卷组
- vgdisplay 显示卷组的属性
- vgexport 使卷组对系统不了解（这是个什么）
- vgextend 将物理卷添加到卷组
- vgimportclone 导入并重命名重复的卷组（例如硬件快照）
- vgmerge 合并两个卷组
- vgmknodes 重新创建卷组目录和逻辑卷特殊文件
- vgreduce 通过删除一个或多个物理卷来减少卷组（将物理卷踢出VG）
- vgremove 删除卷组
- vgrename 重命名卷组
- vgs 报告有关卷组信息
- vgscan 扫描卷组的所有磁盘并重建高速缓存
- vgsplit 将卷组拆分为两个，通过移动整个物理卷将任何逻辑卷从一个卷组移动到另一个卷组

### LV
- lvchange 更改逻辑卷属性
- lvconvert 将逻辑卷从线性转换为镜像或快照
- lvcreate 将现有卷组中创建逻辑卷
- lvdisplay 显示逻辑卷的属性
- lvextend 扩展逻辑卷的大小
- lvmconfig 在加载lvm.conf和任何其他配置文件后显示配置信息
- lvmdiskscan 扫描lvm2可见的所有设备
- lvmdump 创建lvm2信息转储以用于诊断目的
- lvreduce 减少逻辑卷的大小
- lvremove 删除逻辑卷
- lvrename 重命名逻辑卷
- lvresize 调整逻辑卷大小
- lvs 报告有关逻辑卷的信息
- lvscan 扫描所有的逻辑卷

## 创建 LVM
- 将磁盘创建为 pv（物理卷），其实物理磁盘被条带化为 pv，划成了一个一个的 pe，默认每个 pe 大小是 4MB
- 创建 vg，其实它是一个空间池，不同PV加入同一 vg
- 创建 lv，组成 lv 的 pe 可能来自不同的物理磁盘
- 格式化 lv，挂载使用

## PV 管理
- 制作 pv
    ```bash
    pvcreate /dev/sdb1
    ```
- 删除 pv(需先踢出 vg)
    ```bash
    pvremove /dev/sdb1
    ```
- 同步物理卷容量
    ```bash
    pvresize /dev/sdb1
    ```

## VG 管理
- 制作 vg
    ```bash
    # vgcreate vg_name 磁盘设备或分区
    vgcreate datavg /dev/sdb1
    vgcreate datavg /dev/sdb1 /dev/sdb2
    # -s 指定pe的大小为16M，默认不指定是4M
    vgcreate -s 16M datavg2 /dev/sdb3
    ```
- 从 vg 中移除缺失的磁盘
    ```bash
    vgreduce --removemissing datavg
    vgreduce --removemissing datavg --force # 强制移除
    ```
- 扩展 vg 空间
    ```bash
    vgextend datavg /dev/sdb3 /dev/sdc
    ```
- 踢出 vg 中的某个成员
    ```bash
    vgreduce datavg /dev/sdb3
    ```
- 删除 vg
    ```bash
    vgremove VG
    ```
- 重命名 vg
    ```bash
    vgrename xxxx-vgid-xxxx-xxxx new_name
    ```

## LV 管理
- 制作 lv
    ```bash
    # -n lv_name，-L lv_size，datavg(vg name)
    lvcreate -n lvdata1 -L 1.5G datavg
    ```
- 激活修复后的逻辑卷
    ```bash
    lvchange -ay /dev/datavg/lvdata1
    lvchange -ay /dev/datavg/lvdata1 -K # 强制激活
    ```
- 创建 lvm 快照
    ```bash
    # 数据一致性备份
    # 先做一个快照，冻结当前系统，这样快照里面的内容可暂时保持不变
    # 系统本身继续运行，通过重新挂载备份快照卷，实现不中断服务备份。
    lvcreate -s -n kuaizhao01 -L 100M /dev/datavg/lvdata1
    ```
- 删除 lv
    ```bash
    lvremove /dev/mapper/VG-mylv
    ```
- 扩大一个 lv
    - 用vgdisplay查看vg还有多少空余空间
    - 扩充逻辑卷
        ```bash
        lvextend -L +1G /dev/VG/LV01
        # -r 表示在扩展的同时也更新文件系统，不是所有的发行版本都支持
        lvextend -L +1G /dev/VG/LV01 -r
        ```
    - 扩充操作后，df -h 发现大小并没有变，需更新文件系统
        ```bash
        # 不同文件系统更新的命令不一样
        e2fsck -f /dev/datavg/lvdata1 # ext4 文件系统，检查 lv 的文件系统
        resize2fs /dev/VG/LV01 # ext4 文件系统命令，该命令后面接 lv 的设备名就行
        xfs_growfs /nas # xfs 文件系统，该命令后面直接跟的是挂载点
        ```
    - 更新文件系统后，df -h 正常
- 缩小一个 lv
    - umount 卸载
    - 缩小文件系统
        ```bash
        resize2fs /dev/VG/LV01 2G
        ```
    - 缩小 lv
        ```bash
        lvreduce -L -1G /dev/VG/LV01
        ```
    - 查看 lvs，mount 挂载

## lvm 灾难恢复
- 场景: 三块盘做 lvm，现有一物理盘损坏，将剩下两块放到其他linux服务器上
- 恢复步骤
    - 查看磁盘信息，lvm信息，确认能查到lvm相关信息，找到VG组的名字
        ```bash
        pvs
        lvs
        vgs
        fidsk
        blkid
        ```
    - 删除 lvm 信息中损坏的磁盘角色，强制提出故障磁盘
        ```bash
        vgreduce --removemissing VG_name
        ```
    - 强制激活 vg 组
        ```bash
        vgchange -ay
        ```
    - 强制激活 lvm
        ```bash
        lvchange -ay /dev/VG_name
        ```
    - 挂载

