知识点

LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,在Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和 分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷(volumegroup),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logicalvolumes),并进一步在逻辑卷组上创建文件系统。

  • LVM组成
    LVM(Logical Volume Manager) - 逻辑卷管理
    LV(Logical Volume)- 逻辑卷:也就是从VG中划分的逻辑分区
    VG(Volumne Group)- 卷组:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库统一管理了几个大的硬盘,形成了一个统一虚拟的存储资源池。
    PV(Physical Volume)- 物理卷:是物理的磁盘分区

  • LVM模型
    LVM模型


常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看容量
df -hl
# 查看磁盘
fdisk -l
# 进入磁盘设置
fdisk /dev/sda
# 列出块设备信息
lsblk
# 挂载磁盘
mount /dev/centos/home /home
# 卸载磁盘
umount /home
# 进入卷管理模式
lvm
# 查看物理卷
pvdisplay
# 查看卷组
vgdisplay
# 查看逻辑卷
lvdisplay

实例

压缩home目录并扩容根目录

开始前先备份好home下的文件

  • 查看当前磁盘情况
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 908M 0 908M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.9M 911M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/centos-root 59G 2.2G 57G 4% /
/dev/sda1 1014M 194M 821M 20% /boot
/dev/mapper/centos-home 19G 33M 19G 1% /home
tmpfs 184M 0 184M 0% /run/user/0
  • 解除磁盘占用并卸载home
1
2
3
4
5
6
7
8
# 使用fuser命令需先安装psmisc
yum install -y psmisc

# 解除磁盘占用
fuser -m -v -i -k /home

# 卸载磁盘
umount /home
fuser参数
1
2
3
4
5
6
7
8
9
10
11
12
fuser --help
-a 显示所有命令行中指定的文件,默认情况下被访问的文件才会被显示。
-c 和-m一样,用于POSIX兼容。
-k 杀掉访问文件的进程。如果没有指定-signal就会发送SIGKILL信号。结合 –signal
-signal 使用指定的信号,而不是用SIGKILL来杀掉进程。可以通过名称或者号码来表示信号(例如-HUP,-1),这个选项要和-k一起使用,否则会被忽略。
-l 列出所有已知的信号名称。
-i 杀掉进程之前询问用户,如果没有-k这个选项会被忽略。
-m name 指定一个挂载文件系统上的文件或者被挂载的块设备(名称name)。这样所有访问这个文件或者文件系统的进程都会被列出来。如果指定的是一个目录会自动转换成"name/",并使用所有挂载在那个目录下面的文件系统。
-n space 指定一个不同的命名空间(space).这里支持不同的空间文件(文件名,此处默认)、tcp(本地tcp端口)、udp(本地udp端口)。对于端口,可以指定端口号或者名称,如果不会引起歧义那么可以使用简单表示的形式,例如:name/space (即形如:80/tcp之类的表示)。
-s 静默模式,这时候-u,-v会被忽略。-a不能和-s一起使用。
-u 在每个PID后面添加进程拥有者的用户名称。
-v 详细模式。输出似ps命令的输出,包含PID,USER,COMMAND等许多域,如果是内核访问的那么PID为kernel.
  • 扩展根目录
1
2
3
4
5
6
7
8
# 删除home卷
lvremove /dev/mapper/centos-home

# 扩展根目录所在卷
lvextend -L +10G /dev/mapper/centos-root

# 扩展文件系统
xfs_growfs /dev/mapper/centos-root
  • 重新设置home目录
查看剩余空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost /]# vgdisplay 
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 8
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 78.99 GiB
PE Size 4.00 MiB
Total PE 20222
Alloc PE / Size 17996 / <70.30 GiB
Free PE / Size 2226 / <8.70 GiB
VG UUID jBbnow-HGcl-yDVX-dkxc-AuCC-1MqU-meZ9H1
1
2
3
4
5
6
7
8
# 重新创建home卷,不能超过8.7G
lvcreate -L 8.6G -n home centos

# 创建文件系统
mkfs.xfs /dev/centos/home

# 挂载home磁盘
mount /dev/centos/home /home
  • 如不需要单独home盘,则修改/etc/fstab

注释home文件夹的挂载

1
2
3
4
5
6
7
8
9
10
# /etc/fstab
# Created by anaconda on Tue Jun 28 10:19:19 2022
#
# 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=323b5d2c-5008-438c-b768-67d351fe5077 /boot xfs defaults 0 0
#/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
  • 设置完成查看容量
