如何在 Ubuntu 16.04 上使用 LVM 管理存储设备
介绍
LVM,即逻辑卷管理,是一种存储设备管理技术,它使用户能够汇集和抽象组件存储设备的物理布局,以便更轻松、更灵活地进行管理。利用设备映射器 Linux 内核框架,当前迭代 LVM2 可用于将现有存储设备分组,并根据需要从组合空间分配逻辑单元。
在本指南中,我们将介绍如何使用 LVM 管理您的存储设备。我们将向您展示如何显示有关卷和潜在目标的信息,如何创建和销毁各种类型的卷,以及如何通过调整大小或转换来修改现有卷。我们将使用 Ubuntu 16.04 服务器来演示这些操作。
先决条件
为了继续学习,您应该可以访问 Ubuntu 16.04 服务器。您将需要为管理任务配置具有 sudo
权限的非根用户。您可以按照我们的 Ubuntu 16.04 初始服务器设置指南创建必要的帐户。
要熟悉 LVM 组件和概念并测试基本的 LVM 配置,请在开始本教程之前遵循我们对 LVM 指南的介绍。
准备就绪后,使用 sudo
用户登录到您的服务器。
显示有关物理卷、卷组和逻辑卷的信息
能够轻松获得有关系统中各种 LVM 组件的信息非常重要。幸运的是,LVM 工具套件提供了大量工具来显示有关 LVM 堆栈中每一层的信息。
显示有关所有 LVM 兼容块存储设备的信息
要显示 LVM 可能管理的所有可用块存储设备,请使用 lvmdiskscan
命令:
- sudo lvmdiskscan
Output /dev/ram0 [ 64.00 MiB]
/dev/sda [ 200.00 GiB]
/dev/ram1 [ 64.00 MiB]
. . .
/dev/ram15 [ 64.00 MiB]
/dev/sdb [ 100.00 GiB]
2 disks
17 partitions
0 LVM physical volume whole disks
0 LVM physical volumes
忽略 /dev/ram*
设备(Linux ram 磁盘实现的一部分),我们可以看到可以用作 LVM 物理卷的设备。
这可能是您添加新存储设备以与 LVM 一起使用时的第一步。
显示有关物理卷的信息
标头被写入存储设备以将它们标记为可自由用作 LVM 组件。具有这些标头的设备称为物理卷。
您可以使用带有 -l
选项的 lvmdiskscan
显示系统上的所有物理设备,这只会返回物理卷:
- sudo lvmdiskscan -l
Output WARNING: only considering LVM devices
/dev/sda [ 200.00 GiB] LVM physical volume
/dev/sdb [ 100.00 GiB] LVM physical volume
2 LVM physical volume whole disks
0 LVM physical volumes
pvscan
命令与上述命令非常相似,因为它会在所有可用设备中搜索 LVM 物理卷。输出格式有点不同,它包含少量附加信息:
- sudo pvscan
Output PV /dev/sda VG LVMVolGroup lvm2 [200.00 GiB / 0 free]
PV /dev/sdb VG LVMVolGroup lvm2 [100.00 GiB / 10.00 GiB free]
Total: 2 [299.99 GiB] / in use: 2 [299.99 GiB] / in no VG: 0 [0 ]
如果您需要更多详细信息,pvs
和 pvdisplay
命令是更好的选择。
pvs
命令是高度可配置的,可以以多种不同的格式显示信息。因为它的输出可以被严格控制,所以在需要脚本或自动化时经常使用它。它的基本输出提供了一个有用的一目了然的总结,类似于早期的命令:
- sudo pvs
Output PV VG Fmt Attr PSize PFree
/dev/sda LVMVolGroup lvm2 a-- 200.00g 0
/dev/sdb LVMVolGroup lvm2 a-- 100.00g 10.00g
对于更详细、人类可读的输出,pvdisplay
命令通常是更好的选择:
- sudo pvdisplay
Output --- Physical volume ---
PV Name /dev/sda
VG Name LVMVolGroup
PV Size 200.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 51199
Free PE 0
Allocated PE 51199
PV UUID kRUOyU-0ib4-ujPh-kAJP-eeQv-ztRL-4EkaDQ
--- Physical volume ---
PV Name /dev/sdb
VG Name LVMVolGroup
PV Size 100.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25599
Free PE 2560
Allocated PE 23039
PV UUID udcuRJ-jCDC-26nD-ro9u-QQNd-D6VL-GEIlD7
如您所见,pvdisplay
命令通常是获取有关物理卷详细信息的最简单命令。
要发现已映射到每个卷的逻辑范围,请将 -m
选项传递给 pvdisplay
:
- sudo pvdisplay -m
Output --- Physical volume ---
PV Name /dev/sda
VG Name LVMVolGroup
PV Size 200.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 51199
Free PE 38395
Allocated PE 12804
PV UUID kRUOyU-0ib4-ujPh-kAJP-eeQv-ztRL-4EkaDQ
--- Physical Segments ---
Physical extent 0 to 0:
Logical volume /dev/LVMVolGroup/db_rmeta_0
Logical extents 0 to 0
Physical extent 1 to 5120:
Logical volume /dev/LVMVolGroup/db_rimage_0
Logical extents 0 to 5119
. . .
当出于管理目的而尝试确定哪些数据保存在哪个物理磁盘上时,这可能非常有用。
显示有关卷组的信息
LVM 也有很多工具来显示有关卷组的信息。
vgscan
命令可用于扫描系统中的可用卷组。它还会在必要时重建缓存文件。当您将卷组导入新系统时,这是一个很好的命令:
- sudo vgscan
Output Reading all physical volumes. This may take a while...
Found volume group "LVMVolGroup" using metadata type lvm2
该命令不会输出太多信息,但它应该能够找到系统上的每个可用卷组。要显示更多信息,可以使用 vgs
和 vgdisplay
命令。
与其对应的物理卷一样,vgs
命令用途广泛,可以多种格式显示大量信息。因为它的输出很容易操作,所以在需要脚本或自动化时经常使用它。例如,一些有用的输出修改是为了显示物理设备和逻辑卷路径:
- sudo vgs -o +devices,lv_path
Output VG #PV #LV #SN Attr VSize VFree Devices Path
LVMVolGroup 2 4 0 wz--n- 299.99g 10.00g /dev/sda(0) /dev/LVMVolGroup/projects
LVMVolGroup 2 4 0 wz--n- 299.99g 10.00g /dev/sda(2560) /dev/LVMVolGroup/www
LVMVolGroup 2 4 0 wz--n- 299.99g 10.00g /dev/sda(3840) /dev/LVMVolGroup/db
LVMVolGroup 2 4 0 wz--n- 299.99g 10.00g /dev/sda(8960) /dev/LVMVolGroup/workspace
LVMVolGroup 2 4 0 wz--n- 299.99g 10.00g /dev/sdb(0) /dev/LVMVolGroup/workspace
对于更详细、人类可读的输出,vgdisplay
命令通常是最佳选择。添加 -v
标志还提供有关构建卷组的物理卷以及使用卷组创建的逻辑卷的信息:
- sudo vgdisplay -v
Output Using volume group(s) on command line.
--- Volume group ---
VG Name LVMVolGroup
. . .
--- Logical volume ---
LV Path /dev/LVMVolGroup/projects
. . .
--- Logical volume ---
LV Path /dev/LVMVolGroup/www
. . .
--- Logical volume ---
LV Path /dev/LVMVolGroup/db
. . .
--- Logical volume ---
LV Path /dev/LVMVolGroup/workspace
. . .
--- Physical volumes ---
PV Name /dev/sda
. . .
PV Name /dev/sdb
. . .
vgdisplay
命令很有用,因为它可以将有关 LVM 堆栈的许多不同元素的信息联系在一起。
显示有关逻辑卷的信息
为了显示有关逻辑卷的信息,LVM 有一组相关的工具。
与其他 LVM 组件一样,lvscan
选项扫描系统并输出有关它找到的逻辑卷的最少信息:
- sudo lvscan
Output ACTIVE '/dev/LVMVolGroup/projects' [10.00 GiB] inherit
ACTIVE '/dev/LVMVolGroup/www' [5.00 GiB] inherit
ACTIVE '/dev/LVMVolGroup/db' [20.00 GiB] inherit
ACTIVE '/dev/LVMVolGroup/workspace' [254.99 GiB] inherit
要获得更完整的信息,lvs
命令灵活、强大且易于在脚本中使用:
- sudo lvs
Output LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
db LVMVolGroup -wi-ao---- 20.00g
projects LVMVolGroup -wi-ao---- 10.00g
workspace LVMVolGroup -wi-ao---- 254.99g
www LVMVolGroup -wi-ao---- 5.00g
要了解条带数和逻辑卷类型,请使用 --segments
选项:
- sudo lvs --segments
Output LV VG Attr #Str Type SSize
db LVMVolGroup rwi-a-r--- 2 raid1 20.00g
mirrored_vol LVMVolGroup rwi-a-r--- 3 raid1 10.00g
test LVMVolGroup rwi-a-r--- 3 raid5 10.00g
test2 LVMVolGroup -wi-a----- 2 striped 10.00g
test3 LVMVolGroup rwi-a-r--- 2 raid1 10.00g
最易读的输出是由 lvdisplay
命令产生的。
添加 -m
标志后,该工具还将显示有关逻辑卷如何分解和分布的信息:
- sudo lvdisplay -m
Output --- Logical volume ---
LV Path /dev/LVMVolGroup/projects
LV Name projects
VG Name LVMVolGroup
LV UUID IN4GZm-ePJU-zAAn-DRO3-1f2w-qSN8-ahisNK
LV Write Access read/write
LV Creation host, time lvmtest, 2016-09-09 21:00:03 +0000
LV Status available
# open 1
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 252:0
--- Segments ---
Logical extents 0 to 2559:
Type linear
Physical volume /dev/sda
Physical extents 0 to 2559
. . .
正如您从底部的输出中看到的那样,/dev/LVMVolGroup/projects
逻辑卷在此示例中完全包含在 /dev/sda
物理卷中。如果您需要移除该底层设备并希望将数据移至特定位置,则此信息很有用。
创建或扩展 LVM 组件
本节将讨论如何创建和扩展物理卷、卷组和逻辑卷。
从原始存储设备创建物理卷
为了在 LVM 中使用存储设备,必须首先将它们标记为物理卷。这指定 LVM 可以使用卷组中的设备。
首先,使用 lvmdiskscan
命令查找 LVM 可以看到和使用的所有块设备:
- sudo lvmdiskscan
Output /dev/ram0 [ 64.00 MiB]
/dev/sda [ 200.00 GiB]
/dev/ram1 [ 64.00 MiB]
. . .
/dev/ram15 [ 64.00 MiB]
/dev/sdb [ 100.00 GiB]
2 disks
17 partitions
0 LVM physical volume whole disks
0 LVM physical volumes
在这里,忽略/dev/ram*
设备,我们可以看到适合在物理卷中为LVM打开的设备。
警告:确保您仔细检查要与 LVM 一起使用的设备没有已写入任何重要数据。在 LVM 中使用这些设备将覆盖当前内容。如果您的服务器上已有重要数据,请在继续之前进行备份。
要将存储设备标记为 LVM 物理卷,请使用 pvcreate
。您可以一次传入多个设备:
- sudo pvcreate /dev/sda /dev/sdb
这应该在所有目标设备上写入一个 LVM 标头,以将它们标记为 LVM 物理卷。
从物理卷创建新的卷组
要从 LVM 物理卷创建新的卷组,请使用 vgcreate
命令。您必须提供卷组名称,后跟至少一个 LVM 物理卷:
- sudo vgcreate volume_group_name /dev/sda
此示例将创建具有单个初始物理卷的卷组。如果您愿意,可以在创建时传入多个物理卷:
- sudo vgcreate volume_group_name /dev/sda /dev/sdb /dev/sdc
通常每个服务器只需要一个卷组。所有 LVM 管理的存储都可以添加到该池中,然后可以从中分配逻辑卷。
您可能希望拥有多个卷组的原因之一是您觉得需要为不同的卷使用不同的区段大小。通常您不必设置扩展区大小(默认大小 4M 足以满足大多数用途),但如果需要,您可以在创建卷组时通过传递 -s
选项来设置:
- suod vgcreate -s 8M volume_group_name /dev/sda
这将创建一个具有 8M extent 大小的新卷组。
将物理卷添加到现有卷组
要通过添加额外的物理卷来扩展卷组,请使用 vgextend
命令。此命令采用一个卷组,后跟要添加的物理卷。如果您愿意,可以一次传入多个设备:
- sudo vgextend volume_group_name /dev/sdb
物理卷将被添加到卷组中,扩展存储池的可用容量。
通过指定大小创建逻辑卷
要从卷组存储池中创建逻辑卷,请使用 lvcreate
命令。使用-L
选项指定逻辑卷的大小,使用-n
选项指定名称,并传入要从中分配空间的卷组。
例如,要从 LVMVolGroup
卷组创建名为 test
的 10G 逻辑卷,请键入:
- sudo lvcreate -L 10G -n test LVMVolGroup
如果卷组有足够的可用空间来容纳卷容量,就会创建新的逻辑卷。
从所有剩余可用空间创建逻辑卷
如果您希望使用卷组中的剩余可用空间创建卷,请使用带有 -n
选项的 vgcreate
命令来命名并像以前一样传入卷组.不要传入大小,而是使用 -l 100%FREE
选项,该选项使用卷组中的剩余范围来形成逻辑卷:
- sudo lvcreate -l 100%FREE -n test2 LVMVolGroup
这应该用完逻辑卷中的剩余空间。
使用高级选项创建逻辑卷
也可以使用一些高级选项创建逻辑卷。您可能希望考虑的一些选项是:
- --type:指定逻辑卷的类型,决定逻辑卷的分配方式。如果没有足够的基础物理体积来正确创建所选地形,则某些可用类型将不可用。一些最常见的类型是:
- 线性:默认类型。使用的底层物理设备(如果不止一个)将简单地一个接一个地附加到彼此。
- 条带化:与 RAID 0 类似,条带化拓扑将数据分成块,并以循环方式分布在底层物理卷中。这可以提高性能,但可能会导致更大的数据漏洞。这需要下面描述的
-i
选项和至少两个物理卷。 - raid1:创建镜像 RAID 1 卷。默认情况下,镜像将有两个副本,但可以通过下面描述的
-m
选项指定更多副本。至少需要两个物理卷。 - raid5:创建 RAID 5 卷。至少需要三个物理卷。
- raid6:创建 RAID 6 卷。至少需要四个物理卷。
我们将提供这些选项的一些示例来演示它们通常是如何使用的。
要创建条带卷,您必须至少指定两个条带。此拓扑和条带数至少需要两个具有可用容量的物理卷:
- sudo lvcreate --type striped -i 2 -L 10G -n striped_vol LVMVolGroup
要创建镜像卷,请使用
raid1
类型。如果您想要两组以上的数据,请使用-m
选项。此示例使用-m 2
创建了总共三组数据(LVM 将其计为一个原始数据集和两个镜像)。您至少需要三个物理卷才能成功:- sudo lvcreate --type raid1 -m 2 -L 20G -n mirrored_vol LVMVolGroup
要创建卷的快照,您必须向快照提供原始逻辑卷而不是卷组。快照最初不会占用太多空间,但会随着对其跟踪的逻辑卷的更改而增加大小。在此过程中使用的大小是快照的最大大小(增长超过此大小的快照已损坏且无法使用;但是可以扩展接近其容量的快照):
- sudo lvcreate -s -L 10G -n snap_test LVMVolGroup/test
注意:要将逻辑卷恢复到快照的时间点,请使用
lvconvert --merge
命令:- sudo lvconvert --merge LVMVolGroup/snap_test
这将使快照的来源恢复到拍摄快照时的状态。
如您所见,有许多选项可以显着改变逻辑卷的运行方式。
增加逻辑卷的大小
LVM 的主要优点之一是它在供应逻辑卷方面提供的灵活性。您可以在不停止系统的情况下轻松地即时调整卷的数量或大小。
要增加现有逻辑卷的大小,请使用
lvresize
命令。使用-L
标志指定新大小。您还可以通过添加“+”大小来使用相对大小。在这种情况下,LVM 将按指定的数量增加逻辑卷的大小。要自动调整逻辑卷上使用的文件系统的大小,请传入--resizefs
标志。要正确提供要扩展的逻辑卷的名称,您需要提供卷组,后跟斜杠,然后是逻辑卷:
- sudo lvresize -L +5G --resizefs LVMVolGroup/test
在此示例中,
LVMVolGroup
卷组上的test
逻辑卷的逻辑卷和文件系统都将增加5G。如果您希望手动处理文件系统扩展,您可以去掉
--resizefs
选项,然后使用文件系统的本机扩展实用程序。例如,对于 Ext4 文件系统,您可以键入:- sudo lvresize -L +5G LVMVolGroup/test
- sudo resize2fs /dev/LVMVolGroup/test
这会给你留下相同的结果。
删除或缩减 LVM 组件
由于容量减少会导致数据丢失,因此通过减小组件大小或移除组件来缩小可用容量的过程通常会稍微复杂一些。
减小逻辑卷的大小
要缩小逻辑卷,您应该首先备份您的数据。因为这会减少可用容量,错误会导致数据丢失。
准备就绪后,检查当前使用了多少空间:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on . . . /dev/mapper/LVMVolGroup-test 4.8G 521M 4.1G 12% /mnt/test在此示例中,当前使用的空间似乎略多于 521M。使用它来帮助您估计可以将音量减小到的大小。
接下来,卸载文件系统。与扩展不同,文件系统收缩应该在卸载时执行:
- cd ~
- sudo umount /dev/LVMVolGroup/test
卸载后,检查文件系统以确保一切正常。使用
-t
选项传入文件系统类型。我们将使用-f
来检查文件系统是否正常:- sudo fsck -t ext4 -f /dev/LVMVolGroup/test
检查文件系统后,您可以使用文件系统的本机工具减小文件系统的大小。对于 Ext4 文件系统,这将是
resize2fs
命令。传入文件系统的最终大小:警告:此处最安全的选择是选择比当前使用量大很多的最终尺寸。给自己一些缓冲空间以避免数据丢失并确保您有适当的备份。
- sudo resize2fs -p /dev/LVMVolGroup/test 3G
操作完成后,通过将相同大小传递给带有
-L
标志的lvresize
命令来调整逻辑卷的大小:- sudo lvresize -L 3G LVMVolGroup/test
您将被警告数据丢失的可能性。如果准备就绪,请键入 y 继续。
减少逻辑卷后,再次检查文件系统:
- sudo fsck -t ext4 -f /dev/LVMVolGroup/test
如果一切正常,您可以使用常用的挂载命令重新挂载文件系统:
- sudo mount /dev/LVMVolGroup/test /mnt/test
您的逻辑卷现在应该减小到合适的大小。
删除逻辑卷
如果您不再需要某个逻辑卷,可以使用
lvremove
命令将其删除。首先,卸载逻辑卷(如果当前已安装):
- cd ~
- sudo umount /dev/LVMVolGroup/test
然后,通过键入以下内容删除逻辑卷:
- sudo lvremove LVMVolGroup/test
您将被要求确认程序。如果您确定要删除逻辑卷,请键入 y。
删除卷组
要删除整个卷组,包括其中的所有逻辑卷,请使用
vgremove
命令。在删除卷组之前,通常应该使用上述过程删除逻辑卷。至少,您必须确保卸载卷组包含的任何逻辑卷:
- sudo umount /dev/LVMVolGroup/www
- sudo umount /dev/LVMVolGroup/projects
- sudo umount /dev/LVMVolGroup/db
之后,您可以通过将卷组名称传递给
vgremove
命令来删除整个卷组:- sudo vgremove LVMVolGroup
系统将提示您确认是否要删除卷组。如果您仍然存在任何逻辑卷,您将在删除之前收到针对这些逻辑卷的单独确认提示。
删除物理卷
如果您希望从 LVM 管理中删除物理卷,您需要的过程取决于 LVM 当前是否正在使用该设备。
如果物理卷正在使用中,则必须将位于设备上的物理范围移动到不同的位置。这要求卷组有足够的其他物理卷来处理物理盘区。如果您正在使用更复杂的逻辑卷类型,那么即使您有足够的可用空间来容纳拓扑,您也可能必须拥有额外的物理卷。
当您在卷组中有足够的物理卷来处理物理范围时,通过键入以下内容将它们从您希望删除的物理卷中移出:
- sudo pvmove /dev/sda
此过程可能需要一段时间,具体取决于卷的大小和要传输的数据量。
将盘区重新定位到对等卷后,您可以通过键入以下命令从卷组中删除物理卷:
- sudo vgreduce LVMVolGroup /dev/sda
这将从卷组中删除空出的物理卷。完成后,您可以通过键入以下内容从存储设备中删除物理卷标记:
- sudo pvremove /dev/sda
您现在应该能够将移除的存储设备用于其他目的或将其从系统中完全移除。
结论
到目前为止,您应该对如何使用 LVM 在 Ubuntu 16.04 上管理存储设备有了实际的了解。您应该知道如何获取有关现有 LVM 组件状态的信息、如何使用 LVM 组成您的存储系统以及如何修改卷以满足您的需要。请随意在安全的环境中测试这些概念,以更好地了解它们如何组合在一起。