基础概念
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 <[+|-]数字[百分比]>