如何在Ubuntu16.04上使用LVM管理存储设备
介绍
LVM,即逻辑卷管理,是一种存储设备管理技术,它使用户能够对组件存储设备的物理布局进行池化和抽象化,从而实现更轻松、更灵活的管理。 利用设备映射器 Linux 内核框架,当前迭代 LVM2 可用于将现有存储设备聚集成组,并根据需要从组合空间分配逻辑单元。
在本指南中,我们将介绍如何使用 LVM 管理您的存储设备。 我们将向您展示如何显示有关卷和潜在目标的信息,如何创建和销毁各种类型的卷,以及如何通过调整大小或转换来修改现有卷。 我们将使用 Ubuntu 16.04 服务器来演示这些操作。
先决条件
为了继续进行,您应该可以访问 Ubuntu 16.04 服务器。 您需要为管理任务配置具有 sudo
权限的非 root 用户。 您可以按照我们的 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 扩展区大小的新卷组。
将物理卷添加到现有卷组
要通过添加额外的物理卷来扩展卷组,请使用 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 卷。 至少需要四个物理卷。
- -m:指定要保留的额外数据副本的数量。 值“1”表示维护一个额外的副本,总共有两组数据。
- -i:指定应保持的条带数。 这是
striped
类型所必需的,并且可以修改其他一些 RAID 选项的默认行为。 - -s:指定操作应该从现有逻辑卷而不是新的独立逻辑卷创建快照。
我们将提供这些选项的一些示例来演示它们通常是如何使用的。
要创建条带卷,您必须至少指定两个条带。 此拓扑和条带数至少需要两个具有可用容量的物理卷:
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
您现在应该能够将移除的存储设备用于其他目的或将其完全从系统中移除。
结论
到目前为止,您应该已经对如何在 Ubuntu 16.04 上使用 LVM 管理存储设备有了初步的了解。 您应该知道如何获取有关现有 LVM 组件状态的信息,如何使用 LVM 组成您的存储系统,以及如何修改卷以满足您的需求。 随意在安全的环境中测试这些概念,以更好地了解它们如何组合在一起。