Linux LVM文件系统调整笔记

logo-linux

Linux LVM文件系统调整笔记

01 LVM调整缩减和扩容

1.1 问题描述

/根目录空间占用率已经达到了100%;首先考虑到用传统resize2fs方式调整分区:

1
2
3
4
$ resize2fs -p /dev/mapper/centos-home 50G
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/mapper/centos-home
Couldn't find valid filesystem superblock.

报错原因是因为文件系统是xfs(fdisk -l查看),不再支持resize2fs

1.2 问题解决思路

  1. 确认分区文件系统类型是否为lvm

  2. 查看到/home分区有大量闲置空间,决定将home的空间分配给”/“

  3. 解决步骤

    1. 备份/home目录中的文件
    2. 卸载/home目录
    3. 删除/home lv
    4. /home的空间添加到/根目录,剩余20GB不添加到/根目录目录中剩余空间分配给/home
    5. 重新分配/home
    6. 格式化/home
    7. 备份文件还原
    8. 完成调整
  4. 会用到的命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ df -h        # 查看磁盘空间
    $ lsblk # 查看块设备详情
    $ fdisk -l # 查看分区详情
    $ lvremove # 删除逻辑卷
    $ lvcreate # 创建逻辑卷
    $ lvdisplay # 查看逻辑卷<lv>
    $ vgdisplay # 查看卷组<vg>
    $ pvdisplay # 查看物理卷<pv>
    $ xfs_growfs # 加载xfs_growfs

1.3 操作过程

1.3.1 分析

查看分区详情,看到sda2为lvm逻辑卷,所以可以通过将home的空间转移到根分区

1
2
3
4
5
6
7
8
9
10
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 300G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 299.5G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 9.8G 0 lvm [SWAP]
└─centos-home 253:2 0 239.6G 0 lvm /home
sr0 11:0 1 1024M 0 rom

1.3.2 备份/home分区

