当前位置:首页>科技>linux磁盘阵列扫盲Linux逻辑卷管理
发布时间:2026-07-21阅读(1)
【以下内容皆是本人分享计算机知识,一切用于违法犯罪与本人无关!】
文章目录
★本文的目标读者★LVM 概述★LVM 的三个基本概念★常见的用法★不那么常见的用法★【可移动存储】的注意事项★简述 LVM 的原理★RAID 简介★(高级教程)LVM 自带的 RAID 功能★为啥需要“磁盘加密”?★(高级教程)LVM 与 LUKS 组合★(高级教程)LVM 与 TC 组合★(高级教程)LVM【同时组合】TC 与 LUKS
★本文的目标读者◇预备知识为了讲解 LVM,俺假定你已经掌握了如下知识:
Linux 基本的命令行技能(命令行菜鸟请看“这篇扫盲”)Linux 磁盘分区的基本知识(比如:创建分区、删除分区 ......)Linux 文件系统的基本知识(比如:格式化文件系统,挂载文件系统 ......)磁盘加密工具 dm-crypt(LUKS)的基本知识(扫盲教程参见“这里”)磁盘加密工具 TrueCrypt/VeraCrypt 的基本知识(扫盲教程参见“这里”和“这里”)
◇新手须知如果你之前没有玩过 LVM,强烈建议如下:1. 先在【虚拟机】中尝鲜 LVM。【不要】一开始就拿自己的真实环境做试验,以免把你的数据搞坏(注:俺写了虚拟机的扫盲教程,在“这里”)2. 当你要在真实环境中玩 LVM,一定要先做好【数据备份】
◇老手须知如果你之前已经玩过 LVM,并且比较熟悉,可以只看本文中标注了 (高级教程)的那个几个章节。
★LVM 概述◇LVM 是啥?LVM 是洋文“Logical Volume Manager”的缩写。理论上,这个玩意儿可以用在不同的操作系统平台(Linux or UNIX)。 但本文只讨论 Linux 上的使用。
◇LVM 有啥用?为了说明 LVM 的好处,说几个例子: 举例1 很多人在装系统的时候,经常会为【分区】而纠结——如果你把所有数据都放到一个分区,万一这个分区的文件系统坏了,所有数据都丢了。如果你划分了多个区,用来放不同的数据;每个分区设多大,会比较伤脑筋——分区太大浪费了,分区太小又怕将来不够用。 有了 LVM 之后,你可以依靠 LVM 来创建逻辑分区。万一某个逻辑分区不够用,可以对该逻辑分区【动态扩容】(原有数据不受影响)。 举例2 假设你的电脑上有2块 500GB 的硬盘,然后你想要搞一个 1TB 的分区。就可以用 LVM 来实现。 举例3 假设你的电脑上有2块 500GB 的硬盘,然后你想要搞3个分区,每个都是 300GB。 如果用传统的分区方式,就很难搞;而用 LVM 就可以轻松搞定。 其它优势 上述几个例子,体现的都是“空间利用率”方面的优势。LVM 【至少】还有如下几个优势:
与 RAID 工具的无缝整合与磁盘加密工具的无缝整合逻辑分区的【缓存】(cache)功能逻辑分区的【快照】(snapshot)功能......
◇LVM 与 Linux 的关系作为一个软件,LVM 包括两部分:内核模块 & 命令行工具。 内核模块 Linux 内核在很早以前(kernel 2.4 版本)就已经整合了 LVM 的功能。也就是说,如今市面上的发行版,其内核都已经支持 LVM 了。 命令行工具 光内核支持还不够,你还需要通过一些命令行工具才能进行相关的操作。 如今的主流发行版,在其【官方软件仓库】中都已经包含了 LVM 的软件包。你只需要从官方软件仓库就可以安装它。一般来说,它的软件包名称叫做 lvm2
◇LVM 的版本——LVM1 与 LVM2 的区别刚才俺提到——大部分主流发行版,LVM 在软件仓库中的名称叫 lvm2。显然,应该还有一个叫 lvm1 的东东。 这就涉及到 LVM 的版本。 早期整合到 Linux 内核 2.4 版本的 LVM 叫做 LVM1。当内核发展到 2.6 版本时,LVM 进行了一次重大升级,改叫 LVM2。如今所说的 LVM 都是指 LVM2(LVM1 基本上已经淘汰)。 这两者在“存储格式”方面向前兼容(也就是说,用 LVM1 创建的卷,也可以用 LVM2 打开),并且两者的“命令行用法”差不多(LVM2 保留了原有的命令,增加了一些新的命令) 本文后续部分所说的 LVM,如果没有特别说明,都是指 LVM2。
★LVM 的三个基本概念◇物理卷——PV(Physical Volume)在 LVM 的术语中,“物理卷”(PV)用来对应【底层】的“物理硬盘 or 物理分区”。 你可以用 LVM 的命令行工具,把某个“物理硬盘”或“物理分区”创建成 PV。这个 PV 的容量也就是“物理硬盘 or 物理分区”的容量。
◇卷组——VG(Volume Group)通过 LVM 的命令行工具,还可以把多个 PV 纳入到一个 VG(卷组)中。 你不妨把 VG 想象成一个【存储池】,这个池子的容量也就是加入其中的所有 PV 的容量总和。
◇逻辑卷——LV(Logical Volume)在 LVM 的术语中,“逻辑卷”(LV)用来对应【上层】的“逻辑分区”。 你可以从 VG 中创建多个 LV。每次创建 LV 都如同从这个存储池中分配空间,直到所有存储空间都被分配完。 创建好 LV 之后,你可以对这个 LV 进行格式化,就得到一个可用的逻辑分区。
◇示意图为了方便大伙儿理解,俺花了点力气,画了这张色彩斑斓的示意图(如下)
这张图很重要哦——后续聊“LVM 组合磁盘加密工具”,俺还会在这张图上进行演绎。
★常见的用法◇创建 PV使用 pvcreate 命令创建 PV。你可以针对【硬盘分区】上创建 PV,也可以针对【整个硬盘】创建 PV,命令分别如下 针对【硬盘分区】创建 PV(俺拿 /dev/sdb1 这个设备名举例,你要根据具体情况修改)
pvcreate /dev/sdb1针对【整个硬盘】创建 PV(俺拿 /dev/sdc 这个设备名举例,你要根据具体情况修改)
pvcreate /dev/sdc为了验证上述命令确实创建了一个 PV,你可以执行 pvs 命令,它会列出系统中所有 PV 的名称。 (注:执行 pvcreate 命令之后,它会在对应设备的头部写入一个 LVM 的标志,表示这个设备已经被 LVM 用作“物理卷”)
◇创建 VG有了某个 PV之后,你就可以基于这个 PV 创建 VG。假设你之前已经在 /dev/sdb1 这个设备(物理分区)上创建了 PV,就可以用如下命令创建一个新的 VG,VG 的名称是 VG_XXX(这个名称纯粹是为了举例,你也可以用其它字母组合作为 VG 的名称):
vgcreate VG_XXX /dev/sdb1为了验证上述命令确实创建了一个 VG,你可以执行 vgs 命令,它会列出系统中所有 VG 的名称。
◇VG 扩容(添加新的 PV)用上述方式创建的 VG 只包含一个 PV。为了让这个 VG 管理多个 PV,可以用 vgextend 命令加入其它 PV。举例如下:
pvcreate /dev/sdc1vgextend VG_XXX /dev/sdc1(注:前一个命令创建了新的 PV,后一个命令把这个 PV 加入到刚才那个 VG 里面) 添加了 PV 之后,你可以用如下命令查看该 VG,就可以看到它包含的 PV 数。
◇创建 LV
vgdisplay VG_XXX创建 LV 包括如下几个步骤: 步骤1 用如下命令,在 VG_XXX 中创建一个新的 LV,名叫 lv_xxxx(这个名字纯属举例,你可以用别的字母组合)。
lvcreate -L 100G -n lv_xxxx VG_XXX请注意:上述命令中的 -L 和 100G 都是大写;其中的 G,表示 GB 为单位。你也可以用大写 M 后缀表示多少兆字节(MB)。 为了验证上述命令确实创建了一个 LV,你可以执行 lvs 命令,它会列出系统中所有 LV 的名称,以及每个 LV 所属的 VG。 如果你想要创建一个 LV,把 VG 的剩余空间都用掉,可以用如下命令:
lvcreate --extents 100%FREE VG_XXX -n lv_xxxx步骤2 “步骤1”只是创建了一个“逻辑设备”,你还需要在该设备上创建文件系统。不同的文件系统,创建的命令也不同。下面以 ext4 为例,在刚才那个 lv_xxxx 之上创建 ext4 文件系统。
mkfs.ext4 /dev/VG_XXX/lv_xxxx步骤3 最后,你用 mount 命令挂载新创建的文件系统。 友情提示 Linux 有个很有用的命令 lsblk,他以【树状风格】展示系统中所有“块设备”(block device)的层次关系;如果该设备有挂载点,也会一并标注。 当你创建了 LV 之后,可以运行该命令体验一下。
◇自动挂载 LV你可以编辑系统目录下的 /etc/fstab 文件,把需要自动挂载的“LV 路径”以及“挂载点路径”添加到该文件中。
◇LV 扩容以刚才创建的 LV 举例。如果你想把它的空间再增加 50GB,通过如下步骤: 步骤1 先执行如下命令:
lvresize -L 50G VG_XXX/lv_xxxx(注:上述命令中,VG_XXX 是“VG 名称”;lv_xxxx 是“LV 名称”;两者之间用【半角斜杠】相连接) 为了避免你搞错,再看如下命令:
lvresize -L 50G VG_XXX/lv_xxxx上述两个命令,就差了一个【加号】。-L 50G 表示空间【再增加 50GB】;-L 50G 表示空间【增加到 50GB】。 步骤2 上述扩容命令仅仅是增加了“LV 的空间”,“文件系统”的空间【还没】变化;为了让“文件系统”也跟着 LV 而变大,需要再用一个“文件系统扩容命令”。 “文件系统扩容命令”与具体的“文件系统【类型】”相关,对于 EXT 家族(ext2、ext3、ext4),该命令是 resize2fs,用法如下:
resize2fs /dev/VG_XXX/lv_xxxxext 家族的好处是——支持【在线扩容】,你不需要卸载文件系统,就可以直接扩大其容量。 文件系统的差异 并【不是】所有的文件系统都支持“扩容”的功能。另外,有些文件系统虽然支持“扩容”,但不支持“在线扩容”——也就是说,你要先卸载文件系统,然后再执行“扩容命令”。
★不那么常见的用法◇VG 改名如果你觉得 VG 的名称不太满意,可以用 vgrename 命令改名。举例如下:
vgrename 旧名称 新名称对 VG 改名之后,可以用 vgs 命令进行验证。
◇LV 改名如果你觉得 LV 的名称不太满意,也可以改名,命令如下:
lvrename VG名称 LV旧名称 LV新名称对 LV 改名之后,可以用 lvs 命令进行验证。
◇VG 缩容(移除 PV)假设你的某个 VG 中包含3个 PV,分别是:sda1,sdb2,sdc3;然后你想要把 sda1 移出该 VG。可以用如下步骤完成: 步骤1 你先要确保 sdb2 与 sdc3 有足够的剩余空间来转储 sda1 上已经存储的数据。你可以先用 pvdisplay 命令分别看一下这3个 PV,评估空间的使用情况。 步骤2 假如你评估之后,另2个 PV 的剩余空间足够,就可以考虑用如下方式迁移。
pvmove /dev/sda1(注:上述命令会智能地判断 sda1 属于哪个 VG,并把它的数据转移到【同一个 VG】的其它 PV) 如果你想手动干预。比如说:你想要指定 sda1 的数据全都转移到 sdb2,可以用如下命令:
pvmove /dev/sda1 /dev/sdb2(注:上述命令的前提是:sdb2 有足够的剩余空间来容纳 sda1 已存储的数据) 步骤3 完成上述步骤之后,再执行如下命令,那么这个 VG 就【不再】包含 sda1 了。
vgreduce VG_XXX /dev/sda1步骤4 完成上述命令之后,sda1 也不再属于任何 VG 了。但 sda1 还是会被 Linux 内核当成 PV 来看待。前面聊 pvcreate 的时候,俺说过:pvcreate 命令会往设备头部写入一个 LVM 的标志。 如果你要把这个 sda1 设备拿去作其它用途,不希望它继续被内核当作 PV,可以用如下命令清除该设备头部的 LVM 标志。
pvremove /dev/sda1反之,如果你要把这个 PV 拿去给别的 VG 使用,就【不】需要执行上述 pvremove 命令。
◇LV 缩容对 LV 缩容一定要小心。操作不当可能会导致 LV 关联的文件系统损坏。 LV 关联的文件系统,如果【类型】不同,“缩容”的操作步骤也会有差异。 下面以 ext4 文件系统为例,假定 VG 名称是 VG_XXX,LV 的名称是 lv_xxxx 步骤1 为了保险起见,在做这个操作之前,先备份 LV 相关的数据。 步骤2 用 umount 命令卸载 LV 对应的文件系统。 步骤3 用如下命令先检查一下文件系统,以防万一。
e2fsck -f /dev/VG_XXX/lv_xxxx步骤4 用如下命令收缩文件系统的存储空间。在以下例子中,把存储空间降低到 25GB。
resize2fs /dev/VG_XXX/lv_xxxx 25G(再次提醒:resize2fs 命令仅用于 ext 家族的文件系统) 步骤5 用如下命令把 LV 的存储空间也收缩到 25GB。
◇删除 LV
lvreduce -L 25G /dev/VG_XXX/lv_xxxx假设你不想要某个 LV(包括它存储的数据),通过如下步骤把它干掉: 步骤1 先用 umount 命令卸载 LV 之上的文件系统(挂载点) 步骤2 假设该 LV 名叫 lv_xxxx,VG 名叫 VG_XXX,先用如下命令使之处于【不激活】状态。
lvchange -an /dev/VG_XXX/lv_xxxx步骤3 最后用如下命令彻底删除该 LV。
lvremove /dev/VG_XXX/lv_xxxx最后再拔出该设备。
★简述 LVM 的原理(如果你不关心底层的原理,可以跳过本章节)
◇PE(Physical Extent)当你用 pvcreate 命令创建 PV 时,该命令会(在逻辑上)把物理存储介质划分为了 N 个大小相同的块,洋文称之为“physical extent”,简称 PE。 你可以用 pvdisplay 命令查看某个 PV 的详细信息,就能看到如下信息:
PE 的尺寸该 PV 中的 PE 总数已分配的 PE 总数未分配的 PE 总数......
◇LE(Logical Extent)LV 与 PV 有点类似——底层也是划分为若干个大小相同的块,洋文称之为“logical extent”,简称 LE。 一般情况下,LE 与 PE 是【一一对应】滴;特殊情况下(比如后面要聊的 RAID1),一个 LE 会同时对应多个 PE。
◇示意图◇PE 的尺寸
LVM2 默认的 PE 尺寸是 4MiB。对于新手而言,用【默认的】PE 尺寸就可以啦。 某些老手可能想要自己控制 PE 尺寸——可以在创建 VG 时指定 PE 尺寸,命令如下:
vgcreate -s 64M VG_XXX /dev/sdb1(注:上述命令指定新创建的 VG 使用 64MiB 作为 PE 尺寸;对于 LVM2,PE 最小值是 1KiB) 早期的 LVM1,对 LV 有一个硬性上限——每个 LV 最多只能有 65534 个 LE(仔细看刚才那张图的右上角,有 LVM1 的各项指标)。因为这个限制,早期的 LVM1 用户,如果想要创建一个【超大】的 LV,需要在创建 VG 时就指定一个足够大的“PE 尺寸”。 到了如今的 LVM2,每个 LV 包含的 LE 数量已经【没有】那个上限了。所以“PE 尺寸”就不像以前那么重要了。
◇VG 的元数据每个 VG 都有自己的一些元数据。比如刚才所说的“PE 尺寸”就是它的元数据之一;另外,“VG 名称”与“VG 的 UUID”也算是它的元数据。
那“VG 的元数据”存储在哪里捏?它们保存在 PV 的头部——当你创建 VG 时,至少要指定一个或多个 PV;新创建的 VG,其元数据就保存在这些 PV 头部。如果这个 VG 后来又加入其它 PV,其元数据也会保存在这些新的 PV 中。元数据保存多份,也是为了达到某种冗余。 你可以用命令vgcfgbackup把某个 VG 的元数据导出到单个文件中;需要的话,还可以再用命令vgcfgrestore导入。 某些爱思考的读者会问:为啥要要把 VG 的元数据保存在 PV 头部,为啥不存储到某个系统目录? 俺认为:其关键在于【数据自包含】。因为 PV 隶属于 VG,VG 的元数据存储在 PV 就达到【自包含】。当你在某个【外置存储】中创建了 PV,然后又把这个“外置存储”挂到另一台 Linux 电脑,另一个 Linux 内核依然能获取该 PV 对应的“VG 元数据”。
★RAID 简介◇啥是 RAID?RAID 是洋文“Redundant Array of Inexpensive Disks”的缩写,中文称之为“磁盘冗余阵列”。 搞这个玩意儿的好处包括两方面:其一,通过增加数据的【冗余度】来提升其【可靠性】(RAID 有好几种类型;除了 RAID0,其它各种类型都可以不同程度地提高可靠性)其二,提升“读性能”或“写性能”或“读写性能”(取决于你具体使用哪种 RAID 类型)
◇Linux 的 RAID 工具在 Linux 上,你既可以用mdadm也可以用 LVM 来实现 RAID。 因为本文是 LVM 教程,当然只聊 LVM 如何实现 RAID。
◇RAID 的类型RAID 有很多种类型,详细解释参见维基百科的“这个链接”。LVM 已经支持如下几种 RAID 类型:
RAID 0RAID 1RAID 4RAID 5RAID 6RAID 10
考虑到篇幅,俺挑几种常用的 RAID 类型,在下一个章节介绍。介绍的时候,会顺便说说该 RAID 类型的【原理】。
◇“软 RAID”与“硬 RAID”硬 RAID “硬 RAID”需要在电脑主板上插一个“RAID 硬件”(RAID 控制器)。然后由这个“RAID 硬件”来控制多块磁盘——RAID 功能全靠该“RAID 硬件”来完成。 操作系统通过该“RAID 硬件”的驱动来与之打交道。在这种模式下,操作系统【看不到】具体的每一个磁盘。因此,这种这种模式的 RAID 对操作系统来说是【透明】滴。 软 RAID 在这种模式下,每个磁盘都直接连到主板上,操作系统可以看到每个磁盘,RAID 功能由操作系统层面(软件层面)实现。故称之为“软 RAID”。 本文讨论的就是这种。
◇哪些同学需要考虑 RAID?使用 RAID 的【前提】是——你的电脑上同时装了【多个】物理磁盘。如果没有这个前提,搞 RAID 是没意义滴。
★(高级教程)LVM 自带的 RAID 功能◇RAID 0 的玩法原理 RAID0 有时候也称作“带区集 or 条纹集”。通俗地说就是:把 N 个设备凑成一个大的逻辑设备。每次要写入数据时,先拆分为 N 等份,平均写入每个设备。
空间利用率 完全不浪费(利用率接近 100%)。在所有 RAID 类型中,这种的空间利用率最高。 可靠性 虽然利用率最高,但可靠性最差(无冗余)——任何一个设备坏掉,全完蛋。 操作步骤 先创建 N 个大小一样的 PV(此处假设 N = 2),并加入到同一个 VG 里面(假设 VG 名称叫做 vg_raid)。具体如何做,前面已经聊过。 用如下命令可以创建一个名叫 lv_xxxx 的逻辑卷,并设定以 RAID0 方式存储数据。
lvcreate --type raid0 --stripes 2 --extents 100%FREE -n lv_xxxx vg_raid上述命令的参数说明:
Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图