Linux 中的逻辑卷 LVM 管理完整初学者指南
gudong366 2025-05-23 16:02 4 浏览
这是 Linux 中 LVM(逻辑卷管理)的完整初学者指南。
在本教程中,您将了解 LVM 的概念、它的组件以及为什么要使用它。
我不会仅限于理论上的解释,我还将展示在 Linux 中创建和管理 LVM 的动手示例。
简而言之,我将为您提供在现实世界中开始使用 LVM 所需的所有必要信息。
Linux 中的 LVM 是什么?
LVM 代表逻辑卷管理。这是管理存储系统的另一种方法,而不是传统的基于分区的方法。在 LVM 中,您无需创建分区,而是创建逻辑卷,然后您可以像挂载磁盘分区一样轻松地将这些卷挂载到文件系统中。
LVM 的组件
LVM 包含三个主要组件:
- 物理卷
- 卷组
- 逻辑卷
尽管该列表由三个部分组成,但其中只有两个是分区系统的直接对应部分,下表记录了这一点。
磁盘分区系统 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从我的 gist 下载文件。
wget https://gist.githubusercontent.com/debdutdeb/98ed1b6aef36885d07ce8247188dfd5e/raw/524259da5dfa2d8750883d01c8159829729e224d/Vagrantfile
确保你安装了Vagrant和VirtualBox。
一旦 Vagrantfile 就位,将环境变量设置VAGRANT_EXPERIMENTAL为disks.
export VAGRANT_EXPERIMENTAL=disks
最后,使用以下命令启动虚拟机(确保您与 Vagrantfile 位于同一目录中):
vagrant up
机器运行后,您可以使用vagrant sshSSH 连接到它并运行本文中的示例命令。
完成后请记住vagrant destroy从与 Vagrantfile 相同的目录运行。
安装 LVM
在您可以使用任何命令之前,您需要安装该lvm2软件包。这应该预装在大多数现代发行版中,尤其是基于 Ubuntu 的发行版中。但是,在继续之前,我不得不提到这一点。要安装lvm2,请查阅您的发行版的文档。
LVM 实践
对于这个动手演练,我构建了一个具有 40G 根存储(不重要)和三个大小为 5G 的外部磁盘的虚拟机。这些磁盘的大小是任意的。
vagrant@lvm:~$ 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是sdd和sde。
还记得我告诉过你 LVM 包含三个主要组件吗?
- 物理卷
- 卷组
- 逻辑卷
是时候一一见他们了。
1. 物理卷
关于 LVM,您首先需要了解的是物理卷。物理卷是用于实现抽象即逻辑卷的原材料或构建块。简单来说,物理卷是 LVM 系统的逻辑单元。
物理卷可以是任何东西,原始磁盘或磁盘分区。创建和初始化物理卷是一回事。两者都意味着您只是在为进一步的操作准备构建块(即分区、磁盘)。这将在瞬间变得更加清晰。
实用程序:pv所有管理物理卷的实用程序都以P hysical Volume的字母开头。例如pvcreate, pvchange,pvs等pvdisplay。
此框之后提到的任何内容都是破坏性的,除非您使用的是虚拟环境或云上的服务器,其中没有存储重要数据或无法意外访问,我建议您立即停止。
创建物理卷
您可以使用原始未分区磁盘或分区本身来创建物理卷。
正如我之前提到的,我的虚拟机连接了三个外部驱动器,让我们从/dev/sdc.
我们使用pvcreate命令来创建物理卷。只需将设备名称传递给它即可。
sudo pvcreate /dev/sdc
你应该看到这样的东西:-
vagrant@lvm:~$ sudo pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
接下来我将/dev/sdd分成相等的部分。使用任何工具cfdisk,,,等parted,fdisk有很多工具可以完成这项工作。
vagrant@lvm:~$ lsblk -o name,size,fstype | grep sdd
sdd 5G
├─sdd1 2.5G
└─sdd2 2.5G
您现在可以在一个步骤中从这两个分区中快速创建另外两个物理卷,同时将这两个设备传递给pvcreate。
sudo pvcreate /dev/sdd1 /dev/sdd2
看一看:-
vagrant@lvm:~$ sudo pvcreate /dev/sdd1 /dev/sdd2
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.
列出可用的物理卷
您可以使用三个命令来获取可用物理卷的列表pvscan,pvs和pvdisplay。您通常不需要向这些命令传递任何内容。
pvscan:-
vagrant@lvm:~$ 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:-
vagrant@lvm:~$ 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:-
vagrant@lvm:~$ 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
输出应与此相同:-
vagrant@lvm:~$ sudo pvremove /dev/sdd2
Labels on physical volume "/dev/sdd2" successfully wiped.
现在列出物理卷sudo pvs
vagrant@lvm:~$ 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,代表卷组,例如、等。vgcreatevgsvgrename
创建卷组
卷组是使用该vgcreate命令创建的。的第一个参数vgcreate是您要为该卷组指定的名称,其余的是要支持存储池的物理卷的列表。
sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
例子:-
vagrant@lvm:~$ sudo vgcreate lvm_tutorial /dev/sdc /dev/sdd1
Volume group "lvm_tutorial" successfully created
列出卷组
列出卷组类似于列出物理卷,您可以使用具有不同详细级别的不同命令vgdisplay、vgscan和vgs。
我个人更喜欢vgs命令,sudo vgs
vagrant@lvm:~$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
lvm_tutorial 2 0 0 wz--n- 7.49g 7.49g
vgscan:-
vagrant@lvm:~$ sudo vgscan
Found volume group "lvm_tutorial" using metadata type lvm2
vgdisplay:-
vagrant@lvm:~$ 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
例子:-
vagrant@lvm:~$ 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
例子:-
vagrant@lvm:~$ 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
专注于输出:-
vagrant@lvm:~$ 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
输出:-
vagrant@lvm:~$ 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
例子:-
vagrant@lvm:~$ 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
输出:-
vagrant@lvm:~$ 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,代表逻辑卷。例如, ,等等, ,等等lvcreatelvslvreducevgcreatevgsvgrename
创建逻辑卷
lvcreate使用该命令创建逻辑卷。常用的语法如下所示,
sudo lvcreate -L <size> -n <lvname> <vgname>
- -L选项用于新逻辑卷的大小,您可以使用任何以“GB”、“MB”或“KB”结尾的整数。例如“1GB”。
- -n选项用于命名此逻辑卷。
- 需要将这个逻辑卷所属的卷组的名称传递给它,因此,在为逻辑卷提供大小时,请确保卷组有可用空间。
在虚拟机上运行以下命令:
sudo lvcreate -L 5GB -n lv1 lvm_tutorial
示例输出:
vagrant@lvm:~$ sudo lvcreate -L 5GB -n lv1 lvm_tutorial
Logical volume "lv1" created.
对逻辑卷的常用操作
正如我之前所说,您可以将文件系统放在逻辑卷上,也可以将其挂载到文件系统的任何位置。
/dev/<vgname>/<lvname>创建后,您可以在路径中找到逻辑卷。例如,在我们的例子中,音量将在/dev/lvm_tutorial/lv1.
vagrant@lvm:~$ 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
输出:-
vagrant@lvm:~$ sudo vgs -S vgname=lvm_tutorial -o vg_free
VFree
<4.99g
根据输出,我还有一些空间,所以让我们将卷大小增加 2GB。
请记住,逻辑卷仍安装在/mnt.
vagrant@lvm:~$ 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
输出:
vagrant@lvm:~$ 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
输出:-
vagrant@lvm:~$ 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在虚拟机中为您多留了一个磁盘,使用它,练习本文中的一些命令,创建一个新的卷组,扩展一个现有的卷组,只是练习。
我希望这篇文章对你有所帮助,如果你想在以后看到更多关于这方面的内容,请在下面的评论部分告诉我。
- 上一篇:深入解构LVM:从物理卷到逻辑卷
- 下一篇:LVM逻辑卷的管理及使用
相关推荐
- linux sed系列 第四篇:sed工业实战——日志处理与数据清洗
-
“掌握了sed的编程能力后,我们如同装备精良的工匠,终于可以踏入真实的工业战场。本篇将聚焦sed在日志分析、数据合规化、多文件批处理等场景中的应用,看它如何在海量数据中游刃有余,展现文本处理的...
- Linux下sed的简单使用(linux中sed是什么意思)
-
1、sed简介stremeditor流编辑器,它是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大,sed编辑器是一行一...
- linux基础命令之date命令(linux中的date)
-
date命令主要用于显示或者设置系统时间语法格式:date参数对象使用date命令时,最好先使用date--help命令查看支持哪些参数,有些小型Linux系统下的date命令,只支持一些基本参...
- Ubuntu linux 常用命令(ubuntu常用的50个命令)
-
使用dpkg命令来安装.deb包。sudodpkg-i~/example.deb如果在安装过程中遇到依赖问题,可以使用以下命令来修复:sudoapt-getinstall-f将flut...
- Linux基础命令-sed命令(linux教程:sed命令的用法)
-
Sed全名streameditor流编辑器,它是一个强大的文本处理工具,它可以从文件中接受输入,也可以接受来自标准输入流的输入,它擅长取行。Sed的用途非常广泛,包括:1)文本替换2)选择性的输...
- linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式
-
“上一篇我们掌握了sed的基础替换,如同获得了第一把钥匙。现在,让我们更进一步,学习如何精准锁定目标行,如同拥有了导航地图,让每一次操作都直击要害!”地址定位的四种维度sed的强大,很大程度上源...
- 火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等
-
IT之家6月24日消息,Mozilla在发布版本139不到一个月后,推出了最新的开源网页浏览器Firefox140。新版本增加了手动Unload标签页的功能,优化了垂直标签页的调...
- Linux 基本正则表达式及扩展正则表达式功能举例
-
在Linux中,正则表达式(RegularExpression)是一种强大的模式匹配工具,用于在文本中查找、匹配和处理特定模式的字符串。Linux支持两种类型的正则表达式:基本正则表达式(Basic...
- linux下find命令的经典26个使用示例
-
简介find命令是基于unix的操作系统中常用的工具之一。顾名思义,它在目录层次结构中查找文件和目录。用户可以传递不同的参数,并根据文件的名称、扩展名、类型、大小、权限、修改时间、所有者、组等搜索文件...
- linux运维中特殊符号的应用与实践
-
路径位置类的特殊符号(1)、波浪线(~)在linux系统的命令行中,~表示用户的家目录,超级用户为/root,普通用户为/home。假设我当前目录在usr/local下[root@xrylocal]...
- 开源框架log4cpp实战(开源gui框架)
-
1.Log4cpp使用Log4cpp中主要包含Category(种类),Appender(附加器),Layout(布局),Priorty(优先级),NDC(嵌套的诊断上下文)。Category、App...
- Linux find命令详解(linux find -l)
-
一、命令介绍Linuxfind命令是类unix操作系统中最重要和最常用的命令行实用程序之一。find命令用于根据指定的条件搜索和定位与参数匹配的文件和目录列表。find命令提供了广泛的选项,允许用户...
- Linux运维:单引号与双引号的使用(linux 单引号和双引号)
-
1、单引号的使用单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽Shell元字符的功能。注意不可以在两个单引号中间单独插入一个单引号,单引号必须成对出现。示例1:定义一个变量,并输出变量的...
- Linux技巧:find 命令用法详细说明,看完会有收获
-
在Linux命令中,find是比较复杂难用的命令。使用该命令搜索文件时,常常发现自己找了一些例子能用,但稍微改一下条件,就搜不到想要的结果。下面会以一些实例来说明使用find命令的关键要点和...
- Linux Shell中单引号、双引号、反引号的解释
-
1、单引号('')单引号所见即所得,直接显示单引号里的内容。即单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。比如下面的例子,单引号所见即所得。2、双引号("...
- 一周热门
- 最近发表
-
- linux sed系列 第四篇:sed工业实战——日志处理与数据清洗
- Linux下sed的简单使用(linux中sed是什么意思)
- linux基础命令之date命令(linux中的date)
- Ubuntu linux 常用命令(ubuntu常用的50个命令)
- Linux基础命令-sed命令(linux教程:sed命令的用法)
- linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式
- 火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等
- Linux 基本正则表达式及扩展正则表达式功能举例
- linux下find命令的经典26个使用示例
- linux运维中特殊符号的应用与实践
- 标签列表
-
- linux一键安装 (31)
- linux运行java (33)
- ln linux (27)
- linux 磁盘管理 (31)
- linux 内核升级 (30)
- linux 运行python (28)
- linux 备份文件 (30)
- linux 网络测试 (30)
- linux 网关配置 (31)
- linux jre (32)
- linux 杀毒软件 (32)
- linux语法 (33)
- linux博客 (33)
- linux 压缩目录 (37)
- linux 查看任务 (32)
- 制作linux启动u盘 (35)
- linux 查看存储 (29)
- linux乌班图 (31)
- linux挂载镜像 (31)
- linux 软件源 (28)
- linux题目 (30)
- linux 定时脚本 (30)
- linux 网站搭建 (28)
- linux 远程控制 (34)
- linux bind (31)