1
2
3
4
5
6
7
8
9
10
[root@localhost /]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 908M 0 908M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.9M 911M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/centos-root 69G 2.2G 67G 4% /
/dev/sda1 1014M 194M 821M 20% /boot
tmpfs 184M 0 184M 0% /run/user/0
/dev/mapper/centos-home 8.6G 33M 8.6G 1% /home

现在可以恢复home的数据


虚拟机扩容磁盘

  • 先关闭虚拟机并设置磁盘大小

修改磁盘大小

  • 启动后查看当前磁盘
1
2
3
4
[root@localhost ~]# fdisk -l

磁盘 /dev/sda:1099.5 GB, 1099511627776 字节,2147483648 个扇区
···
  • 新建分区
    依次输入fdisk /dev/sdapnpwreboot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# fdisk /dev/sda
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

命令(输入 m 获取帮助):n //新建分区
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p //选择主分区
分区号 (3,4,默认 3): //默认
起始 扇区 (125829120-2147483647,默认为 125829120): //默认
将使用默认值 125829120
Last 扇区, +扇区 or +size{K,M,G} (125829120-2147483647,默认为 2147483647): //默认
将使用默认值 2147483647
分区 3 已设置为 Linux 类型,大小设为 964 GiB

命令(输入 m 获取帮助):w //保存并退出
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
  • 重新读分区表或重启reboot
1
[root@localhost ~]# partprobe
  • 为根目录扩展分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 创建物理卷
[root@localhost ~]# pvcreate /dev/sda3
Physical volume "/dev/sda3" successfully created.

# 加入centos卷组
[root@localhost ~]# vgextend centos /dev/sda3
Volume group "centos" successfully extended

# 查看可用空间
[root@localhost ~]# pvdisplay
···
--- Physical volume ---
PV Name /dev/sda3
VG Name centos
PV Size 964.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 246783
Free PE 246783
Allocated PE 0
PV UUID fYA0Uh-hpi6-pUq6-UHts-aTSw-jXnU-8cb8tl

# 扩展已有卷容量
[root@localhost ~]# lvextend -l +100%free /dev/mapper/centos-root
Size of logical volume centos/root changed from <38.30 GiB (9804 extents) to 964.00 GiB (246784 extents).
Logical volume centos/root successfully resized.

# 再次查看,空间已用完
[root@localhost ~]# pvdisplay
···
--- Physical volume ---
PV Name /dev/sda3
VG Name centos
PV Size 964.00 GiB / not usable 4.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 246783
Free PE 0
Allocated PE 246783
PV UUID fYA0Uh-hpi6-pUq6-UHts-aTSw-jXnU-8cb8tl
  • 文件系统扩容
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root 
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=2509824 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=10039296, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=4902, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 10039296 to 252706816
查看根目录空间
1
2
3
4
5
6
7
8
9
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 9.4M 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/mapper/centos-root 964G 6.8G 958G 1% /
/dev/sda1 1014M 194M 821M 20% /boot
/dev/mapper/centos-home 19G 33M 19G 1% /home

新增磁盘并扩容根目录

  • 查看新增磁盘是否成功挂载
1
2
3
4
5
6
7
[root@localhost ~]# fdisk -l

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
···
  • 设置分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost ~]# fdisk /dev/sdb 
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x75b4be71 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):n //新建磁盘
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p //选择主分区
分区号 (1-4,默认 1): //默认
起始 扇区 (2048-41943039,默认为 2048): //默认
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): //默认
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):w //保存并退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]#
  • 逻辑卷管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 创建物理卷
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.

# 将新物理卷加入centos卷组
[root@localhost ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended

# 扩展根目录所在逻辑卷
[root@localhost ~]# lvextend -l +100%free /dev/mapper/centos-root
Size of logical volume centos/root changed from <68.30 GiB (17484 extents) to <88.39 GiB (22627 extents).
Logical volume centos/root successfully resized.

# 写入文件系统
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512 agcount=8, agsize=2509824 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=17903616, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=4902, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 17903616 to 23170048

# 空间已增加
[root@localhost ~]# df -lh
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 908M 0 908M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.9M 911M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/mapper/centos-root 89G 2.2G 87G 3% /
/dev/mapper/centos-home 8.6G 33M 8.6G 1% /home
/dev/sda1 1014M 194M 821M 20% /boot
tmpfs 184M 0 184M 0% /run/user/0