-
LVM 是一种可用在
Linux内核的
逻辑分卷管理器;可用于管理磁盘驱动器或其他类似的大容量存储设备。
LVM基本组成
LVM利用Linux内核的device-mapper来实现存储系统的虚拟化(系统分区独立于底层硬件)。 通过LVM,你可以实现存储空间的抽象化并在上面建立虚拟分区(virtual partitions),可以更简便地扩大和缩小分区,可以增删分区时无需担心某个硬盘上没有足够的连续空间
LVM的基本组成块(building blocks)如下:
- 物理卷Physical volume (PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。
- 卷组Volume group (VG):将一组物理卷收集为一个管理单元。
- 逻辑卷Logical volume (LV):虚拟分区,由物理区域(physical extents)组成。
- 物理区域Physical extent (PE):硬盘可供指派给逻辑卷的最小单位(通常为4MB)
示例:
两块物理硬盘 硬盘1 (/dev/sda): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |分区1 50GB (物理卷) |分区2 80GB (物理卷) | |/dev/sda1 |/dev/sda2 | |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ __| 硬盘2 (/dev/sdb): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |分区1 120GB (物理卷) | |/dev/sdb1 | | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
LVM方式 卷组VG1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1): _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ |逻辑卷1 15GB |逻辑卷2 35GB |逻辑卷3 200GB | |/dev/MyStorage/rootvol |/dev/MyStorage/homevol |/dev/MyStorage/mediavol | |_ _ _ _ _ _ _ _ _ _ _ _ _ _ __|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|
优点
比起正常的硬盘分区管理,LVM更富于弹性:
- 使用卷组(VG),使众多硬盘空间看起来像一个大硬盘。
- 使用逻辑卷(LV),可以创建跨越众多硬盘空间的分区。
- 可以创建小的逻辑卷(LV),在空间不足时再动态调整它的大小。
- 在调整逻辑卷(LV)大小时可以不用考虑逻辑卷在硬盘上的位置,不用担心没有可用的连续空间。It does not depend on the position of the LV within VG, there is no need to ensure surrounding available space.
- 可以在线(online)对逻辑卷(LV)和卷组(VG)进行创建、删除、调整大小等操作。LVM上的文件系统也需要重新调整大小,某些文件系统也支持这样的在线操作。
- 无需重新启动服务,就可以将服务中用到的逻辑卷(LV)在线(online)/动态(live)迁移至别的硬盘上。
- 允许创建快照,可以保存文件系统的备份,同时使服务的下线时间(downtime)降低到最小。
这些优点使得LVM对服务器的管理非常有用,对于桌面系统管理的帮助则没有那么显著,你需要根据实际情况进行取舍。
缺点
- 在系统设置时需要更复杂的额外步骤。
创建分区
创建物理卷(PV)
可通过以下命令列出可被用作物理卷的设备:
# lvmdiskscan
在列出的设备上创建物理卷:
# pvcreate DEVICE
该命令在各个设备上创建LVM使用的头部。如#LVM基本组成所示, DEVICE可以是磁盘(如
/dev/sda
),分区(如/dev/sda2
)或环回设备。例如:# pvcreate /dev/sda2
你可以用以下命令查看已创建好的物理卷:
# pvdisplay
创建卷组(VG)
创建完成物理卷(PV)之后,下一步就是在该物理卷创建卷组(VG)了。 首先必须先在其中一个物理卷(PV)创建一个卷组
# vgcreate <volume_group> <physical_volume>
例如:
# vgcreate VolGroup00 /dev/sda2
然后让该卷组扩大到其他所有的物理卷:
# vgextend <volume_group> <physical_volume> # vgextend <volume_group> <another_physical_volume> # ...
例如:
# vgextend VolGroup00 /dev/sdb1 # vgextend VolGroup00 /dev/sdc
其中,“VolGroup00”名字换成你自己起的名字即可。接下来可以用以下命令查看卷组:
# vgdisplay
创建逻辑卷(LV)
创建完卷组(VG)之后,就可以开始创建逻辑卷(LV)了。输入下面命令以指定新逻辑卷的名字、大小及其所在的卷组:
# lvcreate -L <size> <volume_group> -n <logical_volume>
例如:
# lvcreate -L 10G VolGroup00 -n lvolhome
该逻辑卷创建完后,你就可以通过
/dev/mapper/Volgroup00-lvolhome
或/dev/VolGroup00/lvolhome
来访问它。与卷组命名类似,你可以按你的需要将逻辑卷命名。你可以指定一个或多个物理卷来限制LVM分配数据空间的位置。比如你希望在较小的SSD硬盘上创建根文件系统,并在较慢的机械硬盘上创建家目录卷,仅需把物理卷设备加入到命令中,例如:
# lvcreate -L 10G VolGroup00 -n lvolhome /dev/sdc1
如果你想让要创建的逻辑卷拥有卷组(VG)的所有未使用空间,请使用以下命令:
# lvcreate -l +100%FREE <volume_group> -n <logical_volume>
可以通过以下命令来查看逻辑卷:
# lvdisplay
建立文件系统与挂载逻辑卷
现在你的逻辑卷应该已经在
/dev/mapper/
和/dev/YourVolumeGroupName
中了。如果你无法在以上位置找到它,请使用以下命令来加载模块、并扫描与激活卷组:# modprobe dm-mod # vgscan # vgchange -ay
现在你可以在逻辑卷上创建文件系统并像普通分区一样挂载它了(如果你正在安装Arch linux,需要更详细的信息,请参考挂载分区):
# mkfs.<fstype> /dev/mapper/<volume_group>-<logical_volume> # mount /dev/mapper/<volume_group>-<logical_volume> /<mountpoint>
例如:
# mkfs.ext4 /dev/mapper/VolGroup00-lvolhome # mount /dev/mapper/VolGroup00-lvolhome /home
在mkinitcpio.conf中加入lvm的钩子扩展(hook)
如果你的根文件系统基于LVM,你需要保证
udev
和lvm2
这两个mkinitcpio的钩子扩展被启用。udev
默认已经预设好,不必手动启用了。你只需要编辑/etc/mkinitcpio.conf
文件,在block
与filesystem
这两项中间插入lvm2
:/etc/mkinitcpio.conf
HOOKS="base udev ... block lvm2 filesystems"
配置
高级选项
如果你需要监控功能(这对快照是必须的),那么你需要启用lvmetad。 这只需要在
/etc/lvm/lvm.conf
文件中设置use_lvmetad = 1
选项即可。 目前这个选项已经成为预设选项,不需要手动设置。可以通过修改
/etc/lvm/lvm.conf
文件中的auto_activation_volume_list
参数限制自动激活的卷。如果存在问题,可以将此选项注释掉。物理卷
对于存在物理卷的设备,在扩增其容量之后或缩小其容量之前,必须使用
pvresize
命令对应地增加或减少物理卷的大小。扩增
增大分区
/dev/sda1
的容量之后,需要执行以下命令扩展物理卷的大小# pvresize /dev/sda1
命令将自动探测设备当前大小并将物理卷扩展到其最大容量。
缩小
在减少某个物理卷所在设备大小之前,需要通过指定
--setphysicalvolumesize size
参数缩小物理卷大小,例如:# pvresize --setphysicalvolumesize 40G /dev/sda1
该命令可能会提示以下错误:
/dev/sda1: cannot resize to 25599 extents as later ones are allocated. 0 physical volume(s) resized / 1 physical volume(s) not resized
即该物理卷已分配物理区域超过了命令指定的新大小边界,
pvresize
会拒绝将物理卷缩小。若磁盘空间足够,可通过pvmove将物理区域重新分配至别的卷组来解决这个问题。移动物理区域
在移动空闲的物理区域到卷尾部之前,需要运行
# pvdisplay -v -m
命令查看物理分段。如下例所示,仅有一个物理卷/dev/sdd1
, 一个卷组vg1
和一个逻辑卷backup
# pvdisplay -v -m
Finding all volume groups. Using physical volume(s) on command line. --- Physical volume --- PV Name /dev/sdd1 VG Name vg1 PV Size 1.52 TiB / not usable 1.97 MiB Allocatable yes PE Size 4.00 MiB Total PE 399669 Free PE 153600 Allocated PE 246069 PV UUID MR9J0X-zQB4-wi3k-EnaV-5ksf-hN1P-Jkm5mW --- Physical Segments --- Physical extent 0 to 153600: FREE Physical extent 153601 to 307199: Logical volume /dev/vg1/backup Logical extents 1 to 153599 Physical extent 307200 to 307200: FREE Physical extent 307201 to 399668: Logical volume /dev/vg1/backup Logical extents 153601 to 246068
可用空间在卷中段。为了减小物理卷大小,首先必须把所有的已用分段移到前部。
此例中,第一个可用空间在第0至第153600分段共153601个可用区域。我们可以从最后的分段中移动相同数目的物理区域来填补这段空间
# pvmove --alloc anywhere /dev/sdd1:307201-399668 /dev/sdd1:0-92466
/dev/sdd1: Moved: 0.1 % /dev/sdd1: Moved: 0.2 % ... /dev/sdd1: Moved: 99.9 % /dev/sdd1: Moved: 100,0%
调整物理卷大小
当所有空闲分段都移动到最后的物理区域时,运行
# vgdisplay
查看。之后可以再次运行命令:
# pvresize --setphysicalvolumesize size PhysicalVolume
结果类似:
# pvs
PV VG Fmt Attr PSize PFree /dev/sdd1 vg1 lvm2 a-- 1t 500g
调整分区大小
最后,你可以用你喜欢的分区工具来缩小该分区。
逻辑卷
使用lvresize增加或缩小容量
为了向逻辑组vg1中的逻辑卷lv1增加2GB空间但并不修改其文件系统,执行:
# lvresize -L +2G vg1/lv1
而从逻辑组
vg1/lv1
中减少500MB空间但并不修改其文件系统大小(需要确保文件系统已经缩小过[broken link: invalid section]),执行:# lvresize -L -500M vg1/lv1
设置
vg1/lv1
为15GB并同时更改其文件系统大小:# lvresize -L 15G -r vg1/lv1
如果想将所有可用空间都加入一个卷组,可以执行:
# lvresize -l +100%FREE vg/lv
查阅
man lvresize
可见详细说明。单独设置文件系统大小
如果在执行
lv{resize,extend,reduce}
时没有使用-r, --resizefs
选项, 或文件系统不支持fsadm(8)
(如Btrfs, ZFS等),则需要在缩小逻辑卷之前或扩增逻辑卷后手动调整文件系统大小。例如对于ext2/ext3/ext4文件系统:
# resize2fs vg/lv
会将文件系统大小扩展到逻辑卷支持的最大容量,而
# resize2fs -M vg/lv
会将文件系统减小到其所需的最小容量。也可以指定具体的尺寸:
# resize2fs vg/lv NewSize
移除逻辑卷
首先,找到你所要移除的逻辑卷的名称。你可以使用以下命令来查看系统的所有逻辑卷:
# lvs
接下来,找到你所要移除的逻辑卷的挂载点
$ lsblk
并卸载它:
# umount /<mountpoint>
最后,使用以下命令来移除逻辑卷:
# lvremove <volume_group>/<logical_volume>
例如:
# lvremove VolGroup00/lvolhome
请输入
y
来确定你要执行移除逻辑卷操作。此外,请不要忘了更新
/etc/fstab
。你可以再次使用
lvs
命令来确认你的逻辑卷已被移除。添加物理卷(PV)到卷组(VG)中
首先创建一个新的物理卷(PV),再把卷组(VG)扩充到该物理卷上:
# pvcreate /dev/sdb1 # vgextend VolGroup00 /dev/sdb1
这将增加你卷组中的物理区域总数,你可以按需要将它们分配到逻辑卷中。
从卷组(VG)中移除分区
首先,分区中的所有数据需要被转移到别的分区,幸而LVM提供了以下的简便方式:
# pvmove /dev/sdb1
如果你想指定所要转移的目标分区,那么可以把该分区作为
pvmove
的第二个参数:# pvmove /dev/sdb1 /dev/sdf1
接着,从卷组(VG)中移除物理卷(PV):
# vgreduce myVg /dev/sdb1
或者把所有的空物理卷(PV)都移除掉:
# vgreduce --all vg0
最后,如果你仍然想要使用该分区,而且不想让LVM以为它是一个物理卷,那么你可以执行以下命令:
# pvremove /dev/sdb1
快照功能
介绍
LVM可以给系统创建一个快照,由于使用了写入时复制(copy-on-write) 策略,相比传统的备份更有效率。 初始的快照只有关联到实际数据的inode的实体链接(hark-link)而已。只要实际的数据没有改变,快照就只会包含指向数据的inode的指针,而非数据本身。一旦你更改了快照对应的文件或目录,LVM就会自动拷贝相应的数据,包括快照所对应的旧数据的拷贝和你当前系统所对应的新数据的拷贝。这样的话,只要你修改的数据(包括原始的和快照的)不超过2G,你就可以只使用2G的空间对一个有35G数据的系统创建快照。
配置
你可以像创建普通逻辑卷一样创建快照逻辑卷。
# lvcreate --size 100M --snapshot --name snap01 /dev/mapper/vg0-pv
你可以修改少于100M的数据直到该快照逻辑卷空间不足为止。
更多资源
- LVM2 Resource Page on SourceWare.org
- LVM HOWTO article at The Linux Documentation project
- LVM article at Gentoo wiki
- LVM2 Mirrors vs. MD Raid 1 post by Josh Bryan
- Ubuntu LVM Guide Part 1Part 2 detals snapshots
LVM介绍及使用
最新推荐文章于 2024-04-25 10:55:32 发布