Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法。
本篇博客主要介绍了通过管理LVM(逻辑卷)功能,让用户在无需停机的情况下可以方便的调整各个分区大小。
逻辑卷管理器本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,它可以将几块磁盘组合起来形成一个存储池或卷组。
特性:根据当前使用情况, 动态增加磁盘容量,从而提高磁盘管理的灵活性,有点类似微软的跨区卷
缺点:如果有一块磁盘损坏,数据丢失
Ps:/boot分区用于存放引导文件,不能基于LVM创建
图形界面管理工具:
system-config-lvm
PV(Physical Volume,物理卷):物理卷是LVM机制的基本存储设备,通常对应为一个普通分区或整个硬盘。创建物理卷时,会在分区或者硬盘的头部创建一给保留区块,用于记录LVM的属性,并把存储空间分割成默认为4MB的基本单元(简称PE),从而构成物理卷,物理卷一般直接使用设备文件名称,如/dev/sdb1、/dev/sdb2、/dev/sdd等。
VG(Volume Group,卷组):由一个或多个物理卷组成一个整体,此整体称为卷组,在卷组中可以动态添加或一处物理卷,许多个物理卷可以分别组成不同的卷组,卷组名称由用户自行定义。
LV (Logical Volume,逻辑卷):逻辑卷建立在卷组之上,与物理卷没有直接关系,对于逻辑卷来说,每个卷组就是一个整体,从整个整体中划分出一小块空间,作为用户创建文件系统的基础,这一小块空间就称为逻辑卷,使用mkfs等工具在逻辑卷上创建文件系统以后,就可以挂载到Linux系统中的目录下使用。
创建LVM的顺序:
1、添加磁盘,将每个磁盘分区,设置格式
2、创建物理卷PV
3、创建卷组VG
4、创建逻辑卷LVM
5、创建文件系统、格式化LVM并挂载
6、动态调整LVM分区大小
主要命令格式:
pvcreate 设备名1 设备名2
vgceate 卷组名 物理卷名1 物理卷名2
lvcreate -L 容量大小 -n 逻辑卷名 卷组名
lvextend -L +大小 /dev/卷组名/逻辑卷名
添加磁盘,可以根据需要自由选择磁盘空间大小,添加完成后因为Shell终端不能直接识别到添加的磁盘,所以我们这里在Shell终端上输入“reboot”(刷新/重启)。
重启完成后,我们到/dev目录下查看磁盘信息,此时已识别到新添加的磁盘,(此处我们添加3块磁盘)示例:
[root@localhost ~]# cd /dev
[root@localhost dev]# fdisk -l (查看磁盘信息)
磁盘 /dev/sda:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a2ffa
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 12584959 6291456 83 Linux
/dev/sda2 12584960 54527999 20971520 83 Linux
/dev/sda3 54528000 62916607 4194304 82 Linux swap / Solaris
/dev/sda4 62916608 83886079 10484736 5 Extended
/dev/sda5 62918656 83886079 10483712 83 Linux
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
[root@localhost dev]#
下一步我们进行磁盘分区,此处只示例一块磁盘的设置步骤(其他2块磁盘一致),我们将所有磁盘空间都给第一块分区,示例:
[root@localhost dev]# fdisk /dev/sdb (进入并设置磁盘sdb)
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x4c593d51 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n (新建分区)
Partition type:
p primary (0 primary, 0 extended, 4 free) (主分区)
e extended (扩展分区)
Select (default p): p
分区号 (1-4,默认 1):
起始 扇区 (2048-83886079,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-83886079,默认为 83886079):
将使用默认值 83886079
分区 1 已设置为 Linux 类型,大小设为 40 GiB (将所有空间全分配给第一个分区)
命令(输入 m 获取帮助):p (查询磁盘信息)
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4c593d51
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 83886079 41942016 83 Linux
命令(输入 m 获取帮助):t (设置分区的格式)
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e (LVM格式)
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):p (查看分区信息)
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4c593d51
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 83886079 41942016 8e Linux LVM
命令(输入 m 获取帮助):w (保存)
配置完成后输入fdisk -l 查看。此时我们添加的3块磁盘全部分区完成,并且格式均为LVM。示例:
[root@localhost dev]# fdisk -l (查看磁盘信息)
磁盘 /dev/sda:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000a2ffa
设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 12584959 6291456 83 Linux
/dev/sda2 12584960 54527999 20971520 83 Linux
/dev/sda3 54528000 62916607 4194304 82 Linux swap / Solaris
/dev/sda4 62916608 83886079 10484736 5 Extended
/dev/sda5 62918656 83886079 10483712 83 Linux
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xebd91e21
设备 Boot Start End Blocks Id System
/dev/sdc1 2048 41943039 20970496 8e Linux LVM
磁盘 /dev/sdd:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x3d73f030
设备 Boot Start End Blocks Id System
/dev/sdd1 2048 41943039 20970496 8e Linux LVM
磁盘 /dev/sdb:42.9 GB, 42949672960 字节,83886080 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x4c593d51
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 83886079 41942016 8e Linux LVM
[root@localhost dev]#
现在我们设置物理卷,输入pvcreate /dev/sd{b…d}1 (简写格式,代表将sdb1、sdc1、sdd1都设置为物理卷),然后我们查看下物理卷信息,命令为:pvsan(扫描物理卷)。示例:
[root@localhost dev]# pvcreate /dev/sd{b..d}1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
[root@localhost dev]# pvscan
PV /dev/sdb1 lvm2 [<40.00 GiB]
PV /dev/sdc1 lvm2 [<20.00 GiB]
PV /dev/sdd1 lvm2 [<20.00 GiB]
Total: 3 [<80.00 GiB] / in use: 0 [0 ] / in no VG: 3 [<80.00 GiB]
(Total:数量,in use:已使用数量,in no VG:未使用数量,未使用的磁盘大小总和)
此处我们也可以输入pvdisplay(显示物理卷详细信息),示例:
[root@localhost dev]# pvdisplay
"/dev/sdb1" is a new physical volume of "<40.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size <40.00 GiB (物理卷空间大小)
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID IoKKIi-6Ks4-6k3J-vcCj-i8dJ-2aEo-lZ8B5U
"/dev/sdc1" is a new physical volume of "<20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc1
VG Name
PV Size <20.00 GiB (物理卷空间大小)
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 1zfA9w-fSKe-BtZz-w3ig-fPlm-z82H-mIRwuS
"/dev/sdd1" is a new physical volume of "<20.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd1
VG Name
PV Size <20.00 GiB (物理卷空间大小)
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID gTicJ7-c1Jr-hmHU-tiPx-jbGS-rk4p-5h5UcG
这一步我们设置将3个物理卷组成一个卷组,此卷组命名为:mailbox。命令:vgcreate mailbox /dev/sd{b…d}1,示例:
[root@localhost dev]# vgcreate mailbox /dev/sd{b..d}1
Volume group "mailbox" successfully created
此时我们可以再输入命令:pvscan(查看物理卷信息),可见我们新添加的磁盘已被分在mailbox卷组中。示例:
[root@localhost dev]# pvscan
PV /dev/sdb1 VG mailbox lvm2 [<40.00 GiB / <40.00 GiB free]
PV /dev/sdc1 VG mailbox lvm2 [<20.00 GiB / <20.00 GiB free]
PV /dev/sdd1 VG mailbox lvm2 [<20.00 GiB / <20.00 GiB free]
Total: 3 [<79.99 GiB] / in use: 3 [<79.99 GiB] / in no VG: 0 [0 ] (in use 已使用数量为3,并且属于mailbox卷组)
[root@localhost dev]#
我们使用查看详细信息命令:vgdisplay。示例:
[root@localhost dev]# vgdisplay
--- Volume group ---
VG Name mailbox
System ID
Format lvm2
Metadata Areas 3
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 3
Act PV 3
VG Size <79.99 GiB
PE Size 4.00 MiB (此处可见每个单元格PE的大小为4MB)
Total PE 20477
Alloc PE / Size 0 / 0
Free PE / Size 20477 / <79.99 GiB
VG UUID ldz1Zw-CrVt-5C4h-5xAs-mbVE-mh5J-d5PICp (卷组的ID号,便于系统识别)
[root@localhost dev]#
现在我们可以创建逻辑卷,命令为:lvcreate -L 25G -n mbox01 mailbox。(lvcreate:创建LVM。-L 25G :设置逻辑卷大小为25G。 -n:逻辑卷名字。mbox01:划分逻辑卷的卷组)
[root@localhost dev]# lvcreate -L 25G -n mbox01 mailbox
Logical volume "mbox01" created.
创建成功后我们可以查看到划分的逻辑卷
首先我们在/dev目录下ls,已将可以查看到我们的mailbox卷组(需要划分LVM后才可以查看到)
然后我们可以进入mailbox,命令:cd/dev/mailbox,此时我么可以看到我们新建的逻辑分区。
示例:
[root@localhost dev]# ls
agpgart cpu hidraw0 lp1 network_throughput rfkill sdb1 shm tty10 tty2 tty29 tty38 tty47 tty56 tty8 usbmon1 vcsa1 vmci
autofs cpu_dma_latency hpet lp2 null rtc sdc snapshot tty11 tty20 tty3 tty39 tty48 tty57 tty9 usbmon2 vcsa2 vsock
block crash hugepages lp3 nvram rtc0 sdc1 snd tty12 tty21 tty30 tty4 tty49 tty58 ttyS0 vcs vcsa3 zero
bsg disk hwrng mailbox oldmem sda sdd sr0 tty13 tty22 tty31 tty40 tty5 tty59 ttyS1 vcs1 vcsa4
btrfs-control dm-0 initctl mapper port sda1 sdd1 stderr tty14 tty23 tty32 tty41 tty50 tty6 ttyS2 vcs2 vcsa5
bus dri input mcelog ppp sda2 sg0 stdin tty15 tty24 tty33 tty42 tty51 tty60 ttyS3 vcs3 vcsa6
cdrom fb0 kmsg mem ptmx sda3 sg1 stdout tty16 tty25 tty34 tty43 tty52 tty61 uhid vcs4 vfio
char fd log mqueue pts sda4 sg2 tty tty17 tty26 tty35 tty44 tty53 tty62 uinput vcs5 vga_arbiter
console full loop-control net random sda5 sg3 tty0 tty18 tty27 tty36 tty45 tty54 tty63 urandom vcs6 vhci
core fuse lp0 network_latency raw sdb sg4 tty1 tty19 tty28 tty37 tty46 tty55 tty7 usbmon0 vcsa vhost-net
[root@localhost dev]# cd mailbox
[root@localhost mailbox]# ls
mbox01 (创建的LVM)
[root@localhost mailbox]#
我们可以在查询一下LVM的详细信息
[root@localhost /]# lvdisplay
--- Logical volume ---
LV Path /dev/mailbox/mbox01
LV Name mbox01
VG Name mailbox
LV UUID NrOTtL-ONTP-5cws-zIWO-olLX-VCex-aEpSRL
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-11-06 17:15:02 +0800
LV Status available
# open 0
LV Size 25.00 GiB
Current LE 6400
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
我们在格式化之前首先在其他目录创建一个子目录,命令:mkdir /opt/mbox2。示例:
[root@localhost dev]# mkdir /opt/mbox2
[root@localhost dev]# ls /opt
demo01 mbox2 rh
然后格式化逻辑卷,格式为xfs,命令为:mkfs -t xfs /dev/mailbox/mbox01.示例:
[root@localhost dev]# mkfs -t xfs /dev/mailbox/mbox01
meta-data=/dev/mailbox/mbox01 isize=512 agcount=4, agsize=1638400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=6553600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=3200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
然后设置自动开机自动挂载,命令:vim /etc/fstab,设置开机自动挂载。示例:
设置完成后输入:mount -a 自动重新挂载,然后输入df -hT查询挂在信息。示例:
[root@localhost dev]# mount -a (自动重新挂载)
[root@localhost dev]# df -h (查询挂在信息)
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 20G 4.5G 16G 23% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 912M 0 912M 0% /dev/shm
tmpfs 912M 9.1M 903M 1% /run
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 10G 38M 10G 1% /home
/dev/sda1 6.0G 174M 5.9G 3% /boot
tmpfs 183M 4.0K 183M 1% /run/user/42
tmpfs 183M 28K 183M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/mailbox-mbox01 25G 33M 25G 1% /opt/mbox2
假设现在逻辑分区mbox01现在的空间不够,我们就需要用到扩展逻辑空间,我们先扩容LVM(逻辑卷)5G示例:
[root@localhost mbox2]# lvextend -L +5G /dev/mailbox/mbox01
Size of logical volume mailbox/mbox01 changed from 25.00 GiB (6400 extents) to 30.00 GiB (7680 extents).
[root@localhost dev]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda2 xfs 20G 4.5G 16G 23% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 912M 0 912M 0% /dev/shm
tmpfs tmpfs 912M 9.0M 903M 1% /run
tmpfs tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/sda5 xfs 10G 38M 10G 1% /home
/dev/sda1 xfs 6.0G 174M 5.9G 3% /boot
tmpfs tmpfs 183M 24K 183M 1% /run/user/0
/dev/sr0 iso9660 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
/dev/mapper/mailbox-mbox01 xfs 25G 33M 25G 1% /opt/mbox2 (查询显示我们配置的5G暂时未扩容成功)
查询显示我们配置的5G暂时未扩容成功,这个时候我们继续输入命令:resize2fs /dev/mailbox/mbox01,(resize2fs为文件系统重定义大小工具) 一般来说,我们可以直接配置成功,但是在此我们说一个常见问题,我们现在输入命令后,系统报错,如图:
[root@localhost dev]# resize2fs /dev/mailbox/mbox01 (文件重定义大小)
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block 当尝试打开 /dev/mailbox/mbox01 时
找不到有效的文件系统超级块.
(系统报错)
这个时候我们可以检查两点,第一,输入cat /etc/fstab,检查我们配置的挂载格式是否未“xfs”,示例:
[root@localhost dev]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Oct 27 15:47:27 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=1cdaa1f7-8d44-4a00-b153-b0ba1b763ba2 / xfs defaults 0 0
UUID=32aee843-60bd-43b1-94f0-b9af529c2744 /boot xfs defaults 0 0
UUID=07145df9-e2e8-4e89-b08e-1fa3aac7dfc4 /home xfs defaults 0 0
UUID=13e8b5ea-7f99-4459-a180-8c11e6d3e543 swap swap defaults 0 0
/dev/mailbox/mbox01 /opt/mbox2 xfs defaults 0 0
(我们手工配置的命令)
经查询格式配置没有问题,这个时候报错的原因多数是因为resize2fs读取不了xfs格式,这个时候我们可以使用另一个同步文件的命令:xfs_growfs /dev/mailbox/mbox01。示例:
[root@localhost dev]# xfs_growfs /dev/mailbox/mbox01 (同步文件)
meta-data=/dev/mapper/mailbox-mbox01 isize=512 agcount=4, agsize=1638400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=6553600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=3200, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 6553600 to 7864320
我们再次通过查询挂载信息查看逻辑卷的容量,如图可知,扩容已成功。
我们简单介绍了LVM的概念、PV、VG、LV的配置、查询和动态调整逻辑卷的大小,其中有一些知识点,比如开机自动挂载的设置在上一篇或上几篇的博客中均有介绍。
在扩容LVM时,我们要格外注意格式问题,命令中存在不能识别部分格式的问题,我们可以通过大量学习、查询相关信息获取到我们需要的内互相学习,互相成长~。