前言
服务器Centos操作系统,空间不足的问题处理了三次了,决定把它的解决思路和处理过程记录下来。服务器空间不足是一个经常会遇到的问题,尤其是在大型应用程序和网站上。当服务器空间不足时,应该采取一些步骤来处理和解决这个问题。以下记录最近这次的解决方案和思路(原因:docker占用空间太大了)
现象
服务器空间不足会导致以下一些现象:
- 应用程序无法运行:当服务器空间不足时,某些应用程序可能会无法正常启动或运行,因为这些程序需要在硬盘上读取或写入数据。
- 文件上传失败:如果服务器的空间已经耗尽,用户可能会无法上传文件,因为没有足够的空间可供存储。
- 数据库出错:当服务器空间不足时,数据库可能会出现错误,因为数据库需要写入和读取数据到磁盘上。
- 日志文件无法写入:当服务器空间不足时,系统和应用程序的日志文件可能无法写入,这将使得故障排查和系统运行监控变得困难。
- 系统崩溃:如果服务器的空间不足并且无法处理数据和任务,可能会导致系统崩溃或宕机。
因此,保持足够的服务器空间是确保服务器运行稳定和高效的重要因素。
解决过程
一、服务器空间不足问题定位
- 登录服务器 ,可以通过运行一些命令,如
df -h
和du -h
来检查服务器上的磁盘使用情况,查看哪些目录或文件夹占用了大量的空间。
1 [root@luntek tmp]# df -h
2 Filesystem Size Used Avail Use% Mounted on
3 devtmpfs 7.8G 0 7.8G 0% /dev
4 tmpfs 7.8G 0 7.8G 0% /dev/shm
5 tmpfs 7.8G 827M 7.0G 11% /run
6 tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
7 /dev/vda1 40G 38G 0 100% /
8 /dev/vdb 656G 154G 469G 25% /mnt
9 tmpfs 1.6G 0 1.6G 0% /run/user/0
10 overlay 40G 38G 0 100% /var/lib/docker/overlay2/0e4870d22fb 1c79fd3c0b8ad2023475715a5a56c05b1900de76070d0a80e3001/merged
11 overlay 40G 38G 0 100% /var/lib/docker/overlay2/cd5f647aa8a eede41e2642d56dd346632718c8bc9b07e7bbd7f1cc6dcdea23b6/merged
12 overlay 40G 38G 0 100% /var/lib/docker/overlay2/f7eb94f2fd3 c4b37de3538f965ce64833b5b69a59616ef317833c7039ef5da78/merged
13 overlay 40G 38G 0 100% /var/lib/docker/overlay2/da95b27c0e8 25567df0e483f0c5bb2ba58768604c867b4ceb45928beeef015f2/merged
14 overlay 40G 38G 0 100% /var/lib/docker/overlay2/4fea6e878f2 f317a63d124c2a3831cd9b8ffcdd0bb249b73b39d92adc7d555eb/merged
15 overlay 40G 38G 0 100% /var/lib/docker/overlay2/b910801159c 76ffe6ae68c5596aa13994ff5e9d2eebd2e1febb147b3b10cd2ac/merged
16 overlay 40G 38G 0 100% /var/lib/docker/overlay2/ef09bb54935 3ca0af146aa854b48d7757407cb7429deae1e20e107f40b78796e/merged
17 overlay 40G 38G 0 100% /var/lib/docker/overlay2/d1b236f57e4 09d49d0d7ef0ecf21c3d684ed8317bb88ef530907c4c4e5e57799/merged
18 overlay 40G 38G 0 100% /var/lib/docker/overlay2/ae369ee56f0 8206507b53cb29cbc32e88198f9d38ba1331636a7970a338f30ad/merged
19 overlay 40G 38G 0 100% /var/lib/docker/overlay2/3f84613ee8d b82cf00fc2883b9e31b42766a5d7d1cc910f2a7b9fce6cf74c435/merged
20 overlay 40G 38G 0 100% /var/lib/docker/overlay2/6e2272faed5 9954f4a29f60a0ba6618eede5ccaad24ff79385d98cd2e7c3d0da/merged
21 overlay 40G 38G 0 100% /var/lib/docker/overlay2/3c8f75522e7 2d64eb20b4656cbd11358581a61619ad209f788f3eac03ce0ed15/merged
22 overlay 40G 38G 0 100% /var/lib/docker/overlay2/832ed62f362 edd6d0350828aac3aad454a5dc1679a435d3be0e8efd60e6d25b2/merged
23 overlay 40G 38G 0 100% /var/lib/docker/overlay2/d96561964a2 015583c62329eac1587c3ff4b0a962ed9d30a2dd47609c3cfcc67/merged
24 shm 64M 0 64M 0% /var/lib/docker/containers/dd2e19f40 abcfafe515db471ab89735b79e05b1ca5e97ede16e9074cd53d35a6/mounts/shm
25 shm 64M 0 64M 0% /var/lib/docker/containers/23a9c891d cc3696c294fa9b2867ac96eda72b1422ffb6bc1527c2f00d5ec7f15/mounts/shm
26 shm 64M 0 64M 0% /var/lib/docker/containers/833eae2de d2733e5b3daddc1bcae9ea7ba943e1a1a2bc421d1119265db45fa80/mounts/shm
27 shm 64M 0 64M 0% /var/lib/docker/containers/7ae786e73 c5cd21c8a00d531f73902374150cbb8d6a3a10139324b9924375900/mounts/shm
...
- 抓住主要的物理设备,不用关心其他逻辑设备, 物理设备⼀般挂载在/dev目录下
/dev/vda1 40G 38G 0 100% /
/dev/vdb 656G 154G 469G 25% /mnt
观察到/
根目录空间已经使用100%, 虽然名义上还有2G空间 ,但是这些空间可能是被内存交换分区占 用 ,所以不用拘泥于具体数字, 如果出现100%即可以确认。
注意
:如果设备空间严重不足, 可能会导致正常命令⾏也无法执⾏, 此时可以先试试下面的释放空间思路
二、释放空间
- 首先最安全的可以释放的空间往往在
/home
目录下,在一般情况下,用户上传的临时文件和安装包等往往会存储在/home目录下,因此这些文件可以首先被删除或转移到其他有空间的分区中来释放空间。但是需要注意的是,如果这些文件是某些应用程序的必要文件,删除可能会导致应用程序无法正常运行,因此在删除前需要进行确认。此外,如果/home目录下存在用户的个人数据(例如文档、音乐、图片等),则不应该轻易删除或转移这些文件,而应该寻找其他的空间释放方案。 /md
目录下的一些文件可能可以删除,但是有一些文件可能记录了当前正在运行的进程的登录和临时状态数据,如果不熟悉这些服务,不建议删除这些文件。- 可以通过清理无用的文件和目录,以及删除过期的日志和备份文件来释放空间。另外,可以通过压缩和归档文件来减少文件占用的磁盘空间。在释放空间之前,需要确保不会误删除重要的文件和目录。
- 重启一些进程和常见的服务,可以释放掉这些进程所生成的临时文件占用的空间。在重启之后,这样做可以基本保证会有一定的磁盘空间回收。
- 清理无用的进程镜像或者删除的
Docker
容器。 - 清理进程的缓存,可以运行进程的系统命令,清除所有未被使用的对象(包括镜像、容器、网络和卷),以及所有未标记的镜像和构建缓存。这可以帮助释放更多的磁盘空间。
三、分析空间占用的原因
使用du
命令来逐层分析文件夹所占用的空间大小。其中,-d 1
表示只分析当前目录下的一级子目录,-h
表示以易读的方式显示结果(例如使用KB、MB等单位),-p L
表示只分析L级子目录,而-u
则表示使用M来显示结果,即以MB为单位。
du -d 1 -h
例如 ,从上述分析看到, 目录/var/docker/overlay2
⼀个目录就占用了28G
,Docker Overlay2
是⼀种容器存储驱动程序,它使用了⼀个特殊的文件系统来管理Docker容器和镜像的存储 。Overlay2
驱动程序将多个镜像层堆叠在⼀起,以便对这些层进行读取和写⼊操作时只需要查找最上面的层 。因此 ,在使用Overlay2
驱动程序时,Docker会为每个容器创建⼀个单独的目录,该目录包含容器所需的所有文件系统内容。
分析结果
:这基本上无解了,不能删除Overlay2
文件夹释放空间,此时所能做的就只能是把docker安装环境移到有空间的/mnt
分区去。
四 、Docker迁移
将Docker目录 ( 默认为/var/lib/docker) 移到其他磁盘, 可以通过以下步骤实现:
- 停止所有正在运行的Docker容器:运行
docker stop $(docker ps -aq)
命令停止所有正在运行的容器。
docker stop $(docker ps -aq)
- 停止Docker服务:运行
systemctl stop docker
命令停止Docker服务。
systemctl stop docker
- 复制Docker目录到新的位置:使用cp或rsync等工具将Docker目录复制到新的位置 。例如,将 Docker目录从/var/lib/docker复制到/new/path/docker, 可以运行
sudo rsync -aqxP /var/lib/docker/ /mnt/var/lib/docker
命令。
sudo rsync -aqxP /var/lib/docker/ /mnt/var/lib/docker
- 更新Docker配置文件:修改Docker服务配置文件
/etc/docker/daemon.json
,并将旧的Docker目录路径替换为新的位置 。如果该文件不存在,请创建它 。示例配置文件如下所示:
{
"registry-mirrors": ["https://nrbewqda.mirror.aliyuncs.com"],
"dns": ["100.125.1.250", "100.125.64.250"],
"data-root": "/mnt/var/lib/docker"
}
- 启动Docker服务:运行
systemctl start docker
命令启动Docker服务, 并检查是否已成功加载新的 Docker目录。
systemctl start docker
- 启动Docker容器:运行
docker start <container_id>
命令启动之前停止的所有容器。
注意
:如果docker容器设置了restart ,则这些docker本身就会自动启动,这⼀步不是必须得。
docker start <container_id>
重点注意
:完成迁移后,不要立即删除原来的docker目录,可以先通过修改目录名的方式隔离原来的docker目录,要反复确认启动没有问题后,再进行删除。
cd /var/lib/docker/
mv docker docker2
mv docker2 /mnt/
总结
拓展
:如果docker资源太大,可以将其迁移至其他服务器或者外部存储设备。可以使用docker镜像导出和导入的方式来实现迁移。另外,也可以使用其他工具,如rsync或scp来迁移文件和目录。需要注意的是,迁移过程中需要保证数据的完整性和可用性。
总之
,当服务器空间不足时,需要采取一些步骤来处理和解决这个问题。首先,需要定位空间不足的原因,并尽可能地释放空间。如果问题仍然存在,需要进一步分析空间占用的原因,并考虑调整相关设置或者进行迁移。最后,需要在处理问题的同时保证数据的完整性和可用性。