如果/var
生产服务器上的分区已满,那么解决方案是什么?
以下是我的解决方法:
- 如果是LVM分区那么我们可以在线扩展它。
- 我们可以压缩日志。
- 我们可以删除旧数据。
请建议我更多可能的方法来解决和克服这个问题。
如果您能分享您遇到过的这个问题的经验,这对我会有帮助。
答案1
对于任何这些情况(某些东西正在填充),我的方法都是首先找到罪魁祸首。
我从使用开始du -sh *|grep G
,继续du -sh *|grep M
。当我找到它时,我开始研究为什么有些东西开始填满。
- 我需要那么高的日志级别吗?
- 如果日志 - 即使对于自制或自定义程序也使用 logrotate (/etc/logrotate.d/)
- 如果这是一个真正的磁盘占用者,我尝试将它分离到它自己的 LV 中
因此,我们服务器的标准 Linux 磁盘布局目前如下所示:
- /var LV 具有 2 GB
- /var/log LV 8 GB
- /var/tmp LV 容量为 4 GB
目前这足以满足我们几乎所有的用例。
答案2
我曾经在非 LVM 分区上遇到过类似的问题,我通过将其中一个目录移动到更宽敞的分区并将其符号链接回原位来解决。例如,就您的情况而言,您可以尝试:
mv /var/cache /more/spacious/partition/cache
ln -s /more/spacious/partition/cache /var/cache
请注意,我使用非系统目录执行此操作,到目前为止没有观察到任何不良副作用。不过,系统目录的情况可能有所不同。我们需要更有知识的人来证实/反驳。
编辑
为了更安全,你可以这样做
cp -a /var/cache /new/place/cache rm -rf /var/cache ln -s /new/place/cache /var/cache
这可以确保您不会丢失缓存,以防
mv
调用出现问题(系统崩溃、断电……)为了确保在复制时不会向该目录写入任何内容,最好通过 LiveCD 执行此操作。
答案3
CIS 基准要求将 /home、/tmp 和 /var 放在单独的分区上,以减轻因根分区填满而导致系统冻结的最坏结果。
还有其他解决方案可以帮助它从一开始就填满。当然监控是其中之一:
echo -e '#!/bin/bash\nCURRENT=$(df / | grep / | awk '\''{ print $5}'\'' | sed '\''s/%//g'\'') ; THRESHOLD=95; if [ "$CURRENT" -gt "$THRESHOLD" ] ; then mail -s "Disk Space Alert Used: $CURRENT" $EMAIL <<< $(hostname -i; uname -a); fi' >> /etc/cron.hourly/check-space && chmod +x /etc/cron.hourly/check-space
您还可以设置系统日志免于填充:
echo 'SystemMaxUse=200M' >> /etc/systemd/journald.conf && systemctl restart rsyslog
您可以创建一个固定大小的 varfile 并将其挂载到 /etc/fstab 中的 /var:(
fallocate -l 600M /varfile && mkfs.ext4 /varfile
echo -e "/home/varfile /home/user1 ext4 defaults,nofail 0 2" >> /etc/fstab
无转储,文件检查优先级第一是 root)
使用以下命令调整大小:fallocate -l 200M /tmpfile && mount /tmpfile /tmp && resize2fs /dev/loop1
我已经使用 /home 和 /tmp 目录安全地完成了文件安装,但没有测试 /var,因为我还没有弄清楚如何在不使用附加的 livedisk 或安装根文件系统的情况下将当前内容复制到安装文件上。对我来说,让日志在可用空间中流动并获得我需要的监控似乎更好,但对于比最小服务器更大的虚拟机,我可能会重新考虑这一点。
此外,您还可以在各个conf 文件中使用 maxsize 来限制特定日志大小。然而,诸如 /var/lib 之类的 apt 列表和 clamav 定义以及 /var/cache/apt/archives 中安装的缓存包等内容将与日志一起增长。后者可以通过apt clean
定期使用的无人值守更新设置来控制。