如何移动 /var/log 目录

Raz*_*que 18 linux debian log-files disk-space-utilization

在我们的生产服务器上,根挂载点有一个小驱动器//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
Run Code Online (Sandbox Code Playgroud)

但我知道有些服务使用文件描述符,所以他们会继续使用/var/log或 inodes。

kub*_*zyk 27

适当的设计

我假设您无法简单地扩展有问题的文件系统(使用lvextend && ext2online),因为您没有使用 LVM 或使用错误的文件系统类型。

你的方法

如果您使用 SIGHUP (kill -1 pid) 向守护进程发送信号,那么您提出的建议可能会奏效。显然,您稍后需要在“mount -o bind / /somewhere”上执行并清理挂载的 /var/log 下剩余的内容。但它对我来说有一种难闻的气味,尤其是对生产而言。

避免停机,获得干净的结果(但操作起来很复杂)

忘记“挂载 -o 绑定”的想法,创建一个新的 LV/分区,但不要挂载它。

lsof | grep /var/log             # lists open files in /var/log
Run Code Online (Sandbox Code Playgroud)

对于每个有任何打开文件的守护进程(我希望至少有 syslog、inetd、sshd):

  • 重新配置守护进程 no 以登录到 /var/log
  • 刷新守护进程(kill -1/etc/init.d/script reload
  • 确认lsof | grep /var/log 该守护进程已关闭其文件

挂载在 /var/log 上。恢复旧配置,再次 SIGHUP/重新加载守护进程。

简单的方法(停机时间)

创建一个新的 LV/分区并将其正确挂载到 /var 或 /var/log。简单的方法是将服务器关闭到维护模式(单用户模式),并使用实际的控制台(而不是 ssh)进行操作。


hwj*_*wjp 10

其他人的答案都非常好且正确,您绝对应该先阅读它们。

我只是想我会分享这个,因为它可以轻松复制和粘贴,如果你的案例像我的一样非常简单:

停止系统日志并复制当前日志:

service rsyslog stop
mkdir -p /tmp/varlog
cp -r /var/log/* /tmp/varlog
Run Code Online (Sandbox Code Playgroud)

然后,将您的新位置挂载到/var/log. 说这是一个名为的新设备/dev/sdb

mount /dev/sdb /var/log
Run Code Online (Sandbox Code Playgroud)

现在您可以复制文件并重新启动系统日志:

cp -r /tmp/varlog/* /var/log
rm -rf /tmp/varlog
service rsyslog start
Run Code Online (Sandbox Code Playgroud)

假设这一切发生在您机器生命周期的早期,rsyslog很可能是唯一运行的守护进程。天啊!

PS - 你可能也想把它添加到你的fstab。这是这样做的一种方法,再次假设一个非常简单的安装:

cat /etc/mtab |grep /var/log >>/etc/fstab
Run Code Online (Sandbox Code Playgroud)

(参见https://serverfault.com/a/267610/80606关于将 mtab 转换为 fstab)

  • 不错的解决方案。我要改变的一件事是用“sudo tar cpf”和“sudo tar xpf”替换你的“cp -r”,以保留文件所有权和权限,以防万一有非root用户创建的日志。 (7认同)