联想 y500 装机记:lvm 篇

LVM 中文名就是逻辑卷管理器,其好处在于基于 LVM 建立的逻辑分区,可以在不影响分区原有文件的情况下自由调整大小,对于 ext 的分区,可以在分区已挂载的情况下增加分区大小,但要减少分区的大小只能先把分区给 umount 了,才能进行进一步的操作。另外一个好处就是快照功能了,但本文暂时只是介绍一下 LVM 里面的基本概念以及怎么创建基于 LVM 的逻辑分区,快照功能暂且不做讨论了。

先来说说 LVM 的结构,LVM 可以看成是由 Physical Volume(PV)、Volume Group(VG)、Logical Volume(LV) 三层组成。

PV 译名为物理卷。一个 PV 就对应一个物理分区,我们只要将一个物理分区的系统标识符(system ID)改成 8e,然后就可以把这个物理分区做成一个 PV;

VG 中文名可译为卷组,顾名思义,这是一个包含了多个物理卷(PV)的东西。它的容量是它所包含的 PV 容量的总和。只要一个 PV 没有被其他 VG 所包含,用户就可以将其加入自己所创建的 VG 中,不用考虑诸如 PV 在哪块硬盘上或是在硬盘的什么位置之类的物理限制。从逻辑概念上来讲,这就相当于是一个虚拟的硬盘。可以像对正常硬盘一样对它进行分区、格式化之类的磁盘操作,只是 VG 的分区没有主分区和扩展分区之分;

LV 译名是逻辑卷,顾名思义,与 PV 相反,这是一个逻辑上的概念。对那个虚拟硬盘 VG 进行分区操作得到的一个分区就是一个 LV。LV 可以像一般的分区一样进行格式化、挂载之类的分区操作。例如,可以将一个 LV 格式化成 btrfs 文件系统,然后挂载在 /home 下使用。

由上面的介绍,可以看出,PV 是与物理分区打交道的底层,LV 是与用户交互的顶层,而 VG 则是连接两者的桥梁,同时也正是 VG 的出现使得 PV 和 LV 分离开来各司其职,这也就让我们无需理会底层的物理情形而对顶层的 LV 的大小进行调整成为可能。那么具体的这种调整机制怎么实现的呢?这就要介绍另外一个概念:Physical Extend(PE)。

PE 是整个 LVM 最小的存储块,LVM 默认使用的是 4MB 的 PE 块,如果用这个默认值创建一个 VG,那么 VG 将以 4MB 为单位被切分成多个 PE 块,所以在 VG 上创建的 LV 的大小只能是 4MB 的整数倍。如果分区时你给出的 LV 容量不是 4MB 的整数倍,系统会自动调整到 4MB 的整数倍,然后把和这个倍数相同数量的 PE 块分配给 LV。只要 LV 里面有未写入数据的空的 PE 块,那么就可以把这些 PE 块重新拿出来归还给 VG,从而实现在不影响 LV 里面已经存放的数据前提下将 LV 的容量减少。同样,如果 VG 里面有未被任何 LV 占有的 PE 块,就可以将这些 PE 块分配给想要增加容量的 LV,从而实现 LV 容量的增加。可见 LV 的容量增减不是连续的,是以 PE 为最小单位进行的。

那么是不是只要把 PE 分的足够小,比如一个字节,就可以实现 LV 的容量连续增减了呢?? :question:

可以说,的确如此,但是这么做你就要面临另外一个问题,就是无论一个 PE 大小是多少,一个 VG 最多只能容纳 655534 个 PE,因此你如果把 PE 调到一个字节,那么一个 VG 最多只能有约 640KB。所以说 PE 不能太小。如果按照默认的 4M 的话,一个 VG 最大约为 256GB。
另外就是,如果一个 VG 的所有 PE 块都分到各个 LV 里面了,那么还能不能增加 LV 的容量呢? :question:

答案是可以,但是必须先增加 VG 的容量。增加 VG 的容量可以通过新加入一个 PV 到 VG 中来实现。同样的,如果 VG 中存在一个未被任何 LV 占用的 PV,也可以通过将 PV 从 VG 中除掉来减少 VG 的容量。而这个从 VG 中拿出来的 PV 可以重新格式化成其它文件系统以供他用,或者直接删除分区把空间归还给硬盘的未使用空间。

以上就是我对 LVM 的一些理解,由于本人才疏学浅,所以难免有不妥,不足,不正确之处,还请指正。

下面呢,就是讲怎么在装机的时候怎么具体创建 PV、VG、LV 这些东西了,我装机的时候由于没有截图,也没法截图,所以呢我实际的截图都是在装完机后用 YaST 里面的那个磁盘分区管理工具完成的,因为那个工具其实装机时进行分区的那个图形化工具,界面是一样的。

看下面的图,我的 sdb 还有 831G 的未分区空间,我就用这些剩余空间来演示一下吧



