Linux 中 LVM 的完整初学者指南

这是 Linux 中 LVM(逻辑卷管理)的完整初学者指南。

在本教程中,您将了解 LVM 的概念、它的组件以及为什么要使用它。

我不会仅限于理论上的解释。 我还将展示在 Linux 中创建和管理 LVM 的动手示例。

简而言之,我将为您提供在现实世界中开始使用 LVM 所需的所有必要信息。

Linux 中的 LVM 是什么?

LVM 代表逻辑卷管理。 这是管理存储系统的另一种方法,而不是传统的基于分区的方法。 在 LVM 中,您无需创建分区,而是创建逻辑卷,然后您可以像挂载磁盘分区一样轻松地将这些卷挂载到文件系统中。

上一个语句的一个例外是您不能将逻辑卷用于 /boot. 这是因为 GRUB(Linux 最常见的引导加载程序)无法从逻辑卷中读取。 另一方面,众所周知的 GRUB 替代方案 systemd-boot 仅读取 vfat 文件系统,因此这也不起作用。

LVM 的组件

LVM 包含三个主要组件:

  1. 物理卷
  2. 卷组
  3. 逻辑卷

尽管该列表由三个部分组成,但其中只有两个是分区系统的直接对应部分。 下表记录了这一点。

磁盘分区系统LVM
分区逻辑卷
磁盘卷组

物理卷没有任何直接对应物,但我很快就会谈到这一点。

为什么要使用 LVM?

LVM 的主要优点是调整卷或卷组的大小非常容易。 它抽象出了所有丑陋的部分(分区、原始磁盘),并为我们留下了一个中央存储池可供使用。

如果您曾经经历过分区大小调整的恐惧,那么您​​会想要使用 LVM。

动手实验室准备

这篇文章不是 只是 理论。 在此过程中,我将展示实际的命令示例,学习某些东西的最佳方法是亲身实践。 为此,我建议您使用虚拟机。

为了帮助你,我已经准备了一个简单的 Vagrantfile,你可以用它来启动一个非常轻量级的虚拟机 VirtualBox. 此虚拟机具有三个额外的磁盘,您和我可以将它们用于下面的命令示例。

在文件系统的某处创建一个目录,并将以下内容保存在该文件中,名为 Vagrantfile.

Vagrant.configure "2" do |config|
    config.vm.box = "ubuntu/focal64"
    config.vm.hostname = "lvm"
    3.times {|i| config.vm.disk :disk, size: "5GB", name: "drive-#{i}"}
    config.vm.provider :virtualbox do |machine|
        machine.memory = 1024
        machine.cpus = 1
        machine.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]
    end
end

# vi: set ft=ruby

或者,如果您愿意,可以使用 wget 或者 curl 从我的要点下载文件。

wget https://gist.githubusercontent.com/debdutdeb/98ed1b6aef36885d07ce8247188dfd5e/raw/524259da5dfa2d8750883d01c8159829729e224d/Vagrantfile

确保你有 流浪汉VirtualBox 安装。

一旦 Vagrantfile 就位,设置环境变量 VAGRANT_EXPERIMENTALdisks.

export VAGRANT_EXPERIMENTAL=disks

最后,使用以下命令启动虚拟机(确保您与 Vagrantfile 位于同一目录中):

vagrant up

机器运行后,您可以使用 vagrant ssh SSH进入它并运行 example 这篇文章的命令。

记得跑 vagrant destroy 完成后,从与 Vagrantfile 相同的目录中。

安装 LVM

在您可以使用任何命令之前,您需要安装 lvm2 包裹。 这应该预装在大多数现代发行版中,尤其是基于 Ubuntu 的发行版中。 但是,在继续之前,我不得不提到这一点。 安装 lvm2,请查阅您的发行版的文档。

LVM 实践

对于这个动手演练,我构建了一个具有 40G 根存储(不重要)和三个大小为 5G 的外部磁盘的虚拟机。 这些磁盘的大小是任意的。

[email protected]:~$ lsblk -o name,size,fstype
NAME    SIZE FSTYPE
loop0  55.5M squashfs
loop1  32.3M squashfs
loop2  70.4M squashfs
sda      40G 
└─sda1   40G ext4
sdb      10M iso9660
sdc       5G 
sdd       5G 
sde       5G

如您所见,我将使用的设备是 sdc, sddsde.

还记得我告诉过你 LVM 包含三个主要组件吗?

  1. 物理卷
  2. 卷组
  3. 逻辑卷

是时候一一见他们了。

