1. 前言

以UEFI模式安装CentOS 7时,默认会划出几个分区:

  • /boot:xfs
  • /boot/efi:vfat
  • /:lvm+xfs
  • /home:lvm+xfs
  • /swap:lvm+swap

其中前两个分区大小固定,只用于存放用于启动系统的相关内核文件,后三个分区默认使用lvm逻辑卷。

lvm是内核块设备和物理设备之间的一个抽象层,可以将多块物理磁盘组合起来形成一个存储池,也支持不停机的情况下动态调整逻辑卷大小。

笔者自用的VPS和开发机一般都直接使用root账号,root账户文件、默认软件安装位置、docker镜像等也存储在根分区下,因为根分区空间告急,于是尝试了下删除无用逻辑卷并扩容根分区,调整后的结果如下:

 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
➜  ~ lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0              11:0    1  1024M  0 rom
sda               8:0    0   512G  0 disk
├─sda2            8:2    0     1G  0 part /boot
├─sda3            8:3    0 510.8G  0 part
│ └─centos-root 253:0    0 510.8G  0 lvm  /
└─sda1            8:1    0   200M  0 part /boot/efi
➜  ~ df -Th
Filesystem              Type      Size  Used Avail Use% Mounted on
devtmpfs                devtmpfs  7.9G     0  7.9G   0% /dev
tmpfs                   tmpfs     7.9G     0  7.9G   0% /dev/shm
tmpfs                   tmpfs     7.9G  8.5M  7.9G   1% /run
tmpfs                   tmpfs     7.9G     0  7.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       511G   12G  499G   3% /
tmpfs                   tmpfs     7.9G  4.0K  7.9G   1% /tmp
/dev/sda2               xfs      1014M  125M  889M  13% /boot
/dev/sda1               vfat      200M   12M  189M   6% /boot/efi
tmpfs                   tmpfs     1.6G     0  1.6G   0% /run/user/0
➜  ~ cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Mon Jun 24 22:51:30 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=3e56effb-dcb3-4af5-ba4f-fb4ecda29738 /boot                   xfs     defaults        0 0
UUID=36E8-0DB4          /boot/efi               vfat    umask=0077,shortname=winnt 0 0

2. 操作步骤

2.1 home分区卸载与备份

笔者的home目录中无数据,因此跳过备份,如果有相关程序使用home目录,也需要先关闭。

执行以下命令卸载/home分区

1
umount /home

2.2 swap分区关闭与卸载

这里直接关闭掉swap分区,后续有需要时使用swap文件代替。

1
2
swapoff -a
umount /swap

2.3 /etc/fstab 修改

/etc/fstab 文件中保存着开机时相关分区的挂载配置,编辑该文件,删除掉home目录与swap分区的挂载配置。

2.4 lvm删除与扩容

使用lvs命令获取逻辑卷信息

1
2
3
4
5
➜  ~ lvs
  LV   VG     Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root centos -wi-ao---- <100.0g
  home centos -wi-ao---- <400.0g
  swap centos -wi-ao---- <10.8g

删除home与swap逻辑卷

1
2
lvremove /dev/mapper/centos-home
lvremove /dev/mapper/centos-swap

根分区逻辑卷扩容,分配所有空闲空间

1
lvresize -l +100%FREE /dev/mapper/centos-root

2.5 xfs扩容

lvm卷扩容后还需要执行xfs扩容,才能使用新分配的空间

1
xfs_growfs /dev/mapper/centos-root

2.6 配置同步

1
dracut --regenerate-all --force

3. 非LVM模式的分区扩容

使用官方镜像安装到物理机时,默认会使用LVM,通常稀里糊涂的一路下来就使用了LVM。但是使用VPS或者官方提供的Cloud镜像等面向虚拟化的场景时,就不会启用LVM了,这个时候需要手动分区,使用 fdisk 删除无用的分区,再进行扩容。

3.1 获取分区信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜  ~ fdisk -l
Disk /dev/vda: 23.6 GB, 23622320128 bytes, 46137344 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: 0x000958c2
23067648
   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    46069375    23033664   83  Linux
/dev/vda2        46069376    46134911       32768   82  Linux swap / Solaris

可以看到 /dev/vda 被划分为两个分区,由于存储空间是连续的,我们可以直接删除两个分区后重建分区。

3.2 分区删除与重建

 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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
➜  ~ fdisk /dev/vda                                                                      
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.                                               
                                                                                                                                                     
Command (m for help): p                                                                  
                                                                                         
Disk /dev/vda: 23.6 GB, 23622320128 bytes, 46137344 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: 0x000958c2                                                              
                                                                                         
   Device Boot      Start         End      Blocks   Id  System                           
/dev/vda1   *        2048    46069375    23033664   83  Linux                            
/dev/vda2        46069376    46134911       32768   82  Linux swap / Solaris             
                                                                                         
Command (m for help): d                                                                  
Partition number (1,2, default 2): 2                                                     
Partition 2 is deleted                                                                   
                                                                                         
Command (m for help): d                                                                  
Selected partition 1                                                                     
Partition 1 is deleted                                                                                                                                                                                               
Command (m for help): p                                                                  
                                                                                         
Disk /dev/vda: 23.6 GB, 23622320128 bytes, 46137344 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: 0x000958c2                                                              
                                                                                         
   Device Boot      Start         End      Blocks   Id  System                           
                                                                                         
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-46137343, default 2048):                                              
Using default value 2048                                                                 
Last sector, +sectors or +size{K,M,G} (2048-46137343, default 46137343):                 
Using default value 46137343                                                             
Partition 1 of type Linux and of size 22 GiB is set                                      
                                                                                         
Command (m for help): w                                                                  
The partition table has been altered!                                                    
                                                                                         
Calling ioctl() to re-read partition table.                                              
                                                                                         
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 or after you run partprobe(8) or kpartx(8)                               
Syncing disks.                                                                                                                                            
➜  ~ lsblk                                                                               
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT                                               
sr0     11:0    1 1024M  0 rom                                                           
vda    253:0    0   22G  0 disk                                                          
├─vda2 253:2    0   32M  0 part                                                          
└─vda1 253:1    0   22G  0 part /  

操作过程都在日志中,我们首先删除了两个分区,然后从vda1起始扇区开始,分配全部空间。

扩容后,由于系统仍旧缓存着老分区表,执行 lsblk 会发现还存在两个分区,重启后才会同步。

3.3 ext4扩容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
➜  ~ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0     11:0    1 1024M  0 rom
vda    253:0    0   22G  0 disk
└─vda1 253:1    0   22G  0 part /
➜  ~ resize2fs /dev/vda1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vda1 is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 3
The filesystem on /dev/vda1 is now 5766912 blocks long.
➜  ~ fdisk -l

Disk /dev/vda: 23.6 GB, 23622320128 bytes, 46137344 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: 0x000958c2

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1            2048    46137343    23067648   83  Linux

重启后会发现vda2消失了,只剩下vda1,这里使用的是ext4文件系统,需要执行 resize2fs 命令扩容文件系统。

整个步骤跟LVM模式扩容类似,但操作起来的风险就大了很多,这种情况只适用于同一磁盘上的分区扩容,而LVM可以实现不停机的跨物理盘扩容。