# Linux 修改磁盘分区

# 背景

最近,在编译打包镜像的老是会失败,查看jenkins编译日志,发现是磁盘空间不足导致的。报错日志如下:

#14 97.58 go: failed to trim cache: open /root/.cache/go-build/trim.txt: no space left on device
------
Dockerfile:41
--------------------
  39 |     
  40 |     # 编译项目可执行文件,并压缩生成的二进制文件
  41 | >>> RUN go build -ldflags="-s -w" -o api/bin/main api/main.go
  42 |     
  43 |     # 容器运行镜像为alpine
--------------------
ERROR: failed to solve: process "/bin/sh -c go build -ldflags=\"-s -w\" -o api/bin/main api/main.go" did not complete successfully: exit code: 1
Build step 'Execute shell' marked build as failure
Finished: FAILURE

之前发生过一次磁盘空间不足,当时的处理方案是使用定时脚本每天凌晨清理掉之前产生的docker build缓存层。命令如下:

echo 'Y' | docker buildx prune --keep-storage 10GB > /tmp/docker_prune.log 2>&1

上面的命令会保留最近10GB的缓存,其余的缓存都会被清理掉。但是,现在还是出现了磁盘空间不足的问题,所以需要重新考虑一下磁盘空间不足的解决方案。

# 解决方案

# 1. 查看磁盘空间

首先,我们需要查看一下磁盘空间的使用情况,使用df命令可以查看磁盘空间的使用情况。命令如下:

df -h

输出结果如下:

[root@harbor ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 3.9G     0  3.9G    0% /dev
tmpfs                    3.9G     0  3.9G    0% /dev/shm
tmpfs                    3.9G  117M  3.8G    3% /run
tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   49G  1.7G  97% /
/dev/sda1               1014M  154M  861M   16% /boot
/dev/mapper/centos-home  441G   33M  441G    1% /home
......

从上面的输出结果可以看出,根分区/dev/mapper/centos-root已经使用了97%的空间,而/dev/mapper/centos-home分区还有441G的空间可用。因此我们可以将dev/mapper/centos-home分区中的部分空间划分出来分配给/dev/mapper/centos-root分区。

# 2. 划分分区

# 2.1 备份数据

在开始操作之前,我们首先需要备份/dev/mapper/centos-home分区中的数据。

# 2.2 检查 LVM 配置

使用lvdisplay命令检查 LVM 配置,确认/dev/mapper/centos-home分区是否已经挂载到 LVM 上。命令如下:

lvdisplay

输出结果如下:

[root@harbor ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/centos/root
  ......
  # open                 1
  LV Size                50.00 GiB
  ......
   
  --- Logical volume ---
  LV Path                /dev/centos/home
  ......
  # open                 1
  LV Size                <441.12 GiB
  ......
   
  --- Logical volume ---
  LV Path                /dev/centos/swap
  ......
  # open                 0
  LV Size                <7.88 GiB
  ......

# 2.3 调整分区大小

首先减少 /dev/mapper/centos-home 分区的大小。

[root@harbor ~]# lvreduce -L -200G /dev/centos/home
  WARNING: Reducing active and open logical volume to <241.12 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce centos/home? [y/n]: y
  Size of logical volume centos/home changed from <441.12 GiB (112926 extents) to <241.12 GiB (61726 extents).
  Logical volume centos/home successfully resized.

然后,扩展 /dev/mapper/centos-root 分区的大小。

[root@harbor ~]# lvextend -L +200G /dev/centos/root
  Size of logical volume centos/root changed from 50.00 GiB (12800 extents) to 250.00 GiB (64000 extents).
  Logical volume centos/root successfully resized.
[root@harbor ~]# 

这个时候我们查看一下分区情况

[root@harbor ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 3.9G     0  3.9G    0% /dev
tmpfs                    3.9G     0  3.9G    0% /dev/shm
tmpfs                    3.9G  117M  3.8G    3% /run
tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   49G  1.7G  97% /
/dev/sda1               1014M  154M  861M   16% /boot
/dev/mapper/centos-home  441G   33M  441G    1% /home

会发现刚才的修改并没有生效,这是因为我们在修改完逻辑卷之后还没有将修改应用到文件系统上。我们需要重新调整文件系统的大小。

# 2.4 调整文件系统大小

首先我们需要查看文件系统的类型。

[root@harbor ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  3.9G     0  3.9G    0% /dev
tmpfs                   tmpfs     3.9G     0  3.9G    0% /dev/shm
tmpfs                   tmpfs     3.9G  117M  3.8G    3% /run
tmpfs                   tmpfs     3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   50G   49G  1.7G  97% /
/dev/sda1               xfs      1014M  154M  861M   16% /boot
/dev/mapper/centos-home xfs       441G   33M  441G    1% /home

文件系统类型是XFS。因此我们可以使用xfs_growfs命令来调整文件系统的大小。

[root@harbor ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=13107200, 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 13107200 to 65536000

如果文件系统类型是ext4,我们可以使用resize2fs命令来调整文件系统的大小。

[root@harbor ~]# resize2fs /dev/mapper/centos-root

到这里我们已经调整完了磁盘空间,后面编译docker镜像的时候就不会出现空间不足的问题了。