在我们的生产服务器上有一个小的驱动器用于安装根目录/ , /var/log占用的空间太多,我不得不手动删除一些文件。 我如何移动/var/log/让我们说/home/log没有重新启动?
这是我想到的事情:
$ mkdir /home/log $ rsync -a /var/log /home/log $ mount --bind /home/log /var/log $ /etc/init.d/rsyslof restart
但是我知道有些服务使用文件描述符,所以他们会继续使用/var/log或者inode。
适当的devise
我假设你无法简单地扩展有问题的文件系统(使用lvextend && ext2online ),因为你不使用LVM或使用错误的文件系统types。
你的方法
如果你用SIGHUP(kill -1 pid)给守护进程发信号,你的build议可能会起作用。 显然你需要稍后在“mount -o bind / / somewhere”处清理挂载在/ var / log下面的东西。 但是对我来说这是一个难闻的气味,特别是对于生产。
避免停机,有一个干净的结果(但要做的很复杂)
忘记“挂载-o绑定”的想法,创build一个新的LV /分区,但不要挂载它。
lsof | grep /var/log # lists open files in /var/log
对于有任何打开的文件的每个守护进程(我期望至lesssyslog,inetd,sshd):
kill -1或/etc/init.d/script reload ) lsof | grep /var/log确认 lsof | grep /var/log守护进程已经closures了它的文件 挂载在/ var / log上。 恢复旧configuration,SIGHUP /重新加载守护进程。
简单的方法(停机时间)
创build一个新的LV /分区,并通过/ var或/ var / log将其正确挂载。 简单的方法是将服务器closures到维护模式(单用户模式),并使用实际的控制台(而不是ssh)进行操作。
其他人的回答都是非常好的,你应该先阅读。
我只是以为我会分享这个,因为它使得复制和粘贴,如果你的情况是相当简单的像我一样:
停止系统日志并复制当前日志:
service rsyslog stop mkdir -p /tmp/varlog cp -r /var/log/* /tmp/varlog
然后,在/var/log挂载新的位置。 说这是一个名为/dev/sdb的新设备
mount /dev/sdb /var/log
现在您可以复制文件并重新启动系统日志:
cp -r /tmp/varlog/* /var/log rm -rf /tmp/varlog service rsyslog start
假设这一切都发生在你的机器的生命早期, rsyslog可能是唯一的守护进程运行。 因人而异!
PS – 你可能想把它添加到你的fstab中。 这里有一个方法,再次假设一个非常简单的安装:
cat /etc/mtab |grep /var/log >>/etc/fstab
( 请参阅https://serverfault.com/a/267610/80606关于捕获mtab到fstab)
你可以做的另一件事是:
/var/log上打开文件的进程 /var/log上没有打开文件的进程(使用lsof作为kubanskamacbuild议) /var/log移动到有足够可用空间的另一个分区(以你的例子为例,这将是/home/log ) ln -s /home/log /var/log )的符号链接 请注意,这是远远不如我认为是一个良好的做法。 这只是一个解决方法,所以你不必closures服务器。 正确的解决scheme是创build一个具有足够空间的新的/var或/var/log分区(或扩展当前的分区),