点左下角那个“添加”按钮,就出现如下的分区添加页面,如下所示,选那个 0x8E Linux LVM,不用挂载分区,选好后点完成,一个 PV 就创建好了

我用同样的操作再创建一个,如下图所示,sdb3 和 sdb4 两个就是我刚刚创建好的 PV

接着在左侧的系统视图里面点卷管理,下面的图里面就可以看到我之前在装机的时候创建的那个 vgssd 了,所以呢大家看到这里要对我有点信心。按我说的方法还是可以成功搞出 LVM 来的。嗯,不废话了,接着上面的,上面我不是创建了两个 PV 嘛,现在我接下来要创建的就是 VG 了,如下图所示,点那个“添加”然后选“卷组”



就会弹出下面的窗口,卷组的名称可以随便取,我这里是取为“test”,那个默认为 4MB 的物理区域尺寸就是我上面所说的 PE,左侧的框里面是所有可用的物理卷(PV),所谓可用的物理卷(PV)就是没有被其他 VG 所占有的物理卷(PV),右侧的框是选取的要添加进 VG 的物理卷(PV),这里我把上面创建的那两个物理卷(PV)都选进去。最终结果如下图所示:

然后点那个完成就可以了,其结果如下图所示,新出现的那个 test,就是我们刚刚创建好的 VG。接下来我们就要创建 LV 了,还是点那个添加,选逻辑卷(LV),如下所示:

点完后就会弹出如下所示的窗口了,逻辑卷(LV)的名称是可以随便取的,虽然我这里取的名字与卷组的名字一样,但这个纯属巧合,你也可以取其他的名字比如 VIM,abc 之类的。类型选默认的正常卷就行了。可以看见,与创建一般的硬盘分区不一样的地方就是没有那个让你选创建主分区还是扩展分区



然后点下一步,那个尺寸和一般的分区步骤没有什么区别,但是多了一个分带,分带有两种,分别用数字 1 和 2 来代表,数字 1 代表的是不使用分带,即使用线性模式(linear)写入,这就好比,如果我一共将两个 PV:/dev/sda1 和 /dev/sdb1 加进一个 VG 里面,VG 上有一个占据整个 VG 的 LV,那么 LV 写入数据时,会先将一个 PV(比如:/dev/sda1)写完后,再向另外一个 PV(比如:/dev/sdb1)写入数据;数字 2 代表使用分带,即分带模式(triped),还是上面那个例子,在分带模式下,LV 中的数据会被分成两部分分别写入两个 PV,这样的读写性能肯定会快一些。但是如果使用前种模式可以在需要减少 LV 容量时,将没有任何数据写入的那个 PV 整个从 LV 中抽出来,但用后种模式,则因为两个 PV 都被写入了数据,就不可能把他们抽离出来。两种模式各有好处,所以大家根据自身需求来选择,我这里就用默认的 1 了

然后点下一步,接下来就和普通分区没有什么区别了,可以选择格式化的文件系统(例如 EXT4)、挂载点什么的,然后点完成就全都好了。

另外再说一件与 LVM 没有什么必然联系的事,在分区的时候,在挂载分区的那个阶段里面有个“Fstab 选项”,如上图所示,点击它会弹出下面的界面:



注意那个卷标,卷标就是类似于 windows 下面那个“本地磁盘 (C:)”之类的东西,如果有需求的话,就可以在这个 Fstab 选项里面就可以设置卷标了。别等到系统装好后再设置,因为有些文件系统的分区(例如:btrfs),卷标要重设的话,需要 umount 那个分区,所以就有些不是那么方便了。因此,你如果有需求的话,就在装机的时候在这里重设了。

下面说一下,如何调节大小,以我以将 LV(/dev/vgssd/test)增加容量为例,首先进到如下页面,可以看见 /dev/vgssd/test 的大小是 280MB,点击调整


就会出现如下界面:



选择自定义尺寸,填写 300MB,然后点确定,就可以将 test 这个 LV 的容量提升至 300MB,具体结果见下图:

可以看见 test 这个 LV 的容量已经提升到了 300MB,然后点下一步,再点确定,就可以切实地起到增加容量的效果了。

至于减少容量步骤是差不多的,但是需要卸载分区才行,所以如果某些分区可能卸载了就不能用图形界面了,那你就得用命令行来执行 LV 的容量减少了,具体命令我打算在我的另一篇贴子《命令行记》里面讲。

如果你的硬盘是固态硬盘,对于在 LVM 上的逻辑卷,要开启 trim 功能的话,光是在挂载分区的那个 fstab 里面加上 discard 参数是没有用的,还要编辑 /etc/lvm/lvm.conf 这个文件,这个文件的结构大概是:

你在 devices 那个花括号里面的最后加上一行: issue_discard = 1
如果你将来要禁用 discard 的话,改成: issue_discard = 0