LVM : 简介
在对磁盘分区的大小进行规划时,往往不能确定这个分区要使用的空间的大小。而使用 fdisk、gdisk 等工具对磁盘分区后,每个分区的大小就固定了。如果分区设置的过大,就白白浪费了磁盘空间;如果分区设置的过小,就会导致空间不够用的情况出现。对于分区过小的问题,可以从新划分磁盘的分区,或者通过软连接的方式将此分区的目录链接到另外一个分区。这样虽然能够临时解决问题,但是给管理带来了麻烦。类似的问题可以通过 LVM 来解决。
说明:本文的演示环境为 ubuntu 16.04。
LVM 是什么
LVM 是 Logical Volume Manager 的缩写,中文一般翻译为 “逻辑卷管理”,它是 Linux 下对磁盘分区进行管理的一种机制。LVM 是建立在磁盘分区和文件系统之间的一个逻辑层,系统管理员可以利用 LVM 在不重新对磁盘分区的情况下动态的调整分区的大小。如果系统新增了一块硬盘,通过 LVM 就可以将新增的硬盘空间直接扩展到原来的磁盘分区上。
LVM 的优点如下:
- 文件系统可以跨多个磁盘,因此大小不再受物理磁盘的限制。
- 可以在系统运行状态下动态地扩展文件系统大小。
- 可以以镜像的方式冗余重要数据到多个物理磁盘上。
- 可以很方便地导出整个卷组,并导入到另外一台机器上。
LVM 也有一些缺点:
- 在从卷组中移除一个磁盘的时候必须使用 reducevg 命令(这个命令要求root权限,并且不允许在快照卷组中使用)。
- 当卷组中的一个磁盘损坏时,整个卷组都会受影响。
- 因为增加了一个逻辑层,存储的性能会受影响。
LVM 的优点对服务器的管理非常有用,但对于桌面系统的帮助则没有那么显著,所以需要我们根据使用的场景来决定是否应用 LVM。
LVM 中的基本概念
通过 LVM 技术,可以屏蔽掉磁盘分区的底层差异,在逻辑上给文件系统提供了一个卷的概念,然后在这些卷上建立相应的文件系统。下面是 LVM 中主要涉及的一些概念。
物理存储设备(Physical Media):指系统的存储设备文件,比如 /dev/sda、/dev/sdb 等。
PV(物理卷 Physical Volume):指硬盘分区或者从逻辑上看起来和硬盘分区类似的设备(比如 RAID 设备)。
VG(卷组 Volume Group):类似于非 LVM 系统中的物理硬盘,一个 LVM 卷组由一个或者多个 PV(物理卷)组成。
LV(逻辑卷 Logical Volume):类似于非 LVM 系统上的磁盘分区,LV 建立在 VG 上,可以在 LV 上建立文件系统。
PE(Physical Extent):PV(物理卷)中可以分配的最小存储单元称为 PE,PE 的大小是可以指定的。
LE(Logical Extent):LV(逻辑卷)中可以分配的最小存储单元称为 LE,在同一个卷组中,LE 的大小和 PE 的大小是一样的,并且一一对应。
可以这么理解,LVM 是把硬盘的分区分成了更小的单位(PE),再用这些单元拼成更大的看上去像分区的东西(PV),进而用 PV 拼成看上去像硬盘的东西(VG),最后在这个新的硬盘上创建分区(LV)。文件系统则建立在 LV 之上,这样就在物理硬盘和文件系统中间添加了一层抽象(LVM)。下图大致描述了这些概念之间的关系:
对上图中的结构做个简单的介绍:
两块物理硬盘 A 和 B 组成了 LVM 的底层结构,这两块硬盘的大小、型号可以不同。PV 可以看做是硬盘上的分区,因此可以说物理硬盘 A 划分了两个分区,物理硬盘 B 划分了三个分区。然后将前三个 PV 组成一个卷组 VG1,后两个 PV 组成一个卷组 VG2。接着在卷组 VG1 上划分了两个逻辑卷 LV1 和 LV2,在卷组 VG2 上划分了一个逻辑卷 LV3。最后,在逻辑卷 LV1、LV2 和 LV3 上创建文件系统,分别挂载在 /usr、/home 和 /var 目录。
LVM 工具
在安装 ubuntu16.04 时,如果选择使用 LVM 创建分区,就会安装 LVM 相关的工具。当前这个软件包的名称为 lvm2,其中包含了大量 LVM 工具(笔者会在随后的文章中介绍其中一些工具的用法)。比如单是查看 LVM 相关实体状态的命令就有如下一些:
$ sudo pvscan $ sudo pvs $ sudo pvdisplay $ sudo vgscan $ sudo vgs $ sudo vgdisplay $ sudo lvscan $ sudo lvs $ sudo lvdisplay
如果安装系统时没有默认安装 LVM 工具包,可以通过下面的命令安装它们:
$ sudo apt update $ sudo apt install lvm2
接下来我们通过例子来演示如何使用 LVM 来一步步的创建出逻辑卷(LV),然后在 LV 上创建文件系统并挂载到 Linux 系统中。
使用 gdisk 对物理磁盘进行分区
目前常见的磁盘分区格式有两种,MBR 分区和 GPT 分区:
MBR 分区,MBR 的意思是 “主引导记录”。MBR 最大支持 2TB 容量,在容量方面存在着极大的瓶颈。
GPT 分区,GPT 意为 GUID 分区表,它支持的磁盘容量比 MBR 大得多。这是一个正逐渐取代 MBR 的新标准,它是由 UEFI 辅住而形成的,将来 UEFI 用于取代老旧的 BIOS,而 GPT 则取代老旧的 MBR。
笔者在《Linux 磁盘与磁盘分区》一文中介绍了使用 fdisk 工具创建 MBR 磁盘分区的方式,gdisk 是 Linux 系统中 GPT 格式的磁盘分区管理工具。这里我们仅介绍如何使用 gdisk 创建新的磁盘分区。假设我们的 Linux 系统中增加了一块新的磁盘,系统对应的设备名为 /dev/sdd,下面我们通过 gdisk 命令对这个磁盘进行分区。
在用 gdisk 命令对磁盘分区前,我们先用 parted 命令查看 /dev/sdd 当前的分区情况:
$ sudo parted /dev/sdd print
结果显示这是一块尚未创建分区表的磁盘(Model 显示该磁盘是通过 VMware 创建的虚拟磁盘)。下面通过 gdisk 命令创建分区:
$ sudo gdisk /dev/sdd
通过 p 命令可以查看磁盘当前的状态:
输出中的前几行是磁盘的基本信息,比如总大小为 20G,一共有多少个扇区(sector),每个扇区的大小,当前剩余的空间等等。然后是已经存在的分区信息(上图显示还没有任何分区):
第一列 Number 显示了分区的编号,比如 1 号指 /dev/sdd1。
第二列 Start 表示磁盘分区的起始位置。
第三列 End 表示磁盘分区的结束位置。
第四列 Size 显示分区的容量。
第五列 Code 和第六列 Name 显示分区类型的 ID和名称,比如 Linux filesystem 为 8300,Linux swap 为 8200,Linux LVM 为 8e00。
下面通过 n 命令来创建新分区:
分区编号和开始/结束的扇区都直接通过回车选择默认值,这样所有的磁盘空间都划分到了一个分区中,然后输入 8e00 说明我们要创建的分区类型为 Linux LVM。最后输入 w 命令并确认执行分区操作。分区成功后可通过 p 命令查看我们创建的分区的信息:
此时可以看到新产生的设备文件 /dev/sdd1:
创建物理卷 PV
现在我们可以基于磁盘分区 /dev/sdd1 来创建 LVM 物理卷(LV),可以通过 pvcreate 命令来完成:
$ sudo pvcreate /dev/sdd1
此时 /dev/sdd1 已经完成了从磁盘分区到 PV 的华丽转身!注意上面的命令,磁盘分区被直接转换成了 PV,连名称都没有变化!我们可以通过 pvs 命令查看 /dev/sdd1,目前它还没有被加入到 VG 中:
创建卷组 VG
基于一个或多个 PV,可以创建 VG。我们使用刚才创建的 PV /dev/sdd1 来创建一个名称为 nickvg 的 VG:
$ sudo vgcreate -s 32M nickvg /dev/sdd1
注意 vgcreate 命令中的 -s 选项,它指定了 PE(Physical Extent) 的大小。可以通 vgs 命令观察 VG 的信息:
$ sudo vgs nickvg
如果目标 VG 已经存在,则使用 vgextend 把 PV 加入到 VG 中即可。
创建逻辑卷 LV
有了 VG 就可以创建逻辑卷 LV 了,lvcreate 命令用来创建 LV,让我们在前面创建的 nickvg 上创建名称为 nicklv00 的 LV:
$ sudo lvcreate -L 15G -n nicklv00 nickvg
选项 -L 指定新建 LV 的容量,这里是 15G;选项 -n 则指定新建 LV 的名称,这里为 nicklv00。可以通过 lvs 命令观察 LV 的信息,注意需要同时指出 LV 所在的 VG:
格式化逻辑卷(创建文件系统)
当我们创建 LV nickvg/nicklv00 时,其实是创建了名称为 /dev/nickvg/nicklv00 的设备文件:
现在我们来格式化这个逻辑卷(在该 LV 上创建文件系统),目标为比较常见的 ext4 格式:
$ sudo mkfs.ext4 /dev/nickvg/nicklv00
然后创建个目录,比如 /home/doc,并把新建的文件系统挂载到这个目录上:
$ sudo mkdir /home/doc $ sudo mount /dev/nickvg/nicklv00 /home/doc
最后可以通过 df 命令查看这个文件系统的使用情况:
开机自动挂载
编辑 /etc/fstab 文件:
$ sudo vim /etc/fstab
把下面的行添加的文件末尾并保存文件:
/dev/mapper/nickvg-nicklv00 /home/doc ext4 defaults 0 0
总结
本文介绍了 LVM 的基本概念,并从头开始以 LVM 的方式创建了一个文件系统。笔者故意忽略了很多的细节和 LVM 的强大功能,目的是让这个入门的 demo 看起来更简单一些。在后续的文章中笔者会介绍更多详细的内容以展示 LVM 的丰富功能。