我如何移动 /var/log 目录

我如何移动 /var/log 目录

在我们的生产服务器上,有一个用于根挂载点的小驱动器//var/log占用了太多空间,我必须手动删除一些文件。我怎样才能移动/var/log//home/log不重新启动的位置?

我的想法是这样的:

$ mkdir /home/log
$ rsync -a /var/log /home/log
$ mount --bind /home/log /var/log
$ /etc/init.d/rsyslog restart

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

答案1

适当的设计

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

您的方法

你提出的建议可能如果您使用 SIGHUP(kill -1 pid)向守护进程发出信号,则此方法有效。显然,您稍后需要执行“mount -o bind / /somewhere”并清理已安装的 /var/log 下剩余的内容。但对我来说,这会带来不良影响,尤其是对于生产环境而言。

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

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

lsof | grep /var/log             # lists open files in /var/log

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

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

挂载到 /var/log。恢复旧配置,再次 SIGHUP/reload 守护进程。

简单方法(停机时间)

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

答案2

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

我只是想分享这个,因为它可以轻松复制粘贴,如果你的情况像我的情况一样简单:

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

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很可能是唯一正在运行的守护进程。YMMV!

fstab附言 - 您可能也想将其添加到您的。以下是实现此目的的一种方法,同样假设安装非常简单:

cat /etc/mtab |grep /var/log >>/etc/fstab

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

答案3

您可以做的另一件事是:

  • 停止打开文件的进程/var/log
  • 验证没有任何打开文件的进程/var/log(使用lsofkubanskamac 建议的方法)
  • 将您的移动/var/log到另一个具有足够可用空间的分区(按照您的示例,这将是/home/log
  • 创建从 /var/log 到 /home/log 的符号链接(ln -s /home/log /var/log
  • 重新启动在第一步中停止的进程

请注意,这远非我认为的良好做法。这只是一种解决方法,这样您就不必关闭服务器。正确的解决方案是创建一个具有足够空间的新/var分区/var/log(或扩展当前的分区),

答案4

基于@hwjp 的另一种解决方案是,如果您不能使用另一个驱动器卷来移动它们,则可以将虚拟驱动器卷创建到另一个具有更多可用空间的卷中(这是我的情况):

创建虚拟卷:

A)做:sudo dd if=/dev/zero of=VHD-log.img bs=1M count=1200

  • if=/dev/zero:输入文件提供字符流来初始化数据存储
  • of=VHD.img:要在 /thevolumeofyourchoice 上创建为存储卷的映像文件
  • bs=1M:每次读写最多1M
  • count=1200:仅复制 1200M(1GB)输入块

B)执行:sudo mkfs -t ext4 /thevolumeofyourchoice/VHD-log.img使用 mkfs 实用程序格式化 VHD-log 映像文件中的 EXT4 文件系统类型。

C)执行:sudo mkdir /thevolumeofyourchoice/vlog将 VHD-log 挂载到目录(挂载点)

D)做:sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /thevolumeofyourchoice/vlog

D1) 要在系统启动时将 VHD-log 挂载到最终目录,请在 /etc/fstab 文件中添加此条目。

/thevolumeofyourchoice/VHD-log.img  /var/log/  ext4    defaults        0  0

移动旧日志文件:

E)做:

  • service rsyslog stop
  • lsof | grep /var/log列出 /var/log 中打开的文件并关闭所需的守护进程(在我的情况下是 apach2、freshclam)
  • cp -rp /var/log/* /thevolumeofyourchoice/vlog(cp -p 与 --preserve=mode,ownership,timestamps 相同)

F)做:

  • sudo umount /thevolumeofyourchoice/vlog
  • sudo mv /var/log /var/log-old
  • sudo mkdir /var/log
  • sudo chgrp syslog /var/log
  • sudo mount -t auto -o loop /thevolumeofyourchoice/VHD-log.img /var/log

G)执行:service rsyslog start并重新启动您停止的其他服务

最后再检查一下:

您可以执行 -lsof | grep /var/log列出 /var/log 中打开的文件并验证它们指向 /var/log 而不是 /var/log-old

一切正常后,您可以 mv、备份或删除 /var/log-old。

相关内容