基础概念

Logical Volume Manager (LVM)

LVM 是一种可用在 Linux 内核 的 逻辑分卷管理器。

物理卷 Physical Volume (PV)

一个可供存储LVM的块设备。用于添加到 卷组(PV) 中成为卷组的一部分并将自身的空间添加到卷组供卷组使用。

卷组 Volume Group (VG)

作为存放逻辑卷的容器。多个 物理卷(PV) 的集合,整合多个物理卷的空间用于再分配。

逻辑卷 Logical Volume (LV)

存放在一个卷组中并由物理块组成。是一个类似于物理设备的块设备。在 卷组(VG) 中划出来的一个虚拟卷,可以直接挂在到系统中。

物理块 Physical Extent (PE)

一个卷组中最小的连续区域(默认为4 MiB),多个物理块将被分配给一个 逻辑卷(LV)。你可以把它看成物理卷的一部分。

使用

在 Linux 发行版 中操作 LVM,须先安装 lvm2 包。

创建过程:

  • 创建分区
  • 创建物理卷
  • 创建卷组
  • 将物理卷添加到卷组
  • 在卷组上创建逻辑卷
  • 格式化逻辑卷
  • 将逻辑卷挂载到系统
创建分区

在配置 LVM 前,须先将硬盘分区。 根据个人习惯使用相应命令(如 fdisk 、 cfdisk 、 sfdisk 等)创建分区。

创建物理卷

查询可被用作物理卷的设备

lvmdiskscan

在列出的设备上创建物理卷
该命令在各个设备上创建 LVM 头信息,其中设备可以是磁盘(/dev/sdb)、分区(/dev/sdb1)或环回设备,例如pvcreate /dev/sdb

pvcreate <设备>

查看已创建好的物理卷

pvdisplay
创建卷组

创建完物理卷之后,就需要开始创建卷组了。
首先必须先在其中一个物理卷(PV)创建一个卷组。

开始创建卷组

vgcreate <卷组名> <物理卷>

例如 vgcreate storage /dev/sdb1

让该卷组扩大到其他所有的物理卷

vgextend <卷组名> <物理卷>
vgextend <卷组名> <其它物理卷>

例如 vgextend storage /dev/sdb2 例如 vgextend storage /dev/sdc

创建卷组时也可以一次性添加多个物理卷,例如 vgcreate storage /dev/sdb1 /dev/sdb2 /dev/sdc

用以下命令查看已创建的卷组

vgdisplay
创建逻辑卷

创建完卷组,即可开始创建逻辑卷。
创建卷组

lvcreate -L <卷大小> <卷组名> -n <卷名>

例如 lvcreate -L 10G storage -n document,该命令执行完成后,即可通过 /dev/mapper/storage-document/dev/storage/document 来访问。

你还可以指定一个或多个物理卷来限制 LVM 分配数据空间的位置,仅需把物理卷设备加入到命令中,例如:

lvcreate -L 10G storage -n document /dev/sdb1

如果你想让逻辑卷拥有卷组的所有未使用空间,可以使用以下命令

lvcreate -l +100%free storage -n document

查看已经创建的逻辑卷

lvdisplay
格式化逻辑卷

创建完成逻辑卷你的逻辑卷应该已经在 /dev/mapper//dev/<卷组名> 中了。
如果你无法在以上位置找到它,请使用以下命令来加载模块、并扫描与激活卷组:

modprobe dm-mod
vgscan
vgchange -ay

在使用逻辑卷之前,应当先格式化为对应的分区

mkfs.<类型> /dev/mapper/<卷组名>-<卷名>

例如 mkfs.ext4 /dev/mapper/storage-document,将逻辑卷 /dev/mapper/storage-document 格式化为 Ext4 。

将逻辑卷挂载到系统

格式化完成分区后,即可将对应逻辑卷挂载到系统了

mount <逻辑卷> <挂载点>

例如 mount /dev/mapper/storage-document /usr/document

其他

配置 mkinitcpio

如果你的根文件系统基于LVM,你需要启用适当的 mkinitcpio 钩子,否则你的系统可能无法启动。

  • 若使用基于busybox的initramfs,请启用udev和lvm2。
  • 若使用基于systemd的initramfs,请启用systemd和sd-lvm2。

基于busybox的initramfs ,修改 /etc/mkinitcpio.conf

HOOKS="base udev ... block lvm2 filesystems"

基于systemd的initramfs ,修改 /etc/mkinitcpio.conf

HOOKS=(base systemd ... block sd-lvm2 filesystems)

之后你就可以继续下一步的创建和启用镜像操作了。

相关命令

通用参数
-v|--verbose 显示执行过程
    -y|--yes 跳过创建过程中的确认提示
pvcreate 初始化物理卷以供 LVM 使用
pvcreate <物理卷>
    -f|--force 强制创建物理卷,即使设备已经包含文件系统或者 LVM 元数据
    -M|--metadatatype lvm2 用于指定物理卷元数据的大小
    -u|--uuid <UUID> 用于指定要创建的物理卷的 UUID
    -Z|--zero <y|n> 创建物理卷时填充零
pvchange 更改物理卷的属性
pvchange <参数> <物理卷>
    -a|--all 更改所有物理卷的属性
    -x|--allocatable <y|n> 是否允许分配PE
    -u|--uuid 生成新的UUID
pvresize 调整物理卷大小
pvresize <物理卷>
    --setphysicalvolumesize <大小[m|UNIT]> 用于设置物理卷的新大小
    --reportformat <basic|json> 设置当前报告的输出格式
pvremove 从物理卷中删除LVM标签
pvremove <物理卷>
    -f|--force 强制删除
    --reportformat <basic|json> 设置当前报告的输出格式
