Centos7添加新硬盘后使用LVM对/home目录扩容

安装新系统后,可能最开始分配的空间是够用的,但是随着业务或者需求的增长,原来的空间渐渐地捉襟见肘了,此时就需要考虑对空间进行扩容,这篇文章主要是记录之前对使用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目录则是用于存放引导程序等启动信息,在/目录之后挂载。

方案概述

其实仔细想想,无非就两个方案可以选择:

  1. 添加硬盘后,将新硬盘创建PV后,直接让这个PV添加到/home目录所属的VG,对VG进行扩容。再将VG中扩容的空间划分为/home目录所属的LV,进而同步文件系统大小为LV扩容后的大小,以此来对/home目录扩容。
  2. 添加硬盘后,新硬盘创建一个新的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进行保存分区设置即可。

使用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进行保存分区设置即可。

使用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

挂载完成后,使用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

之后再次使用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

(2)
幽叶草的头像幽叶草
上一篇 2023年3月19日 上午9:24
下一篇 2023年3月31日 上午3:06

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • jiang
    jiang 2023年12月22日 下午2:52

    谢谢分享!