1. 概述
Linux内核的逻辑卷管理器(Logical Volume Manager)让我们对磁盘分区进行抽象。我们不需要把存储卷分配给写入物理磁盘分区表的分区,而是根据需要灵活地分配空间。而且,我们不是一次使用一个磁盘,而是使用一个存储池。这意味着,如果我们的/usr或/var卷的空间用完了,我们可以扩大或缩小。
CentOS系统安装的时候默认都提供了LVM管理磁盘的方式,当我们需要比原来计划的更多的存储空间时,就需要用到LVM相关的命令了。
在本教程中,我们将向我们的存储池(又称卷组)添加一个新的物理磁盘,并使用添加的存储空间来增加我们现有的文件系统。
2. 情况是这样的
比方说,我们一直在使用CentOS 7服务器。默认情况下,我们的服务器的存储空间已经被划分为一个传统的35.5GB的/分区,系统目前有一个可以清除数据的磁盘,当前挂载在/u01。我们可以用lsblk看一下:
[root@glpt1 ~]# lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
NAME SIZE TYPE FSTYPE MOUNTPOINT
sda 40G disk
├─sda1 500M part xfs /boot
└─sda2 39.5G part LVM2_member
├─centos_glpt1-root 35.5G lvm xfs /
└─centos_glpt1-swap 4G lvm swap [SWAP]
sdb 400G disk
└─sdb1 400G part xfs /u01
sdc 1T disk LVM2_member
└─datavg-datalv 1024G lvm xfs /u02
sr0 1024M rom
从这个输出中,我们看到/dev/sdb1有400G,如果一个磁盘只有一部分空间在LVM被分配了,也能从lsblk命令看得出来,结果会像sda磁盘那样子,未分配的空间可以继续分配到其他的挂载点。
让我们看看我们的文件系统用传统的工具(如df)看起来是什么样子。
[root@glpt1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos_glpt1-root 36G 33G 3.0G 92% /
devtmpfs 12G 0 12G 0% /dev
tmpfs 12G 148K 12G 1% /dev/shm
tmpfs 12G 226M 12G 2% /run
tmpfs 12G 0 12G 0% /sys/fs/cgroup
/dev/sdb1 400G 371G 29G 93% /u01
/dev/sda1 497M 127M 370M 26% /boot
tmpfs 2.4G 0 2.4G 0% /run/user/0
tmpfs 2.4G 20K 2.4G 1% /run/user/1000
/dev/mapper/datavg-datalv 1.0T 388G 637G 38% /u02
对于Linux来说,这个有长名字的逻辑卷看起来就像一个块设备或分区。现在我们准备使用/dev/sdb1来扩容/dev/mapper/centos_glpt1-root。
3. 物理卷、卷组和逻辑卷
在过去简单分区的情况下,我们不得不把所有东西都复制到一个更大的分区,以增加更多的存储空间。我们很可能不得不让我们的服务器在磁盘扩容阶段处于离线状态。
当我们使用LVM时,我们可以在任何物理驱动器之间切换我们的逻辑卷。我们可以安全地调整任何逻辑卷的大小,然后调整其文件系统。
Linux的LVM系统包含三个层次:物理卷、卷组和逻辑卷。lvm命令让我们把系统作为一个整体来处理。
但是,这些层次中的每一个都可以通过一系列的命令来创建、检查、修改,等等。
- pv命令操作物理卷
- vg命令操作卷组
- lv命令操作逻辑卷
3.1. 检查我们的逻辑卷
让我们用LVM工具检查一下我们的存储。使用pvdisplay,我们可以看到旧式的硬盘分区,它已经被标记为一个LVM物理卷。
[root@glpt1 /]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos_glpt1
PV Size 39.51 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 10114
Free PE 10
Allocated PE 10104
PV UUID v6hdW9-xzbJ-Ayrk-k1VT-c4ka-0ZGF-Z1ZZqF
--- Physical volume ---
PV Name /dev/sdc
VG Name datavg
PV Size 1.00 TiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 262143
Free PE 0
Allocated PE 262143
PV UUID QvGx3c-xc6p-cCEC-L087-W2uM-j655-yVx0OU
我们还注意到它是centos_glpt1卷组的一个成员。PE是物理扩展的意思。Extent是文件系统衡量块设备的一种方式:一个块的单位长度。
lvdisplay 命令可以知道逻辑卷的名字,逻辑卷所使用的 VG。
[root@glpt1 /]# lvdisplay /dev/mapper/centos_glpt1
--- Logical volume ---
LV Path /dev/centos_glpt1/root
LV Name root
VG Name centos_glpt1
LV UUID AvEYjq-6OKT-V7Hb-zVUx-rhnY-QCCn-v7q662
LV Write Access read/write
LV Creation host, time localhost, 2017-10-09 15:29:14 +0800
LV Status available
# open 1
LV Size <35.47 GiB
Current LE 9080
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/centos_glpt1/swap
LV Name swap
VG Name centos_glpt1
LV UUID X52ge1-fhE0-Uiau-lbtY-Hhfi-cKJu-hEb5CU
LV Write Access read/write
LV Creation host, time localhost, 2017-10-09 15:29:15 +0800
LV Status available
# open 2
LV Size 4.00 GiB
Current LE 1024
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
3.2. 清除原有磁盘分区信息
对于已经创建分区的磁盘,我们无法创建物理卷。pvcreate命令回报告无法找到对应的磁盘。如果你是一块新的磁盘挂载到服务器,可以忽略本小节的内容直接进入下一个小节。
[root@glpt1 /]# pvcreate /dev/sdb
Device /dev/sdb not found (or ignored by filtering).
使用fdisk命令删除已有磁盘的分区。d是删除分区,p命令可以确认磁盘信息,最后使用w保存操作,退出fdisk命令。
[root@glpt1 /]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Selected partition 1
Partition 1 is deleted
Command (m for help): p
Disk /dev/sdb: 429.5 GB, 429496729600 bytes, 838860800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x833e9763
Device Boot Start End Blocks Id System
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
再次使用lsblk命令确认磁盘信息
[root@glpt1 /]# lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
NAME SIZE TYPE FSTYPE MOUNTPOINT
sda 40G disk
├─sda1 500M part xfs /boot
└─sda2 39.5G part LVM2_member
├─centos_glpt1-root 35.5G lvm xfs /
└─centos_glpt1-swap 4G lvm swap [SWAP]
sdb 400G disk
sdc 1T disk LVM2_member
└─datavg-datalv 1024G lvm xfs /u02
sr0 1024M rom
3.3. 添加存储
如果增加了一个硬盘驱动器,我们可以使用RAID模式来获得更可靠的扩容。但现在我们使用LVM来对服务器的存储空间执行线性扩容。
3.3.1. pvcreate创建物理卷
首先,我们使用pvcreate命令对新的硬盘创建物理卷,以便与LVM一起使用。
[root@glpt1 /]# pvcreate /dev/sdb
WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y
Wiping dos signature on /dev/sdb.
Physical volume "/dev/sdb" successfully created.
使用lsblk命令确认磁盘信息,对比3.2节里面的lsblk命令结果,我们发现/dev/sdb已经是LVM成员了。
[root@glpt1 /]# lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
NAME SIZE TYPE FSTYPE MOUNTPOINT
sda 40G disk
├─sda1 500M part xfs /boot
└─sda2 39.5G part LVM2_member
├─centos_glpt1-root 35.5G lvm xfs /
└─centos_glpt1-swap 4G lvm swap [SWAP]
sdb 400G disk LVM2_member
sdc 1T disk LVM2_member
└─datavg-datalv 1024G lvm xfs /u02
sr0 1024M rom
3.3.2. pvdisplay确认物理卷信息
物理卷pvdisplay命令也可以看到新增了/dev/sdb,空间大小400GiB。
[root@glpt1 /]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos_glpt1
PV Size 39.51 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 10114
Free PE 10
Allocated PE 10104
PV UUID v6hdW9-xzbJ-Ayrk-k1VT-c4ka-0ZGF-Z1ZZqF
--- Physical volume ---
PV Name /dev/sdc
VG Name datavg
PV Size 1.00 TiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 262143
Free PE 0
Allocated PE 262143
PV UUID QvGx3c-xc6p-cCEC-L087-W2uM-j655-yVx0OU
"/dev/sdb" is a new physical volume of "400.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 400.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID t61gDu-YXqB-m3fX-a6OO-21pe-m0xR-72HzLP
3.3.3. vgextend物理卷添加至卷组
接下来我们将把我们的物理卷,/dev/sdb,添加到我们的卷组,centos_glpt1。
我们将使用LVM命令vgextend。
[root@glpt1 /]# vgextend centos_glpt1 /dev/sdb
Volume group "centos_glpt1" successfully extended
3.3.4. vgdisplay确认卷组信息
使用vgdisplay确认卷组的情况,可以看到 Free PE / Size 是400GiB
[root@glpt1 /]# vgdisplay centos_glpt1
--- Volume group ---
VG Name centos_glpt1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 439.50 GiB
PE Size 4.00 MiB
Total PE 112513
Alloc PE / Size 10104 / <39.47 GiB
Free PE / Size 102409 / <400.04 GiB
VG UUID 8oUA5b-JG2w-M60U-hCcs-EWbi-eKOq-PihB1Y
3.3.5. lvresize对逻辑卷扩容
最后,我们可以调整我们的逻辑卷的大小,centos_glpt1。现在,它有400GiB可用空间。让我们100%使用完可用空间。
我们将用lvresize来完成操作。
[root@glpt1 /]# lvresize --extents +100%FREE --resizefs /dev/mapper/centos_glpt1-root
Size of logical volume centos_glpt1/root changed from <35.47 GiB (9080 extents) to 435.50 GiB (111489 extents).
Logical volume centos_glpt1/root successfully resized.
meta-data=/dev/mapper/centos_glpt1-root isize=256 agcount=4, agsize=2324480 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=9297920, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=4540, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 9297920 to 114164736
--resizefs选项会自动扩展你的ext或XFS文件系统以适应其新的空间。我们也可以用特定于文件系统的调整大小的命令作为一个单独的步骤来做,但在lvresize里使用--resizefs参数一次性完成扩容很方便。
让我们使用非LVM工具来检查我们的磁盘空间。
[root@glpt1 /]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos_glpt1-root 436G 33G 404G 8% /
devtmpfs 12G 0 12G 0% /dev
tmpfs 12G 148K 12G 1% /dev/shm
tmpfs 12G 226M 12G 2% /run
tmpfs 12G 0 12G 0% /sys/fs/cgroup
/dev/sda1 497M 127M 370M 26% /boot
tmpfs 2.4G 0 2.4G 0% /run/user/0
tmpfs 2.4G 20K 2.4G 1% /run/user/1000
/dev/mapper/datavg-datalv 1.0T 388G 637G 38% /u02
lvresize命令除了使用百分比来扩容空间,我们也可以使用--size来指定一个确定的目标容量空间大小,例如20G,或一个增加数量,如+10G。
# lvresize --size +10G --resizefs /dev/mapper/centos_glpt1-root
4. 关于LVM线性扩容的思考
像这样组合多个磁盘可以称之为线性模式,会增加我们因硬件故障而丢失数据的风险。一般只使用在从存储服务器分配出来的磁盘直接挂载至服务器的情况,因为存储服务器已经对磁盘做了RAID。如果是物理服务器直接挂载物理裸设备,仍然建议使用RAID来保护数据不丢失。
RAID也可以硬件 RAID 卡,或者是软 RAID,例如使用 mdraid 创建一个Linux RAID设备。然后我们可以像对待任何物理卷一样对待它,把它添加到卷组继而在LVM中使用它;也可以使用 LVM 内置的 RAID命令。两种软 RAID 方法都使用相同的RAID软件。所以是用软RAID时,选择哪种方式实际上是一个关于我们如何组织我们的存储的问题。
5. 总结
与使用裸硬盘分区相比,逻辑卷管理器为我们提供了更大的存储灵活性。在本教程中,我们已经扩展了我们的根卷。我们能够做到这一点是因为它是用LVM创建的。这意味着我们可以标记一个新的物理卷供LVM使用,将其添加到卷组,然后将该存储部署到我们想要的地方。我们可以根据需要增加空间,并且服务器上的服务仍然在不间断运行,LVM提供了极大的便利性。