1. 物理卷

关于 LVM,您首先需要了解的是物理卷。 物理卷是用于实现抽象即逻辑卷的原材料或构建块。 简单来说,物理卷是 LVM 系统的逻辑单元。

物理卷可以是任何东西,原始磁盘或磁盘分区。 创建和初始化物理卷是一回事。 两者都意味着您只是在为进一步的操作准备构建块(即分区、磁盘)。 这将在瞬间变得更加清晰。

实用程序: 所有管理物理卷的实用程序都以字母开头 pv 为了 生理的 欧鲁美。 例如 pvcreate, pvchange, pvs, pvdisplay 等等

此框之后提到的任何内容都是破坏性的,除非您使用的是虚拟环境或云上的服务器,其中没有存储重要数据或无法意外访问,我建议您立即停止。

创建物理卷

您可以使用原始未分区磁盘或分区本身来创建物理卷。

正如我之前提到的,我的虚拟机连接了三个外部驱动器,让我们从 /dev/sdc.

我们使用 pvcreate 创建物理卷的命令。 只需将设备名称传递给它即可。

sudo pvcreate /dev/sdc

你应该看到这样的东西:-

[email protected]:~$ sudo pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created.

接下来我要分区 /dev/sdd 分成相等的部分。 使用任何工具, cfdisk, parted, fdisk 等等,有很多工具可以完成这项工作。

[email protected]:~$ lsblk -o name,size,fstype | grep sdd
sdd       5G 
├─sdd1  2.5G 
└─sdd2  2.5G

您现在可以在一个步骤中从这两个分区中快速创建另外两个物理卷,将这两个设备都传递到 pvcreate 立刻。

sudo pvcreate /dev/sdd1 /dev/sdd2

看一看:-

[email protected]:~$ sudo pvcreate /dev/sdd1 /dev/sdd2
  Physical volume "/dev/sdd1" successfully created.
  Physical volume "/dev/sdd2" successfully created.

列出可用的物理卷

您可以使用三个命令来获取可用物理卷的列表, pvscan, pvspvdisplay. 您通常不需要向这些命令传递任何内容。

pvscan:-

[email protected]:~$ sudo pvscan
  PV /dev/sdc                       lvm2 [5.00 GiB]
  PV /dev/sdd1                      lvm2 [2.50 GiB]
  PV /dev/sdd2                      lvm2 [<2.50 GiB]
  Total: 3 [<10.00 GiB] / in use: 0 [0   ] / in no VG: 3 [<10.00 GiB]

pvs:-

[email protected]:~$ sudo pvs
  PV         VG Fmt  Attr PSize  PFree 
  /dev/sdc      lvm2 ---   5.00g  5.00g
  /dev/sdd1     lvm2 ---   2.50g  2.50g
  /dev/sdd2     lvm2 ---  <2.50g <2.50g

pvdisplay:-

[email protected]:~$ sudo pvdisplay
  "/dev/sdc" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SzSkdD-xKYa-4y7P-teyU-481p-uiQ8-qieMJJ
   
  "/dev/sdd1" is a new physical volume of "2.50 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd1
  VG Name               
  PV Size               2.50 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               553Iy4-JJ21-LfIw-udtO-j9Cd-7gFS-iXXFVS
   
  "/dev/sdd2" is a new physical volume of "<2.50 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd2
  VG Name               
  PV Size               <2.50 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               bf7ghn-QkPm-EUdp-GdyW-shMG-5sMn-VhNtYB

正如您所看到的,除了列出物理卷之外,这些命令还为您提供了大量有关这些卷的其他信息。

删除物理卷

您可以使用 pvremove 命令。 就像 pvcreate,只需将设备(初始化为物理卷)传递给 pvremove 命令。

为了演示,我将删除 /dev/sdd2 从列表中。

sudo pvremove /dev/sdd2

输出应与此相同:-

[email protected]:~$ sudo pvremove /dev/sdd2
  Labels on physical volume "/dev/sdd2" successfully wiped.

现在列出物理卷 sudo pvs

[email protected]:~$ sudo pvs
  PV         VG Fmt  Attr PSize PFree
  /dev/sdc      lvm2 ---  5.00g 5.00g
  /dev/sdd1     lvm2 ---  2.50g 2.50g

/dev/sdd2 不再在这里。

2. 卷组

卷组是物理卷的集合。 它是 LVM 中的下一个抽象级别。 卷组是结合了多个原始存储设备的存储容量的存储池。

