安装新系统后,可能最开始分配的空间是够用的,但是随着业务或者需求的增长,原来的空间渐渐地捉襟见肘了,此时就需要考虑对空间进行扩容,这篇文章主要是记录之前对使用LVM对/home
目录扩容的探索,对知识的了解以及具体的实战。由于融入了一些知识的讲解,如果读者觉得啰嗦,跳着看就好。
LVM概述
在CentOS 7中,默认安装了逻辑卷管理器LVM(Logical Volume Manager),LVM是一种用于管理和分配磁盘空间的逻辑卷管理器。它允许将多个实际物理磁盘或分区通过软件组合成一个或多个逻辑上的卷组(VG,Volume Group),并把这些卷组划分成逻辑卷(LV,Logical Volume),以便于实现动态磁盘分配、磁盘快照、备份和恢复等功能。
LVM最大的优点是它可以对底层物理卷进行抽象,将它们组合成更大的、更易管理的逻辑卷。使得管理员可以高效地管理存储设备和数据,而不必关心底层物理卷和分区的细节。
简单介绍一下LVM中几个基本的概念:
- 磁盘和分区:两者都是传统文件系统的概念。磁盘是指物理上安装在计算机上的大容量存储硬件设备。在操作系统中,磁盘通常被分成若干个分区。分区则是指在磁盘上按照特定标准进行的逻辑划分。
- PV(Physical Volume):也称物理卷,是LVM中的概念。PV是LVM中最底层的存储单元,它是对磁盘或者分区的一种抽象,由物理磁盘或分区构成。
- PE(Physical Extent):PE是物理卷上一个固定大小的地址单元,是LVM中最小的存储块,类似于文件系统的Block,当把一个PV添加到LVM卷组中时,PV会被划分为一个个的PE,并且所有PE的大小都是一样的,所以我们也说PV由多个PE组成。
- VG(Volume Group):也称逻辑卷组,是物理卷的逻辑集合,VG由一个或多个物理卷组成,管理员可以在上面创建逻辑卷。
- LV(Logical Volume):也称逻辑卷,最终VG会被划分成多个LV,用于在其上部署文件系统或提供存储空间。LV的大小取决于这个LV中包含的PE个数相关。
- File System:文件系统建立在LV之上,是应用程序和用户访问数据的接口。
由于VG是由多个物理磁盘或分区构成的逻辑上的大磁盘,就有可能会涉及到一个VG包含多个物理分区的情况。这种情况下有两种写入机制:
- 线性模式(linear):先写一个分区,等这个分区容量用完后,再写另一个分区。
- 交错模式(triped):将一条数据拆分成多部分,分别写入多个分区。优点是读写性能会更好,但是这个模式有一个致命的缺点,就是当任何一个分区出现故障的时候,所有的数据都会损坏。
由于LVM主要用途不是提高读写性能,而是弹性调整文件系统容量,故默认使用的是线性模式进行读写。
查看当前情况
在执行对/home
目录的扩容操作之前,先查看一下系统上和磁盘分区相关的情况,便于与各个操作结果进行对比。
物理卷(PV)
使用pvdisplay
命令,可以很详细的列出系统上面每个PV的信息。系统默认只有一个物理卷。
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sdb1
VG Name centos
PV Size <50.00 GiB / not usable 3.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 12799
Free PE 0
Allocated PE 12799
PV UUID y0IfVt-JLed-Gm0o-RWGl-iFhV-ERIQ-9je9sO
逻辑卷组(VG)
使用vgdisplay
命令查看当前逻辑卷组情况,系统默认只有一个逻辑卷组,名为centos。
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 1
Act PV 1
VG Size <99.00 GiB
PE Size 4.00 MiB
Total PE 25343
Alloc PE / Size 25342 / 98.99 GiB
Free PE / Size 1 / 4.00 MiB
VG UUID S3uBoZ-2c1M-KsuU-fv6h-8gs4-iG5r-4DUgT2
逻辑卷(LV)
使用lvdisplay
命令查看当前逻辑卷情况,系统默认有三个逻辑卷,分别是swap,home和root,并且这三个逻辑卷都是从名为centos的逻辑卷组中划分出来的。
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID cbKSxr-Ajpp-lYPY-6yeV-DOn0-NEmu-oH9drf
LV Write Access read/write
LV Creation host, time localhost, 2023-03-27 10:05:54 -0400
LV Status available
# open 1
LV Size 50.00 GiB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/centos/home
LV Name home
VG Name centos
LV UUID OfFtq3-BwzS-6jq1-Q1Zh-rIVs-yYJl-NAl1Wr
LV Write Access read/write
LV Creation host, time localhost, 2023-03-27 10:05:55 -0400
LV Status available
# open 1
LV Size 46.99 GiB
Current LE 12030
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID ILKtGQ-RsiZ-XQPY-MIcT-bcGe-u8QI-cY7cBV
LV Write Access read/write
LV Creation host, time localhost, 2023-03-27 10:05:56 -0400
LV Status available
# open 2
LV Size 2.00 GiB
Current LE 512
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
所有磁盘分区
使用fdisk -l
命令可以列出系统上所有的硬盘分区信息,包括磁盘、分区、分区类型等。
[root@localhost ~]# fdisk -l
Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 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: 0x000ab800
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 209715199 103808000 8e Linux LVM
Disk /dev/mapper/centos-root: 53.7 GB, 53687091200 bytes, 104857600 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 /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 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 /dev/mapper/centos-home: 50.5 GB, 50457477120 bytes, 98549760 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
从上面的结果中可以看出,我系统中有一块磁盘和三块虚拟磁盘。
物理磁盘名为/dev/sda
,容量为107.4GB,磁盘上一共有两个分区,分别是/dev/sda1
和/dev/sda2
。其中/dev/sda1用来存放开机引导,文件系统类型是Linux(类型ID为83),/dev/sda2
用来存放数据,文件系统类型是LVM类型(类型ID为8e)。
Linux会将逻辑卷视为虚拟磁盘,并且会命名为/dev/mapper/<vg name>-<lv name>
,由于我VG名称是centos,三个LV的名称分别是root、swap和home,所以出现了三个虚拟磁盘。
磁盘可用空间
使用df- h
命令查看磁盘当前可用空间和挂载情况。
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
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 50G 1.3G 49G 3% /
/dev/sda1 1014M 150M 865M 15% /boot
/dev/mapper/centos-home 47G 33M 47G 1% /home
tmpfs 184M 0 184M 0% /run/user/0
从以上结果可以看出我们的目录/home
的使用空间还剩下47G,目录/
的使用空间还剩下49G。
开机自动挂载设置
使用cat /etc/fstab
查看开机自动挂载设置。
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Mar 27 10:05:57 2023
#
# 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=9b7b67ce-7f53-4f3f-8063-cc1b1538fe45 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
当系统启动时,会根据/etc/fstab
文件中的信息自动挂载文件系统。该文件描述了系统中文件系统的挂载信息。每一行对应一个文件系统,其中第一列指定了该文件系统所在的设备(可以是设备文件名、UUID 等),第二列指定了该文件系统挂载的目录,后面的选项包括文件系统类型、挂载选项等。
从以上结果可以看出开机的时候自动按照先后顺序挂载了4个文件系统。其中/
目录是所有其他目录和文件系统的父目录,最先被挂载。 /boot
目录则是用于存放引导程序等启动信息,在/
目录之后挂载。
方案概述
其实仔细想想,无非就两个方案可以选择:
- 添加硬盘后,将新硬盘创建PV后,直接让这个PV添加到
/home
目录所属的VG,对VG进行扩容。再将VG中扩容的空间划分为/home
目录所属的LV,进而同步文件系统大小为LV扩容后的大小,以此来对/home
目录扩容。 - 添加硬盘后,新硬盘创建一个新的VG,并在这个VG上创建新的LV和文件系统,然后将
/home
目录所有文件迁移到新的文件系统中,然后删除原来的/home
所属的LV,将删除出来的空间划分到根目录/
中,进而对/
也进行了扩容。
这两个方案没有绝对的好坏,看个人需要,如果说需要同时对/进行扩容,可以采用方案二,就是更麻烦一些,否则可以采用方案一,简单快捷。
我这里对两个方案都演示一下。两个方案有些步骤是公共的,但是为了便于阅读,不用跳来跳去,相同的地方我就直接复制粘贴过去了。
方案一
添加硬盘
关闭系统后,添加一块100G的硬盘上来,再次使用fdisk -l查看磁盘信息,此时会发现会发现结果中多了一项:
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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
这个/dev/sdb就是我们新加进去的磁盘,大小是50GB,我们后续就打算用这块硬盘对/home目录扩容。
备份home目录
这个方案对/home
目录的文件没有影响,但是数据无价,以防万一还是备份一下,直接使用tar
命令对/home
目录进行压缩即可。
cd /
tar -zcvf home.tar.gz home
对新硬盘进行分区
为了可以使用这个磁盘,我们需要使用fdisk /dev/sdb
命令对/dev/sdb
进行分区,分区过程如下所示:
[root@localhost ~]# 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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x45cc02e1.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-104857599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-104857599, default 104857599):
Using default value 104857599
Partition 1 of type Linux and of size 50 GiB is set
Command (m for help): p
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 83 Linux
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
从上面的流程中,我们首先使用了n这个命令进行新建分区,新建分区的时候需要我们选择是创建主分区还是拓展分区,默认是主分区,所以我们直接回车即可;之后需要我们输入分区号,默认值是1,我们也直接回车;然后需要我们选择创建分区的起始扇区位置和结束扇区的位置,默认是2048和104857599,我们也直接回车使用默认值即可。
之后输入p命令,会发现已经有一个分区了,但是它的分区标识符是83,如果我们要使用LVM技术进行逻辑卷管理的话,还需要将这个分区的系统标识符修改为8e(Linux LVM分区类型),所以我们使用了t命令。系统会要求我们输入想修改的标识符的十六进制,这里使用了L进行查看所有的系统标识符,可以看到其中就有8e,于是我们输入8e即可。
再次使用p命令,会发现这个分区已经被修改为8e了,达到我们的目的了,于是输入w进行保存分区设置即可。
注意有的时候保存的时候会提示重新读取分区表失败,WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.
这是因为这个分区还在被使用,我们可以选择重启系统,或者使用partprobe
命令进行重新加载内核中的分区表,从而使系统能够检测到在运行时创建、更改或删除的分区。
使用fdisk -l
命令再次查看系统中所有的磁盘分区,发现新的磁盘分区已经创建好了。
[root@localhost ~]# fdisk -l
…………
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 8e Linux LVM
…………
创建物理卷(PV)
执行如下命令,创建新的PV卷
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
创建完成后,可以使用pvdisplay
命令查看现在的PV情况
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <99.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25343
Free PE 1
Allocated PE 25342
PV UUID M6czwP-Y8my-8en4-j9L4-yQZe-6uiQ-suloeN
"/dev/sdb1" is a new physical volume of "<50.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size <50.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID y0IfVt-JLed-Gm0o-RWGl-iFhV-ERIQ-9je9sO
新PV加入HOME所在的VG
使用vgextend
命令,将/dev/sdb1
这个PV加入名称为centos的VG。
[root@localhost ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
加入完成后,可以使用vgdisplay
命令查看加入结果,从结果中可以看到centos这个VG的Free PE的个数和大小都不是最开始的值了。
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 3
Open LV 3
Max PV 0
Cur PV 2
Act PV 2
VG Size 148.99 GiB
PE Size 4.00 MiB
Total PE 38142
Alloc PE / Size 25342 / 98.99 GiB
Free PE / Size 12800 / 50.00 GiB
VG UUID S3uBoZ-2c1M-KsuU-fv6h-8gs4-iG5r-4DUgT2
对Home所在LV扩容
使用lvextend 命令,将名称为centos的VG里面的所有剩余空间全部分配给Home所在的LV。
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/home
Size of logical volume centos/home changed from 46.99 GiB (12030 extents) to 96.99 GiB (24830 extents).
Logical volume centos/home successfully resized.
执行完成后,可以使用lvdisplay
命令查看加入结果,会发现/dev/centos/home
这个LV的大小从46.99 GiB变成了96.99 GiB了。
[root@localhost ~]# lvdisplay
…………
--- Logical volume ---
LV Path /dev/centos/home
LV Name home
VG Name centos
LV UUID OfFtq3-BwzS-6jq1-Q1Zh-rIVs-yYJl-NAl1Wr
LV Write Access read/write
LV Creation host, time localhost, 2023-03-27 10:05:55 -0400
LV Status available
# open 1
LV Size 96.99 GiB
Current LE 24830
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
…………
同步文件系统大小
扩展了逻辑卷的大小,文件系统的大小并不会自动调整,我们还需要使用xfs_growfs
命令将文件系统将其大小增加到匹配已经扩展的逻辑卷的大小,这样才能让文件系统与逻辑卷大小的一致。
[root@localhost ~]# xfs_growfs /dev/centos/home
meta-data=/dev/mapper/centos-home isize=512 agcount=4, agsize=3079680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=12318720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6015, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 12318720 to 25425920
之后再次使用df -h
命令,可以看到/dev/mapper/centos-home
的可用空间变大了,此时扩容就算真正完成了。
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
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 50G 1.3G 49G 3% /
/dev/sda1 1014M 150M 865M 15% /boot
/dev/mapper/centos-home 97G 33M 97G 1% /home
tmpfs 184M 0 184M 0% /run/user/0
方案二
添加硬盘
关闭系统后,添加一块100G的硬盘上来,再次使用fdisk -l
命令查看磁盘信息,此时会发现会发现结果中多了一项:
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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
这个/dev/sdb就是我们新加进去的磁盘,大小是50GB。我们后续就打算用这块硬盘对/home目录扩容。
备份home目录
由于这个方案需要删除/home
所在的整个lv,因此务必备份好数据,数据无价。
cd /
tar -zcvf home.tar.gz home
umount /home
上面的命令对/home
进行了备份,备份完毕后取消了/home
目录的挂载,操作完成后再次查看,/home
目录这个挂载点确实不见了。
[root@localhost ~]# 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 8.9M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 1.3G 49G 3% /
/dev/sda1 1014M 150M 865M 15% /boot
tmpfs 379M 0 379M 0% /run/user/0
对新硬盘进行分区
为了可以使用这个磁盘,我们需要使用fdisk /dev/sdb
命令对/dev/sdb
进行分区,分区过程如下所示:
[root@localhost ~]# 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.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x45cc02e1.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-104857599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-104857599, default 104857599):
Using default value 104857599
Partition 1 of type Linux and of size 50 GiB is set
Command (m for help): p
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 83 Linux
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): L
0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
1e Hidden W95 FAT1 80 Old Minix
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): p
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
从上面的流程中,我们首先使用了n这个命令进行新建分区,新建分区的时候需要我们选择是创建主分区还是拓展分区,默认是主分区,所以我们直接回车即可;之后需要我们输入分区号,默认值是1,我们也直接回车;然后需要我们选择创建分区的起始扇区位置和结束扇区的位置,默认是2048和104857599,我们也直接回车使用默认值即可。
之后输入p命令,会发现已经有一个分区了,但是它的分区标识符是83,如果我们要使用LVM技术进行逻辑卷管理的话,还需要将这个分区的系统标识符修改为8e(Linux LVM分区类型),所以我们使用了t命令。系统会要求我们输入想修改的标识符的十六进制,这里使用了L进行查看所有的系统标识符,可以看到其中就有8e,于是我们输入8e即可。
再次使用p命令,会发现这个分区已经被修改为8e了,达到我们的目的了,于是输入w进行保存分区设置即可。
注意有的时候保存的时候会提示重新读取分区表失败,WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.
这是因为这个分区还在被使用,我们可以选择重启系统,或者使用partprobe
命令进行重新加载内核中的分区表,从而使系统能够检测到在运行时创建、更改或删除的分区。
使用fdisk -l
命令再次查看系统中所有的磁盘分区,发现新的磁盘分区已经创建好了。
[root@localhost ~]# fdisk -l
…………
Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 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: 0x45cc02e1
Device Boot Start End Blocks Id System
/dev/sdb1 2048 104857599 52427776 8e Linux LVM
…………
创建物理卷(PV)
执行如下命令,创建新的PV卷。
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
创建完成后,可以使用pvdisplay
命令查看现在的PV情况。
[root@localhost ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name centos
PV Size <99.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25343
Free PE 1
Allocated PE 25342
PV UUID M6czwP-Y8my-8en4-j9L4-yQZe-6uiQ-suloeN
"/dev/sdb1" is a new physical volume of "<50.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size <50.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID y0IfVt-JLed-Gm0o-RWGl-iFhV-ERIQ-9je9sO
创建逻辑卷组(VG)
使用vgcreate
命令,创建新的VG卷。
[root@localhost /]# vgcreate vghome /dev/sdb1
Volume group "vghome" successfully created
创建完成后,可以使用vgdisplay
命令查看现在的VG情况。
[root@localhost /]# vgdisplay
--- Volume group ---
VG Name vghome
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size <50.00 GiB
PE Size 4.00 MiB
Total PE 12799
Alloc PE / Size 0 / 0
Free PE / Size 12799 / <50.00 GiB
VG UUID 54kacw-3Tgn-6ti4-bJMB-jEqw-hmg7-eL9NYQ
…………
创建逻辑卷(LV)
使用lvcreate
命令,创建新的LV卷。
[root@localhost ~]# lvcreate -l +100%FREE -n lvhome vghome
Logical volume "lvhome" created.
创建完成后,可以使用lvdisplay
命令查看现在的PV情况。
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/vghome/lvhome
LV Name lvhome
VG Name vghome
LV UUID fwP3Rr-yVsp-8cds-zlmT-Qv2x-Sdwg-T06gZb
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-03-27 12:10:21 -0400
LV Status available
# open 0
LV Size <50.00 GiB
Current LE 12799
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
…………
格式化分区
执行mkfs.xfs
命令在刚刚创建的LV上创建一个关联于逻辑卷/dev/vghome/lvhome
的XFS文件系统,并将其格式化,这样才能用于挂载。格式化需要的时间比较久,我们耐心等待即可。
[root@localhost ~]# mkfs.xfs /dev/vghome/lvhome
Discarding blocks...Done.
meta-data=/dev/vghome/lvhome isize=512 agcount=4, agsize=3276544 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=13106176, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=6399, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
格式化完成后,我们便可以将刚刚的创建的文件系统挂载到目录/home
上,使其能够访问其中的数据
[root@localhost /]# mount /dev/vghome/lvhome /home
注意,挂载的是文件系统,而不是逻辑卷,执行mount /dev/vghome/lvhome /home
命令时,操作系统将把以/dev/vghome/lvhome
为标识的逻辑卷上的文件系统挂载到/home
目录中,从而使该文件系统的内容可以在/home
目录中被访问和操作。
挂载完成后,使用df -h
命令可以看到有/home
挂载点的可用空间刚刚好就是我们新硬盘的大小50G。
[root@localhost /]# df -h
Filesystem Size Used Avail Use% Mounted on
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 50G 1.3G 49G 3% /
/dev/sda1 1014M 150M 865M 15% /boot
tmpfs 184M 0 184M 0% /run/user/0
/dev/mapper/vghome-lvhome 50G 33M 50G 1% /home
还原数据
当上述步骤都确认没有问题了,就可以将之前备份的数据进行恢复了,直接使用tar
命令解压原来的压缩包即可。
tar -zxvf home.tar.gz
设置开机自动挂载
为了不用每次开机都再手敲一次mount /dev/vghome/lvhome /home
这个命令,需要设置一下开机启动挂载,只需要修改/etc/fstab
文件即可,最开始的文件内容如下所示。其中第一列指定了该文件系统所在的设备(可以是设备文件名、UUID 等),第二列指定了该文件系统挂载的目录,后面的选项包括文件系统类型、挂载选项等。
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Mar 27 10:05:57 2023
#
# 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=9b7b67ce-7f53-4f3f-8063-cc1b1538fe45 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
根据需求,我们需要注释掉原来的/home
目录的挂载,并在下面新增一行,将我们最新的/home
目录的挂载信息按照原来的格式写入即可。
修改后的文件内容为:
#
# /etc/fstab
# Created by anaconda on Mon Mar 27 10:05:57 2023
#
# 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=9b7b67ce-7f53-4f3f-8063-cc1b1538fe45 /boot xfs defaults 0 0
# /dev/mapper/centos-home /home xfs defaults 0 0
/dev/vghome/lvhome /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
修改完成后,我们先使用umount
命令取消一下/home
目录的挂载
umount /home
之后再使用mount -a
命令,对/etc/fstab
中未被挂载的文件系统进行挂载
mount -a
注意:mount -a
命令会在系统启动时自动执行。因此如果执行mount -a
命令的时候报错了,那说明/etc/fstab
文件中的配置信息有误,此时千万不能重启系统,否则会导致系统无法正常启动。请修改文件后直到mount -a
命令可以正常执行不会报错为止。
之后再次使用df -h
命令,可以看到刚刚被取消挂载的/home
目录又回来了,就说明我们配置正确了。
删除旧LV
当/home
目录正常扩容完成后,我们就可以删除之前给/home
目录使用的旧LV了。
删除之前请重启一下系统,让系统解除对旧的LV的和文件系统的引用,否则容易出现一些非预期的问题。例如明明删除的是/home
目录的旧LV,为什么/home
目录使用的新LV的挂载信息丢失了,而且怎么也挂载不了了?其实这些问题重启一下就恢复了。但是我之前就因为这个踩坑耗了很久时间。
重启系统完成后,就可以放心的使用lvremove
命令删除旧LV了。
[root@localhost ~]# lvremove /dev/centos/home
Do you really want to remove active logical volume centos/home? [y/n]: y
Logical volume "home" successfully removed
再次使用lvdisplay
命令,就会发现旧LV消失了。
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/swap
LV Name swap
VG Name centos
LV UUID vZC9CZ-kgo2-d3r9-38OU-neOZ-Mpl9-0w9Z1F
LV Write Access read/write
LV Creation host, time localhost, 2023-03-21 21:10:15 -0400
LV Status available
# open 2
LV Size <3.88 GiB
Current LE 992
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:1
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV UUID OHYL6W-M6Zy-SXbD-wFpe-TsVu-rfpm-yZA5OI
LV Write Access read/write
LV Creation host, time localhost, 2023-03-21 21:10:15 -0400
LV Status available
# open 1
LV Size 50.00 GiB
Current LE 12800
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
--- Logical volume ---
LV Path /dev/vghome/lvhome
LV Name lvhome
VG Name vghome
LV UUID 9MYMPY-fns6-n52W-oouJ-FJx6-tFbU-kK4gOX
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2023-03-27 00:57:36 -0400
LV Status available
# open 1
LV Size <100.00 GiB
Current LE 25599
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
空余空间扩容给ROOT
删除LV后,旧的VG就会存在多余空间了,为了更好的利用起来,我们可以用这些空间给/目录扩容,由于/
目录挂载的/dev/centos/root
这个LV,所以我们直接使用lvextend
对这个LV扩容即可。
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root
Size of logical volume centos/root changed from 50.00 GiB (12801 extents) to <97.00 GiB (24831 extents).
Logical volume centos/root successfully resized.
同步文件系统大小
扩容后,还需要使用xfs_growfs
进行同步文件系统大小,否则这些多余的空间不能被系统利用起来。
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512 agcount=5, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=13108224, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 13108224 to 25426944
文件系统扩容完成后,再次使用df -h
命令,可以看到/
目录的可用空间已经从49G变成了96G了
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
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 97G 1.3G 96G 2% /
/dev/sda1 1014M 150M 865M 15% /boot
/dev/mapper/vghome-lvhome 50G 33M 50G 1% /home
tmpfs 184M 0 184M 0% /run/user/0
原创文章,创作不易,版权所有,抄袭必究
作者:幽叶草。如若转载,需要先经过作者同意,并附上原文链接 https://blog.uusite.com/system/linux/370.html
评论列表(1条)
谢谢分享!