如何在Ubuntu 18.04上使用LVM管理存储设备

LVM或逻辑卷管理是一种存储设备管理技术,使用户能够汇集和抽象组件存储设备的物理布局,从而实现更轻松,更灵活的管理。在本指南中,我们将介绍如何使用LVM管理存储设备。我们将向您展示如何显示有关卷和潜在目标的信息,如何创建和销毁各种类型的卷,以及如何通过调整大小或转换来修改现有卷。

介绍

LVM或逻辑卷管理是一种存储设备管理技术,使用户能够汇集和抽象组件存储设备的物理布局,从而实现更轻松,更灵活的管理。 利用设备映射器Linux内核框架,当前迭代LVM2可用于将现有存储设备收集到组中,并根据需要从组合空间分配逻辑单元。

在本指南中,我们将介绍如何使用LVM管理存储设备。 我们将向您展示如何显示有关卷和潜在目标的信息,如何创建和销毁各种类型的卷,以及如何通过调整大小或转换来修改现有卷。 我们将使用Ubuntu 18.04服务器来演示这些操作。

先决条件

为了跟进,您应该可以访问Ubuntu 18.04服务器。 您需要为非root用户配置为管理任务配置的sudo权限。 您可以按照我们的Ubuntu 18.04初始服务器设置指南来创建必要的帐户。

要熟悉LVM组件和概念并测试基本的LVM配置,请在开始本教程之前按照我们的LVM指南简介进行操作

准备好后,使用sudo用户登录服务器。

显示有关物理卷,卷组和逻辑卷的信息

能够轻松获取有关系统中各种LVM组件的信息非常重要。 幸运的是,LVM工具套件提供了大量工具,用于显示有关LVM中每个层的信息。

显示有关所有LVM兼容块存储设备的信息

要显示LVM可能管理的所有可用块存储设备,请使用lvmdiskscan命令:

sudo lvmdiskscan
  /dev/sda   [     200.00 GiB] 
  /dev/sdb   [     100.00 GiB] 
  2 disks
  2 partitions
  0 LVM physical volume whole disks
  0 LVM physical volumes

我们可以看到可能用作LVM物理卷的设备。

这可能是添加新存储设备以与LVM一起使用时的第一步。

显示有关物理卷的信息

将标头写入存储设备以将其标记为可以自由地用作LVM组件。 具有这些标头的设备称为物理卷

您可以使用带有-l选项的lvmdiskscan显示系统上的所有物理设备,该选项仅返回物理卷:

sudo lvmdiskscan -l
  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
  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
  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
  --- 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
  --- 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
  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
  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
    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
  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
  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
  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
  --- 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
  /dev/sda   [     200.00 GiB] 
  /dev/sdb   [     100.00 GiB] 
  2 disks
  2 partitions
  0 LVM physical volume whole disks
  0 LVM physical volumes

在这里,我们可以看到适合在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 :这指定逻辑卷的类型,它确定如何分配逻辑卷。 如果没有足够的基础物理卷来正确创建所选择的地形,则某些可用类型将不可用。 一些最常见的类型是:
    • linear :默认类型。 使用的基础物理设备(如果不止一个)将简单地相互附加,一个接一个。
    • stripe :与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
Filesystem                         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选项-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

如果一切正常,您可以使用常用的mount命令重新安装文件系统:

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 18.04上的存储设备有一个了解。 您应该知道如何获取有关现有LVM组件状态的信息,如何使用LVM组成存储系统,以及如何修改卷以满足您的需求。 您可以在安全的环境中测试这些概念,以便更好地掌握它们如何组合在一起。