实用程序: 所有卷组实用程序名称都以 vg, 代表 G团,例如 vgcreate, vgs, vgrename 等等

创建卷组

卷组是使用 vgcreate 命令。 第一个论据 vgcreate 是您要为该卷组指定的名称,其余的是要支持存储池的物理卷的列表。

sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1

例子:-

[email protected]:~$ sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
  Volume group "lvm_tutorial" successfully created

列出卷组

列出卷组类似于列出物理卷,您可以使用具有不同详细级别的不同命令, vgdisplay, vgscanvgs.

我个人更喜欢 vgs 命令, sudo vgs

[email protected]:~$ sudo vgs
  VG           #PV #LV #SN Attr   VSize VFree
  lvm_tutorial   2   0   0 wz--n- 7.49g 7.49g

vgscan:-

[email protected]:~$ sudo vgscan
  Found volume group "lvm_tutorial" using metadata type lvm2

vgdisplay:-

[email protected]:~$ sudo vgdisplay 
  --- Volume group ---
  VG Name               lvm_tutorial
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               7.49 GiB
  PE Size               4.00 MiB
  Total PE              1918
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1918 / 7.49 GiB
  VG UUID               LYVE9P-vY0G-OAW6-an8q-yfBx-rrB1-YU61m1

列出附加到卷组的物理卷

您可以使用以下命令列出连接到特定卷组的所有物理卷:-

sudo pvdisplay -S vgname=<volume_group_name> -C -o pv_name

例子:-