pvdisplay 显示物理卷的各种属性
pvdisplay
    -a|--all 显示所有定义的物理卷
    -C|--colon 以冒号分隔每个字段
    -m|--maps 显示物理卷的映射信息
    -s|--short 只显示物理卷的UUID和大小信息
    -v<详细程度>|--verbose=<详细程度> 指定显示的详细程度,范围为1~4
vgcreate 创建卷组
vgcreate <新卷组名> <物理卷> ...
    -A|--autobackup <y|n> 是否自动备份卷组的元数据,默认为y
    -c|--clustered <y|n> 是否创建为一个集群卷组,默认为n
    -l|--maxlogicalvolumes <数字> 卷组上允许创建的最大逻辑卷数
    -p|--maxphysicalvolumes <数字> 卷组中允许添加的最大物理卷数
    -s|--physicalextentsize <大小[m|UNIT]> 卷组上的物理卷的PE大小
    -Z|--zero <y|n> 创建卷组时填充零
vgextend 将物理卷添加到卷组
vgextend <卷组> <物理卷>
vgremove 删除卷组
vgremove <卷组>
vgmerge 合并卷组
vgremove <卷组1> <卷组2>
    -A|--autobackup <y|n> 是否自动备份卷组的元数据,默认为y
    -l|--list 显示合并的卷组名
vgrename 重命名一个卷组
vgrename <卷组> <新卷组名>
lvcreate 创建逻辑卷
创建线性逻辑卷
lvcreate -L|--size <大小[m|UNIT]> <卷组>
    --type linear ] (隐性) 逻辑卷类型
    -l|--extents <数字[百分比]> 以物理块数量设置大小

创建条带化逻辑卷
lvcreate -i|--stripes <条带数量> -L|--size <大小[m|UNIT]> <卷组>
    --type striped (隐性) 逻辑卷类型
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -I|--stripesize <大小[k|UNIT]> 条带大小

创建一个 RAID1 或 镜像 的逻辑卷
lvcreate -m|--mirrors <镜像数量> -L|--size <大小[m|UNIT]> <卷组>
    --type raid1|mirror (隐性) 逻辑卷类型
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -I|--stripesize <大小[k|UNIT]> 条带大小

创建 RAID 逻辑卷 (必须使用特定的raid级别,例如raid1).
lvcreate --type raid -L|--size <大小[m|UNIT]> <卷组>
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -i|--stripes <条带数量>
    -I|--stripesize <大小[k|UNIT]> 条带大小
    -m|--mirrors <镜像数量>

创建 RAID10 逻辑卷
lvcreate -m|--mirrors Number -i|--stripes Number -L|--size <大小[m|UNIT]> <卷组>
    --type raid10 (隐性) 逻辑卷类型
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -I|--stripesize <大小[k|UNIT]> 条带大小

创建一个写时复制快照逻辑卷 或 原始逻辑卷
lvcreate -s|--snapshot -L|--size <大小[m|UNIT]> <卷组>
    --type snapshot (隐性) 逻辑卷类型
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -i|--stripes <条带数量>
    -I|--stripesize <大小[k|UNIT]> 条带大小
    -c|--chunksize <大小[k|UNIT]> 块大小

创建一个瘦池
lvcreate --type thin-pool -L|--size <大小[m|UNIT]> <卷组>
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -i|--stripes <条带数量>
    -I|--stripesize <大小[k|UNIT]> 条带大小
    -T|--thin
    -c|--chunksize <大小[k|UNIT]> 块大小

创建一个缓存池
lvcreate --type cache-pool -L|--size <大小[m|UNIT]> <卷组>
    -l|--extents <数字[百分比]> 以物理块数量设置大小
    -i|--stripes <条带数量>
    -I|--stripesize <大小[k|UNIT]> 条带大小
    -H|--cache
    -c|--chunksize <大小[k|UNIT]> 块大小
    --cachemode writethrough|writeback|passthrough
    --cachepolicy String
    --cachesettings String
    --cachemetadataformat auto|1|2
    --poolmetadatasize Size[m|UNIT]
    --poolmetadataspare y|n

在瘦池中创建逻辑卷
lvcreate -V|--virtualsize Size[m|UNIT] --thinpool LV VG
    --type thin (隐性) 逻辑卷类型
    -T|--thin


# 通用参数
    -a|--activate <y|n|ay> 设置活动状态
    -A|--autobackup <y|n> 是否自动备份元数据
    -C|--contiguous y|n 逻辑卷的连续分配策略
    -M|--persistent y|n
    -j|--major Number
    -k|--setactivationskip y|n
    -K|--ignoreactivationskip
    -n|--name String
    -p|--permission rw|r
    -r|--readahead auto|none|Number
    -W|--wipesignatures y|n
    -Z|--zero y|n
lvchange 更改逻辑卷的属性
lvchange <逻辑卷>
    -C|--contiguous y|n 试图设置或重置连续分配策略
    -p|--permission rw|r 设置权限
    -r|--readahead auto|none|Number 
    -k|--setactivationskip y|n 启用或禁用激活跳过标志
    -Z|--zero y|n 填充零
    -M|--persistent n 使次要号码指定为永久
    -a|--activate y|n|ay 设置活动状态
    -A|--autobackup y|n 是否自动备份元数据
    -f|--force 强制执行
lvremove 从系统中删除逻辑卷
lvremove <逻辑卷>
    -f|--force 强制删除
lvrename 重命名逻辑卷
lvrename [卷组] <逻辑卷> <新逻辑卷名称>
lvresize 调整逻辑卷的大小
lvresize -L|--size <[+|-]大小[m|UNIT]> 逻辑卷
    -l|--extents <[+|-]数字[百分比]>