我是 Linux 新手。我只备份了几周的日志。本周,我查看了这些消息,发现它们上周已停止保存,大约是自上次备份以来。通常,新的消息文档在每周大致相同的时间启动。与往常一样,本周自动生成了一个新文档,并且日志再次开始保存。但我仍然错过了上周停止保存的日志。有人对这里发生的事情有任何想法吗?有没有办法恢复那些丢失的日志?
答案1
很有可能是 /var/log/syslog 文件在打开时被重命名并删除,并创建了一个同名的新文件。
这会导致消息被发送到已删除的文件(在 Unix 中,只要文件保持打开状态,您就可以这样做;数据将被写入磁盘,并反映在可用空间的减少中)。
一旦文件被关闭,那么该文件就被真正删除,所有数据都会丢失。作为绝望的最后手段,您可以以 root 身份通过 strings 命令转储整个逻辑磁盘,并在已删除的闲置空间中 grep 查找日志文件行。假设文件系统没有被压缩,并且没有安全措施来清理已删除的文件,在这种情况下,您就在没有桨的情况下沿着臭名昭著的小溪前进。
# Assume log lines begin with YYYY-MM-DD and are from last week
# And assume that /var/log is on /dev/sda1.
# Save on a different disk or external USB device
dd if=/dev/sda1 | strings | grep "^2019-08-[23][0-9] ..:..:.. " > /mnt/usbkey/logs.txt
# After some hours, MAYBE you'll find something among all the rubbish in /mnt/usbkey/logs.txt
或者系统日志守护进程可能已停止。
要检查哪些文件已打开,请区域设置 syslog 的 pid,然后查看 /proc/PID_OF_SYSLOG/fd 。您将在那里看到文件句柄;它们是实际打开文件的符号链接。
如果你看到类似的东西
3 -> /var/log/syslog [已删除]
在那里是未删除的 /var/log/syslog,这意味着它们是两个不同的文件。停止并重新启动 syslog 将解决该问题。
某些日志轮换脚本有时可能会在移动/重命名/压缩/删除旧日志文件时做出类似愚蠢的事情。