如何在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   ]

如果您需要更多细节,pvspvdisplay 命令是更好的选择。

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

该命令不会输出太多信息,但它应该能够找到系统上每个可用的卷组。 要显示更多信息,可以使用 vgsvgdisplay 命令。

与其对应的物理卷一样,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 组成您的存储系统,以及如何修改卷以满足您的需求。 随意在安全的环境中测试这些概念,以更好地了解它们如何组合在一起。