[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
  PV        
  /dev/sdc  
  /dev/sdd1

您还可以获得物理卷的计数。

sudo vgdisplay -S vgname=<volume_group_name> -C -o pv_count

例子:-

[email protected]:~$ sudo vgdisplay -S vgname=lvm_tutorial -C -o pv_count
  #PV
    3

扩展卷组

扩展卷组意味着向卷组添加额外的物理卷。 为此, vgextend 使用命令。 语法很简单:-

vgextend <volume_group> <physical_volume1> <physical_volume2> ....

让我们扩展我们的 lvm_tutorial 体积 /dev/sdd2.

sudo vgextend lvm_tutorial /dev/sdd2

专注于输出:-

[email protected]:~$ sudo vgextend lvm_tutorial /dev/sdd2
  Physical volume "/dev/sdd2" successfully created.
  Volume group "lvm_tutorial" successfully extended

在物理卷部分,我们最终删除了 /dev/sdd2 作为物理卷,但作为分区或原始磁盘 必须 初始化为物理卷,否则 LVM 将无法将其作为卷组的一部分进行管理。 所以 vgextend 准备好了 /dev/sdd2 在将其添加到卷组之前。

现在列出附加到此卷组的物理卷,以确保安全。

sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name

输出:-

[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
  PV        
  /dev/sdc  
  /dev/sdd1 
  /dev/sdd2

/dev/sdd2 现在按预期在列表中。

减少卷组

就像扩展一个卷组意味着添加另一个物理卷一样,减少它意味着删除一个或多个物理卷。

我们使用 vgreduce 命令来执行此操作。 一般语法如下:-

vgreduce <vgname> <physical_volume1> <physical_volume2> ....

让我们删除物理卷 /dev/sdc/dev/sdd1.

sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1

例子:-

[email protected]:~$ sudo vgreduce lvm_tutorial /dev/sdc /dev/sdd1
  Removed "/dev/sdc" from volume group "lvm_tutorial"
  Removed "/dev/sdd1" from volume group "lvm_tutorial"

如果卷组有任何活动的逻辑卷,您将无法像这样减少它。

再次列出物理卷。

sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name

输出:-

[email protected]:~$ sudo pvdisplay -S vgname=lvm_tutorial -C -o pv_name
  PV        
  /dev/sdd2

那两个物理卷不见了。

现在,为了本文的其余部分,将这两个物理卷添加回来。

sudo vgextend lvm_tutorial /dev/sdc /dev/sdd1

删除卷组

您可以使用 vgremove 命令。

sudo vgremove lvm_tutorial

现在不要运行此命令,否则您必须重新创建卷组。 如果您想对其进行测试,请在本文的最后运行它。

3. 逻辑卷

这是您将主要使用的内容。 逻辑卷就像一个分区,但它不是位于原始磁盘之上,而是位于卷组之上。 你可以,

  • 使用您想要的任何文件系统格式化逻辑卷。
  • 将其挂载到您想要的文件系统中的任何位置。

在本节中,您将学习,

  • 如何创建逻辑卷。
  • 对逻辑卷的常用操作。
  • 调整逻辑卷的大小。
  • 删除逻辑卷。

实用程序: 所有卷组实用程序名称都以 lv, 代表 大号逻辑的 欧鲁美。 例如 lvcreate, lvs, lvreduce 等等vgcreate, vgs, vgrename 等等

创建逻辑卷

逻辑卷是使用 lvcreate 命令。 常用的语法如下所示,

sudo lvcreate -L <size> -n <lvname> <vgname>

让我为你分解它:-

  • -L 选项是新逻辑卷的大小,可以使用任何以“GB”、“MB”或“KB”结尾的整数。 例如“1GB”。
  • -n 选项用于命名此逻辑卷。
  • 最后,您需要将这个逻辑卷所属的卷组的名称传递给它。 因此,在为逻辑卷提供大小时,请确保卷组有可用空间。

在虚拟机上运行以下命令:-

sudo lvcreate -L 5GB -n lv1 lvm_tutorial

示例输出:-

[email protected]:~$ sudo lvcreate -L 5GB -n lv1 lvm_tutorial
  Logical volume "lv1" created.

对逻辑卷的常用操作

正如我之前所说,您可以将文件系统放在逻辑卷上,也可以将其挂载到文件系统的任何位置。

创建后,您可以在 /dev/<vgname>/<lvname> 小路。 为了 example 在我们的例子中,音量将在 /dev/lvm_tutorial/lv1.

[email protected]:~$ ls -l /dev/lvm_tutorial/lv1 
lrwxrwxrwx 1 root root 7 May 17 02:09 /dev/lvm_tutorial/lv1 -> ../dm-0

现在您可以像使用任何分区一样使用它。 用ext4格式化,

sudo mkfs.ext4 /dev/lvm_tutorial/lv1

将它安装在当前目录结构中的某个位置,例如 /mnt,

sudo mount -t ext4 /dev/lvm_tutorial/lv1 /mnt

调整逻辑卷的大小

您可以使用扩展逻辑卷 lvextend 命令并使用减小其大小 lvreduce 命令。 或者您可以使用单个命令 lvresize 完成这两项任务。

首先让我们看看卷组中是否还有剩余空间。

sudo vgs -S vgname=lvm_tutorial -o vg_free

输出:-

[email protected]:~$ sudo vgs -S vgname=lvm_tutorial -o vg_free
  VFree 
  <4.99g

根据输出,我还有一些空间,所以让我们将卷大小增加 2GB。

请记住,逻辑卷仍安装在 /mnt.

[email protected]:~$ mount | grep '/mnt'
/dev/mapper/lvm_tutorial-lv1 on /mnt type ext4 (rw,relatime)

使用以下命令调整卷大小:-

sudo lvresize -L +2GB lvm_tutorial/lv1

一般语法是这样的: –

lvresize -L [+|-][Size] <vgname>/<lvname>

符号 + 或 – 后 -L 取决于您是尝试增加音量还是分别减小音量。

卷大小增加后,文件系统也必须调整大小。 对于 ext4,要使用的命令是 resize2fs.

sudo resize2fs /dev/lvm_tutorial/lv1

输出:-

[email protected]:~$ sudo resize2fs /dev/lvm_tutorial/lv1
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/lvm_tutorial/lv1 is mounted on /mnt; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/lvm_tutorial/lv1 is now 1835008 (4k) blocks long.

并非所有文件系统都支持热调整大小,Ext4 和 XFS 是受支持的文件系统之一。 我建议你坚持这些。

减少逻辑卷是一项稍微复杂的任务,我不会在本文中讨论这个问题。我将把这个卷的大小减少 1GB。

删除逻辑卷

您删除一个逻辑卷 lvremove 命令。 命令语法如下:-

lvremove <vgname>/<lvname>

在虚拟机上运行此命令:-

sudo lvremove lvm_tutorial/lv1

输出:-

[email protected]:~$ sudo lvremove lvm_tutorial/lv1
Do you really want to remove and DISCARD active logical volume lvm_tutorial/lv1? [y/n]: y
  Logical volume "lv1" successfully removed

在逻辑卷、物理卷和卷组上还有许多其他操作可行,但不可能将所有这些都写到一篇文章中。

我给你留了一张磁盘 /dev/sde 在虚拟机中。 使用它,练习本文中的一些命令,创建一个新的卷组,扩展一个现有的卷组,只是练习。

我希望这篇文章对你有所帮助,如果你想在以后看到更多关于这方面的内容,请在下面的评论部分告诉我。