1
2
3
4
# 在/tmp目录中创建home目录,用于备份home目录中的文件
$ mkdir /tmp/home
# 备份home目录中的文件
$ cp -r /home/* /tmp/home

1.3.3 卸载/home分区

使用umount命令取消/home分区挂载。

1
2
3
4
5
6
7
$ umount /home
umount: /home: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))

# 如果提示busy,则使用fuser解除占用
$ fuser -m -v -i -k /home

1.3.4 删除home的逻辑卷(lv),将home的空间腾出来到卷组(vg)

1
2
3
$ lvremove /dev/mapper/centos-home
Do you really want to remove active logical volume home? [y/n]: y
Logical volume "home" successfully removed

1.3.5 重新调整/的大小

1
2
3
4
# 调整到250G
$ lvextend -L 250G /dev/mapper/centos-root
Size of logical volume centos/root changed from 50.00 GiB (12800 extents) to 250.00 GiB (64000 extents).
Logical volume root successfully resized.

1.3.6 xfs_growfs刷新

1
2
3
4
5
6
7
8
9
10
11
$ xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=256 agcount=4, agsize=3276800 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=6400, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 13107200 to 65536000

1.3.7 将剩下的空间重新划分到home分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ lvcreate -l +100%free -n home centos
# -n 指定lv的名字,centos是vg的名字
# -l 指定分配的空间,+100%free:剩余100%空间都分配给home
Logical volume "home" created.

# 格式化/dev/centos/home分区
$ mkfs.xfs /dev/centos/home
meta-data=/dev/centos/home isize=256 agcount=4, agsize=2601472 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=0 finobt=0
data = bsize=4096 blocks=10405888, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=5081, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

1.3.8 挂载/home分区

1
$ mount /dev/mapper/centos-home /home

1.3.9 调整完成

df -h

将/home备份进行还原

1
cp -r /tmp/home/* /home/

02 LVM调整扩容

2.1 前言

安装Splunk后发现在web页面中提示”可用磁盘空间小于5000M“,splunk 安装路径在/opt/下,只要扩展root lvm即可。操作系统由VMware Workstation Pro 创建,如果需要扩容只需要给该虚拟机添加硬盘即可扩展空间,需要在关机状态下扩展。

2.2 扩展前磁盘情况

1
2
3
4
5
6
7
8
$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 10G 4.1G 5.9G 42% /
devtmpfs 908M 0 908M 0% /dev
tmpfs 914M 0 914M 0% /dev/shm
tmpfs 914M 8.6M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 96M 402M 20% /boot

2.3 调整操作

2.3.1 在sdb磁盘上创建LVM分区

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
41
42
43
44
45
46
47
48
49
50
$ fdisk /dev/sdb
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (20971520-41943039,默认为 20971520):
将使用默认值 20971520
Last 扇区, +扇区 or +size{K,M,G} (20971520-41943039,默认为 41943039):
将使用默认值 41943039
分区 3 已设置为 Linux 类型,大小设为 10 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:100 GB, 21474836480 * 512 字节,41943040 个扇区
Units = 扇区 of 1 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0008970f

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 41943039 8e Linux LVM

命令(输入 m 获取帮助):t
分区号 (1-4,默认 1):1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:100 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0008970f

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 41943039 8e Linux LVM

命令(输入 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)

发现没有sdb设备文件,进行内核重读!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 9.5G 0 part
├─rhel-root 253:0 0 8.5G 0 lvm /
└─rhel-swap 253:1 0 1G 0 lvm [SWAP]
$ partprobe # 内核重读命令

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
├─sda2 8:2 0 9.5G 0 part
│ ├─rhel-root 253:0 0 8.5G 0 lvm /
│ └─rhel-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:0 0 100.8G 0 disk
└─sdb1 8:1 0 100.8G 0 part

2.3.2 扩展vg空间

/dev/sdb1分区添加到rhel VG

1
2
3
4
5
$ vgextend rhel /dev/sdb1
WARNING: dos signature detected on /dev/sdb1 at offset 510. Wipe it? [y/n] y
Wiping dos signature on /dev/sdb1.
Physical volume "/dev/sdb1" successfully created
Volume group "rhel" successfully extended

2.3.3 查看vg信息

1
2
3
4
[root@localhost /]# vgs
VG #PV #LV #SN Attr VSize VFree
rhel 2 2 0 wz--n- 19.50g 10.00g
[root@localhost /]#

2.3.4 扩展lv空间

1
2
3
4
5
6
7
8
9
10
11
12
13
$ lvextend -L +100G /dev/rhel/root 
Extending logical volume root to 108.51 GiB
Insufficient free space: 2560 extents needed, but only 2559 available

# 发现添加10G空间会报错,只能添加到18.51G。难道sdb1空间没有100GB吗?只有80G?以后再研究吧

$ lvextend -L +98G /dev/rhel/root
# 退而求其次 添加98G空间
Extending logical volume root to 108.51 GiB
Logical volume root successfully resized

# 可以使用-l参数 将剩余的空间100%添加给/dev/rhel/root LV
$ lvextend -l +100%FREE /dev/rhel/root

2.3.5 查看lv信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ lvs
# 查看磁盘情况,总容量没有发生变化
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
root rhel -wi-ao---- 108.51g
swap rhel -wi-ao---- 1.00g

$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 8.5G 4.1G 4.5G 48% /
devtmpfs 908M 0 908M 0% /dev
tmpfs 914M 0 914M 0% /dev/shm
tmpfs 914M 8.6M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 96M 402M 20% /boot

使用xfs_growfs /dev/rhel/root 命令使系统重新读取大小

参考:https://www.cnblogs.com/liutao97/p/6775093.html

1
2
3
4
5
6
7
8
9
10
11
$ xfs_growfs /dev/rhel/root 
meta-data=/dev/mapper/rhel-root isize=256 agcount=4, agsize=557568 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=2230272, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2230272 to 4327424

2.4 最终效果

现在就好了

1
2
3
4
5
6
7
8
$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/rhel-root 108G 4.1G 104G 25% /
devtmpfs 908M 0 908M 0% /dev
tmpfs 914M 0 914M 0% /dev/shm
tmpfs 914M 8.6M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 96M 402M 20% /boot

03 新增LVM逻辑卷

3.1 前言

给虚拟机添加一块100GB硬盘,挂载到/data目录用于保存docker容器数据。为了后续方便对/data目录进行扩容。使用lvm系统文件进行管理。

image-20231020204857989

3.2 新增前分区信息

新增分区前分区信息

1
2
3
4
5
6
7
8
9
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 4.6G 13G 28% /
/dev/sda1 1014M 223M 792M 22% /boot
tmpfs 378M 0 378M 0% /run/user/0

3.3 变更调整操作

3.3.1 在/dev/sdb硬盘上创建lvm文件系统并格式分区

/dev/sdb硬盘上创建lvm文件系统格式分区

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
41
42
43
44
45
46
47
$ fdisk /dev/sdb
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (1024-41943039,默认为 41943039):
将使用默认值 41943039
Last 扇区, +扇区 or +size{K,M,G} (1024-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 100 GiB

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:100.5 GB, 21474836480 * 512 字节,41943040 个扇区
Units = 扇区 of 1 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0008970f

设备 Boot Start End Blocks Id System
/dev/sdb1 * 2048 1026047 10485760 8e Linux LVM

命令(输入 m 获取帮助):t
分区号 (1,默认 1):1
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:100.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x0008970f

设备 Boot Start End Blocks Id System
/dev/sdb1 * 2048 1026047 10485760 8e Linux LVM

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

查看磁盘信息

1
2
3
4
5
6
7
8
9
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part # /sdb1分区创建成功

3.3.2 创建物理卷(PV)

给/dev/sdb1分区创建物理卷

1
2
$ pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created. # 创建成功

查看pv创建情况,

1
2
3
4
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- <100.00g <100.00g

3.3.3 创建物理卷组(VG)

在刚才创建好的PV(物理卷)基础上创建VG(物理卷组)

1
2
$ vgcreate docker /dev/sdb1  # 创建成功
Volume group "docker" successfully created

查看物理卷组(VG)创建情况

1
2
3
4
$ vgs  # 创建完成
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
docker 1 0 0 wz--n- <100.00g <100.00g

3.3.4 创建逻辑卷(LV)

-l 100%Free: 创建可使用率100%的逻辑卷(LV)。
-n 指定lv的名称:-n docker。

1
2
$ lvcreate -l 100%Free -n data docker
Logical volume "data" created.

查看逻辑卷(LV)创建情况

1
2
3
4
5
$ lvs  # 创建完成
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
data docker -wi-a----- <100.00g

3.3.5 格式化逻辑卷(LV)

挂载前格式化/dev/docker/data逻辑卷,使用xfs格式。

1
2
3
4
5
6
7
8
9
10
$ mkfs.xfs /dev/docker/data 
meta-data=/dev/docker/data isize=512 agcount=4, agsize=6553344 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=26213376, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=12799, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

3.3.6 挂载逻辑卷到(LV)到/data目录

1
$ mount /dev/mapper/docker-data /data

查看挂载情况

1
2
3
4
5
6
7
8
9
10
$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 4.6G 13G 27% /
/dev/sda1 1014M 223M 792M 22% /boot
tmpfs 378M 0 378M 0% /run/user/0
/dev/mapper/docker-data 100G 33M 100G 1% /data # 挂载完成

3.3.7 创建开机自动挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vim /etc/fstab 
$ cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Oct 20 05:25:35 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
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=a95eac58-77cf-4b6f-a7dd-78cef0e915e9 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/dev/mapper/docker-data /data xfs defaults 0 0
# 新增挂载配置

Linux LVM文件系统调整笔记
https://hesc.info/d1faf84ccdfc/
作者
需要哈气的纸飞机
发布于
2024年8月14日
许可协议