这是Linux中LVM(逻辑卷管理)的完整初学者指南。 在本教程中,您将了解LVM的概念、它的组件以及为什么要使用它。 我不会仅限于理论上的解释,我还将展示在Linux中创建和管理LVM的动手示例。 简而言之,我将为您提供在现实世界中开始使用LVM所需的所有必要信息。Linux中的LVM是什么? LVM代表逻辑卷管理。这是管理存储系统的另一种方法,而不是传统的基于分区的方法。在LVM中,您无需创建分区,而是创建逻辑卷,然后您可以像挂载磁盘分区一样轻松地将这些卷挂载到文件系统中。LVM的组件 LVM包含三个主要组件:物理卷卷组逻辑卷 尽管该列表由三个部分组成,但其中只有两个是分区系统的直接对应部分,下表记录了这一点。磁盘分区系统LVM分区逻辑卷磁盘卷组 物理卷没有任何直接对应物,但我很快就会谈到这一点。为什么要使用LVM? LVM的主要优点是调整卷或卷组的大小非常容易。它抽象出了所有丑陋的部分(分区、原始磁盘),并为我们留下了一个中央存储池可供使用。 如果您曾经经历过分区大小调整的恐惧,那么您会想要使用LVM。动手实验室准备 这篇文章不仅仅是理论。在此过程中,我将展示实际的命令示例,学习某些东西的最佳方法是亲身实践。为此,我建议您使用虚拟机。 为了帮助你,我已经准备了一个简单的Vagrantfile,你可以用它来用VirtualBox启动一个非常轻量级的虚拟机。此虚拟机具有三个额外的磁盘,您和我可以将它们用于下面的命令示例。 在文件系统的某处创建一个目录,并将以下内容保存在该文件中,名为Vagrantfile。Vagrant。configure2doconfigconfig。vm。boxubuntufocal64config。vm。hostnamelvm3。times{iconfig。vm。disk:disk,size:5GB,name:drive{i}}config。vm。provider:virtualboxdomachinemachine。memory1024machine。cpus1machine。customize〔modifyvm,:id,cpuexecutioncap,50〕endendvi:setftruby 或者,如果您愿意,可以使用wget或curl从我的gist下载文件。wgethttps:gist。githubusercontent。comdebdutdeb98ed1b6aef36885d07ce8247188dfd5eraw524259da5dfa2d8750883d01c8159829729e224dVagrantfile 确保你安装了Vagrant和VirtualBox。 一旦Vagrantfile就位,将环境变量设置VAGRANTEXPERIMENTAL为disks。exportVAGRANTEXPERIMENTALdisks 最后,使用以下命令启动虚拟机(确保您与Vagrantfile位于同一目录中):vagrantup 机器运行后,您可以使用vagrantsshSSH连接到它并运行本文中的示例命令。 完成后请记住vagrantdestroy从与Vagrantfile相同的目录运行。安装LVM 在您可以使用任何命令之前,您需要安装该lvm2软件包。这应该预装在大多数现代发行版中,尤其是基于Ubuntu的发行版中。但是,在继续之前,我不得不提到这一点。要安装lvm2,请查阅您的发行版的文档。LVM实践 对于这个动手演练,我构建了一个具有40G根存储(不重要)和三个大小为5G的外部磁盘的虚拟机。这些磁盘的大小是任意的。vagrantlvm:lsblkoname,size,fstypeNAMESIZEFSTYPEloop055。5Msquashfsloop132。3Msquashfsloop270。4Msquashfssda40Gsda140Gext4sdb10Miso9660sdc5Gsdd5Gsde5G 如您所见,我将使用的设备sdc是sdd和sde。 还记得我告诉过你LVM包含三个主要组件吗?物理卷卷组逻辑卷 是时候一一见他们了。1。物理卷 关于LVM,您首先需要了解的是物理卷。物理卷是用于实现抽象即逻辑卷的原材料或构建块。简单来说,物理卷是LVM系统的逻辑单元。 物理卷可以是任何东西,原始磁盘或磁盘分区。创建和初始化物理卷是一回事。两者都意味着您只是在为进一步的操作准备构建块(即分区、磁盘)。这将在瞬间变得更加清晰。 实用程序:pv所有管理物理卷的实用程序都以PhysicalVolume的字母开头。例如pvcreate,pvchange,pvs等pvdisplay。 此框之后提到的任何内容都是破坏性的,除非您使用的是虚拟环境或云上的服务器,其中没有存储重要数据或无法意外访问,我建议您立即停止。创建物理卷 您可以使用原始未分区磁盘或分区本身来创建物理卷。 正如我之前提到的,我的虚拟机连接了三个外部驱动器,让我们从devsdc。 我们使用pvcreate命令来创建物理卷。只需将设备名称传递给它即可。sudopvcreatedevsdc 你应该看到这样的东西:vagrantlvm:sudopvcreatedevsdcPhysicalvolumedevsdcsuccessfullycreated。 接下来我将devsdd分成相等的部分。使用任何工具cfdisk,,,等parted,fdisk有很多工具可以完成这项工作。vagrantlvm:lsblkoname,size,fstypegrepsddsdd5Gsdd12。5Gsdd22。5G 您现在可以在一个步骤中从这两个分区中快速创建另外两个物理卷,同时将这两个设备传递给pvcreate。sudopvcreatedevsdd1devsdd2 看一看:vagrantlvm:sudopvcreatedevsdd1devsdd2Physicalvolumedevsdd1successfullycreated。Physicalvolumedevsdd2successfullycreated。列出可用的物理卷 您可以使用三个命令来获取可用物理卷的列表pvscan,pvs和pvdisplay。您通常不需要向这些命令传递任何内容。 pvscan:vagrantlvm:sudopvscanPVdevsdclvm2〔5。00GiB〕PVdevsdd1lvm2〔2。50GiB〕PVdevsdd2lvm2〔2。50GiB〕Total:3〔10。00GiB〕inuse:0〔0〕innoVG:3〔10。00GiB〕 pvs:vagrantlvm:sudopvsPVVGFmtAttrPSizePFreedevsdclvm25。00g5。00gdevsdd1lvm22。50g2。50gdevsdd2lvm22。50g2。50g pvdisplay:vagrantlvm:sudopvdisplaydevsdcisanewphysicalvolumeof5。00GiBNEWPhysicalvolumePVNamedevsdcVGNamePVSize5。00GiBAllocatableNOPESize0TotalPE0FreePE0AllocatedPE0PVUUIDSzSkdDxKYa4y7PteyU481puiQ8qieMJJdevsdd1isanewphysicalvolumeof2。50GiBNEWPhysicalvolumePVNamedevsdd1VGNamePVSize2。50GiBAllocatableNOPESize0TotalPE0FreePE0AllocatedPE0PVUUID553Iy4JJ21LfIwudtOj9Cd7gFSiXXFVSdevsdd2isanewphysicalvolumeof2。50GiBNEWPhysicalvolumePVNamedevsdd2VGNamePVSize2。50GiBAllocatableNOPESize0TotalPE0FreePE0AllocatedPE0PVUUIDbf7ghnQkPmEUdpGdyWshMG5sMnVhNtYB 正如您所看到的,除了列出物理卷之外,这些命令还为您提供了大量有关这些卷的其他信息。删除物理卷 pvremove您可以使用该命令删除物理卷。就像pvcreate,只需将设备(初始化为物理卷)传递给pvremove命令。 为了演示,我将从devsdd2列表中删除。sudopvremovedevsdd2 输出应与此相同:vagrantlvm:sudopvremovedevsdd2Labelsonphysicalvolumedevsdd2successfullywiped。 现在列出物理卷sudopvsvagrantlvm:sudopvsPVVGFmtAttrPSizePFreedevsdclvm25。00g5。00gdevsdd1lvm22。50g2。50g devsdd2不再在这里。2。卷组 卷组是物理卷的集合。它是LVM中的下一个抽象级别。卷组是结合了多个原始存储设备的存储容量的存储池。 实用程序:所有卷组实用程序名称都以开头vg,代表卷组,例如、等。vgcreatevgsvgrename创建卷组 卷组是使用该vgcreate命令创建的。的第一个参数vgcreate是您要为该卷组指定的名称,其余的是要支持存储池的物理卷的列表。sudovgcreatelvmtutorialdevsdcdevsdd1 例子:vagrantlvm:sudovgcreatelvmtutorialdevsdcdevsdd1Volumegrouplvmtutorialsuccessfullycreated列出卷组 列出卷组类似于列出物理卷,您可以使用具有不同详细级别的不同命令vgdisplay、vgscan和vgs。 我个人更喜欢vgs命令,sudovgsvagrantlvm:sudovgsVGPVLVSNAttrVSizeVFreelvmtutorial200wzn7。49g7。49gvgscan:vagrantlvm:sudovgscanFoundvolumegrouplvmtutorialusingmetadatatypelvm2vgdisplay:vagrantlvm:sudovgdisplayVolumegroupVGNamelvmtutorialSystemIDFormatlvm2MetadataAreas2MetadataSequenceNo1VGAccessreadwriteVGStatusresizableMAXLV0CurLV0OpenLV0MaxPV0CurPV2ActPV2VGSize7。49GiBPESize4。00MiBTotalPE1918AllocPESize00FreePESize19187。49GiBVGUUIDLYVE9PvY0GOAW6an8qyfBxrrB1YU61m1列出附加到卷组的物理卷 您可以使用以下命令列出连接到特定卷组的所有物理卷:sudopvdisplaySvgnamevolumegroupnameCopvname 例子:vagrantlvm:sudopvdisplaySvgnamelvmtutorialCopvnamePVdevsdcdevsdd1 您还可以获得物理卷的计数。sudovgdisplaySvgnamevolumegroupnameCopvcount 例子:vagrantlvm:sudovgdisplaySvgnamelvmtutorialCopvcountPV3扩展卷组 扩展卷组意味着向卷组添加额外的物理卷。为此,vgextend使用该命令。语法很简单:vgextendvolumegroupphysicalvolume1physicalvolume2。。。。 让我们将lvmtutorial音量扩大devsdd2。sudovgextendlvmtutorialdevsdd2 专注于输出:vagrantlvm:sudovgextendlvmtutorialdevsdd2Physicalvolumedevsdd2successfullycreated。Volumegrouplvmtutorialsuccessfullyextended 在物理卷部分,我们最终将其devsdd2作为物理卷删除,但必须将分区或原始磁盘初始化为物理卷,否则LVM将无法将其作为卷组的一部分进行管理。所以在将它添加到卷组之前vgextend做好准备。devsdd2 现在列出附加到此卷组的物理卷,以确保安全。sudopvdisplaySvgnamelvmtutorialCopvname 输出:vagrantlvm:sudopvdisplaySvgnamelvmtutorialCopvnamePVdevsdcdevsdd1devsdd2 devsdd2现在按预期在列表中。减少卷组 就像扩展一个卷组意味着添加另一个物理卷一样,减少它意味着删除一个或多个物理卷。 我们使用vgreduce命令来执行此操作。一般语法如下:vgreducevgnamephysicalvolume1physicalvolume2。。。。 让我们删除物理卷devsdc和devsdd1。sudovgreducelvmtutorialdevsdcdevsdd1 例子:vagrantlvm:sudovgreducelvmtutorialdevsdcdevsdd1RemoveddevsdcfromvolumegrouplvmtutorialRemoveddevsdd1fromvolumegrouplvmtutorial 如果卷组有任何活动的逻辑卷,您将无法像这样减少它。 再次列出物理卷。sudopvdisplaySvgnamelvmtutorialCopvname 输出:vagrantlvm:sudopvdisplaySvgnamelvmtutorialCopvnamePVdevsdd2 那两个物理卷不见了。 现在,为了本文的其余部分,将这两个物理卷添加回来。sudovgextendlvmtutorialdevsdcdevsdd1删除卷组 vgremove您可以使用该命令删除逻辑卷。sudovgremovelvmtutorial 现在不要运行此命令,否则您必须重新创建卷组。如果您想对其进行测试,请在本文的最后运行它。3。逻辑卷 这是您将主要使用的内容。逻辑卷就像一个分区,但它不是位于原始磁盘之上,而是位于卷组之上。你可以,使用您想要的任何文件系统格式化逻辑卷。将其挂载到您想要的文件系统中的任何位置。 在本节中,您将学习,如何创建逻辑卷。对逻辑卷的常用操作。调整逻辑卷的大小。删除逻辑卷。 实用程序:所有卷组实用程序名称都以开头lv,代表逻辑卷。例如,,等等,,等等lvcreatelvslvreducevgcreatevgsvgrename创建逻辑卷 lvcreate使用该命令创建逻辑卷。常用的语法如下所示,sudolvcreateLsizenlvnamevgnameL选项用于新逻辑卷的大小,您可以使用任何以GB、MB或KB结尾的整数。例如1GB。n选项用于命名此逻辑卷。需要将这个逻辑卷所属的卷组的名称传递给它,因此,在为逻辑卷提供大小时,请确保卷组有可用空间。 在虚拟机上运行以下命令:sudolvcreateL5GBnlv1lvmtutorial 示例输出:vagrantlvm:sudolvcreateL5GBnlv1lvmtutorialLogicalvolumelv1created。对逻辑卷的常用操作 正如我之前所说,您可以将文件系统放在逻辑卷上,也可以将其挂载到文件系统的任何位置。 dev创建后,您可以在路径中找到逻辑卷。例如,在我们的例子中,音量将在devlvmtutoriallv1。vagrantlvm:lsldevlvmtutoriallv1lrwxrwxrwx1rootroot7May1702:09devlvmtutoriallv1。。dm0 现在您可以像使用任何分区一样使用它。用ext4格式化,sudomkfs。ext4devlvmtutoriallv1 将它安装在当前目录结构中的某个位置,例如mnt,sudomounttext4devlvmtutoriallv1mnt调整逻辑卷的大小 您可以使用命令扩展逻辑卷lvextend并使用命令减小其大小lvreduce。或者,您可以使用单个命令lvresize来完成这两项任务。 首先让我们看看卷组中是否还有剩余空间。sudovgsSvgnamelvmtutorialovgfree 输出:vagrantlvm:sudovgsSvgnamelvmtutorialovgfreeVFree4。99g 根据输出,我还有一些空间,所以让我们将卷大小增加2GB。 请记住,逻辑卷仍安装在mnt。vagrantlvm:mountgrepmntdevmapperlvmtutoriallv1onmnttypeext4(rw,relatime) 使用以下命令调整卷大小:sudolvresizeL2GBlvmtutoriallv1 一般语法是这样的:lvresizeL〔〕〔Size〕vgnamelvname 后面的符号或L取决于您是尝试增加音量还是分别减小音量。 卷大小增加后,文件系统也必须调整大小。对于ext4,要使用的命令是resize2fs。sudoresize2fsdevlvmtutoriallv1 输出:vagrantlvm:sudoresize2fsdevlvmtutoriallv1resize2fs1。45。5(07Jan2020)Filesystematdevlvmtutoriallv1onlineresizingrequiredolddescblocks1,newdescblocks1Thefilesystemondevlvmtutoriallv1isnow1835008(4k)blockslong。 并非所有文件系统都支持热调整大小,Ext4和XFS是受支持的文件系统之一。我建议你坚持这些。 减少逻辑卷是一项稍微复杂的任务,我不会在本文中讨论这个问题。我将把这个卷的大小减少1GB。删除逻辑卷 lvremove您可以使用该命令删除逻辑卷。命令语法如下:lvremovevgnamelvname 在虚拟机上运行此命令:sudolvremovelvmtutoriallv1 输出:vagrantlvm:sudolvremovelvmtutoriallv1DoyoureallywanttoremoveandDISCARDactivelogicalvolumelvmtutoriallv1?〔yn〕:yLogicalvolumelv1successfullyremoved 在逻辑卷、物理卷和卷组上还有许多其他操作可行,但不可能将所有这些都写到一篇文章中。 我devsde在虚拟机中为您多留了一个磁盘,使用它,练习本文中的一些命令,创建一个新的卷组,扩展一个现有的卷组,只是练习。 我希望这篇文章对你有所帮助,如果你想在以后看到更多关于这方面的内容,请在下面的评论部分告诉我。