Centos系统磁盘占用:/dev/vda1占用100%空间不足处理与解决思路(实战docker占用空间太大)

前言

服务器Centos操作系统,空间不足的问题处理了三次了,决定把它的解决思路和处理过程记录下来。服务器空间不足是一个经常会遇到的问题,尤其是在大型应用程序和网站上。当服务器空间不足时,应该采取一些步骤来处理和解决这个问题。以下记录最近这次的解决方案和思路(原因:docker占用空间太大了)

现象

服务器空间不足会导致以下一些现象:

  1. 应用程序无法运行:当服务器空间不足时,某些应用程序可能会无法正常启动或运行,因为这些程序需要在硬盘上读取或写入数据。
  2. 文件上传失败:如果服务器的空间已经耗尽,用户可能会无法上传文件,因为没有足够的空间可供存储。
  3. 数据库出错:当服务器空间不足时,数据库可能会出现错误,因为数据库需要写入和读取数据到磁盘上。
  4. 日志文件无法写入:当服务器空间不足时,系统和应用程序的日志文件可能无法写入,这将使得故障排查和系统运行监控变得困难。
  5. 系统崩溃:如果服务器的空间不足并且无法处理数据和任务,可能会导致系统崩溃或宕机。

因此,保持足够的服务器空间是确保服务器运行稳定和高效的重要因素。

解决过程

一、服务器空间不足问题定位

  1. 登录服务器 ,可以通过运行一些命令,如df -hdu -h来检查服务器上的磁盘使用情况,查看哪些目录或文件夹占用了大量的空间。
  2. 拓展命令df -hT还可以看到文件系统的Type类型,比如:
    • ext2/ext3/ext4: Linux 的扩展文件系统,分别为第二、三和第四个扩展文件系统的版本。它们提供了可靠的磁盘存储和文件系统功能。
    • tmpfs: 提供了基于内存的临时文件系统,数据存储在内存中而不是磁盘上,用于临时存储临时文件。
    • xfs:一种高性能的文件系统,广泛用于许多 Linux 发行版。支持较大的文件系统和文件的快速访问。
    • btrfs:全称 B-tree 文件系统,是一个现代的复制文件系统,具有快照、压缩、回滚等高级功能。
    • nfs: Network File System 的简称,一种用于在网络上共享文件的分布式文件系统协议。它允许在不同的计算机之间共享文件和目录。
    • overlay:是一种特殊的文件系统类型,它通常用于 Docker 容器等容器化环境中。等等~
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
...
  1. 抓住主要的物理设备,不用关心其他逻辑设备, 物理设备⼀般挂载在/dev目录下
/dev/vda1         40G   38G     0 100% /
/dev/vdb         656G  154G  469G  25% /mnt
overlay          40G   38G     0 100% /var/lib/docker/overlay2/0e4870d22fb 1c79fd3c0b8ad2023475715a5a56c05b1900de76070d0a80e3001/merged

观察到/根目录空间已经使用100%, 虽然名义上还有2G空间 ,但是这些空间可能是被内存交换分区占 用 ,所以不用拘泥于具体数字, 如果出现100%即可以确认。

注意:如果设备空间严重不足, 可能会导致正常命令⾏也无法执⾏, 此时可以先试试下面的释放空间思路

二、分析空间占用的原因

使用du命令来逐层分析文件夹所占用的空间大小。其中,-d 1表示只分析当前目录下的一级子目录,-h表示以易读的方式显示结果(例如使用KB、MB等单位),还可以额外添加参数-p L表示只分析L级子目录,-u则表示使用M来显示结果,即以MB为单位。

du -d 1 -h

在这里插入图片描述


例如 ,从上述分析看到, 目录/var/docker/overlay2 ⼀个目录就占用了28GDocker Overlay2是⼀种容器存储驱动程序,它使用了⼀个特殊的文件系统来管理Docker容器和镜像的存储 。Overlay2驱动程序将多个镜像层堆叠在⼀起,以便对这些层进行读取和写⼊操作时只需要查找最上面的层 。因此 ,在使用Overlay2驱动程序时,Docker会为每个容器创建⼀个单独的目录,该目录包含容器所需的所有文件系统内容。
分析结果:这基本上无解了,不能删除Overlay2文件夹释放空间,此时所能做的就只能是把docker安装环境移到有空间的/mnt 分区去。

三、释放空间

  1. 首先最安全的可以释放的空间往往在/home目录下,在一般情况下,用户上传的临时文件和安装包等往往会存储在/home目录下,因此这些文件可以首先被删除或转移到其他有空间的分区中来释放空间。但是需要注意的是,如果这些文件是某些应用程序的必要文件,删除可能会导致应用程序无法正常运行,因此在删除前需要进行确认。此外,如果/home目录下存在用户的个人数据(例如文档、音乐、图片等),则不应该轻易删除或转移这些文件,而应该寻找其他的空间释放方案。
  2. /md目录下的一些文件可能可以删除,但是有一些文件可能记录了当前正在运行的进程的登录和临时状态数据,如果不熟悉这些服务,不建议删除这些文件。
  3. 可以通过清理无用的文件和目录,以及删除过期的日志和备份文件来释放空间。另外,可以通过压缩和归档文件来减少文件占用的磁盘空间。在释放空间之前,需要确保不会误删除重要的文件和目录。
  4. 重启一些进程和常见的服务,可以释放掉这些进程所生成的临时文件占用的空间。在重启之后,这样做可以基本保证会有一定的磁盘空间回收。
  5. 清理无用的进程镜像或者删除的 Docker 容器。
  6. 清理进程的缓存,可以运行进程的系统命令,清除所有未被使用的对象(包括镜像、容器、网络和卷),以及所有未标记的镜像和构建缓存。这可以帮助释放更多的磁盘空间。

四 、Docker迁移

将Docker目录 ( 默认为/var/lib/docker) 移到其他磁盘, 可以通过以下步骤实现:

  1. 停止所有正在运行的Docker容器:运行docker stop $(docker ps -aq)命令停止所有正在运行的容器。
docker stop $(docker ps -aq)
  1. 停止Docker服务:运行systemctl stop docker命令停止Docker服务。
systemctl stop docker
  1. 复制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
  1. 更新Docker配置文件:修改Docker服务配置文件/etc/docker/daemon.json,修改data-root值,将旧的Docker目录路径替换为新的位置 。如果该文件不存在,请创建它 。示例配置文件如下所示:(注意registry-mirrorsdns两个值填你自己的镜像仓库和DNS 服务器地址配置即可)
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],"dns": ["100.xxx.1.20","100.xx.1xx.250"],"data-root": "/mnt/var/lib/docker"
}
  1. 启动Docker服务:运行systemctl start docker命令启动Docker服务, 并检查是否已成功加载新的 Docker目录。
systemctl start docker
  1. 启动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来迁移文件和目录。需要注意的是,迁移过程中需要保证数据的完整性和可用性。

总之,当服务器空间不足时,需要采取一些步骤来处理和解决这个问题。首先,需要定位空间不足的原因,并尽可能地释放空间。如果问题仍然存在,需要进一步分析空间占用的原因,并考虑调整相关设置或者进行迁移。最后,需要在处理问题的同时保证数据的完整性和可用性。

相关文章

linux下开机自启: 在/etc/init.d目录下新建文件elasticsear...
1、因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以...
最简单的查看方法可以使用ls -ll、ls-lh命令进行查看,当使用...
ASP.NET Core应用程序发布linux在shell中运行是正常的。可一...
设置时区(CentOS 7) 先执行命令timedatectl status|grep &...
vim&#160;/etc/sysconfig/network-scripts/ifcfg-eth0 B...