# 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
镜像的时候就不会出现空间不足的问题了。