当 tempfs 上有 /var 时如何修复 anacron 和 cups-pdf

当 tempfs 上有 /var 时如何修复 anacron 和 cups-pdf

我的笔记本电脑中有一个 SSD 驱动器,我遵循了各种建议,将 /var/log /var/spool 和 /var/cache 放在 tmpfs 上,这样持续的读/写就不会缩短 SSD 的寿命。

但是,anacron 现在无法启动,并且 /var/log/syslog 中的错误消息显示

anacron[4169]: Can't chdir to /var/spool/anacron: No such file or directory
kernel: [ 3037.851604] init: anacron main process (4169) terminated with status 1

cups-pdf 有类似的问题并抱怨 /var/spool/cups-pdf 不存在。

我已经检查过 /var/spool/,确实这两个都不存在。

如果我手动创建这些目录,两个进程都会运行。但是我重启后,目录又消失了。

我怎样才能让它们永久存在?

答案1

好的,所以重启后,您在 tmpfs 上执行的任何操作都不会保留。这是因为 tmpfs 是临时的,仅存在于 RAM 中。系统运行时需要放在 tmpfs 上的任何内容都必须在每次系统启动时创建。大多数使用 /var 的进程都会这样做,但有些进程(例如 anacron 和 cups-pdf)似乎不会这样做。

要解决此问题,您必须创建一个脚本,在系统每次启动时创建这些目录。将以下内容复制到文本文件中,保存并使其可执行。

#!/bin/bash

# Script to create required directories in tempfs /var (that are not otherwise created)
# Thanks to http://blog.philippklaus.de/2011/02/ssd-optimizations-on-linux/ for the list below :-)

for dir in apparmor apt ConsoleKit cups dist-upgrade fsck gdm installer news ntpstats samba speech-dispatcher unattended-upgrades; do
  if [ ! -d /var/log/$dir ] ; then
    mkdir /var/log/$dir
  fi
done

for dir in cups-pdf anacron; do
  if [ ! -d /var/spool/$dir ] ; then
    mkdir /var/spool/$dir
  fi
done

接下来,你需要通过在 /etc/rc.local 中添加一行来使此脚本在系统每次启动时运行

我的脚本名为“make_required_dirs_on_tempfs.sh”,因此我只需将以下行添加到 rc.local 文件中即可。将其放在末尾,但在“exit 0”命令上方。

/PATH_TO_SCRIPT/make_required_dirs_on_tempfs.sh

我将脚本保存在“/mnt/data/config/scripts/start-stop”中,因此我的 /etc/rc.local 文件如下所示:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

#if [ -d "/var/cache/apt/archives" ]; then echo "/var/cache/apt/archives exists"; else mkdir /var/cache/apt/archives; fi || die "Command failed: mkdir /var/cache/apt/archives"

/mnt/data/config/scripts/start-stop/make_required_dirs_on_tempfs.sh

exit 0

答案2

顺便说一下,我从“Jesse the Wind Wanderer”的脚本开始,然后添加了一些额外的目录和调整。我暂时禁用了 /tmp、/var/log 和 /var/spool 的 tmpfs,然后重新启动以查看非 tmpfs 场景中存在哪些日志文件和假脱机目录。

通过这样做,我能够检测到一些额外的目录和文件,这些目录和文件可能需要创建/存在,以使某些启动/ cron 作业正常工作。

就脚本中的所有权设置而言,我只是使用了非 tmpfs 场景中出现的相同所有权设置。

/bin/bash #!/bin/bash

# 在 tempfs /var 中创建所需目录的脚本(未通过其他方式创建)
# 感谢 http://blog.philippklaus.de/2011/02/ssd-optimizations-on-linux/ 提供以下列表 :-)

对于 apparmor 中的 dir apt ConsoleKit cups dist-upgrade fsck gdm hp installer lightdm news ntpstats samba Speech-dispatcher unattended-upgrades upstart;执行
  如果 [ !-d /var/log/$dir ] ; 那么
    mkdir /var/log/$dir
完毕

触摸/var/log/apport.log
chown root:adm /var/log/$i

对于我在 auth.log kern.log syslog 中
  触摸/var/log/$i
  chown syslog:adm /var/log/$i
完毕


对于 anacron cron cups cups-pdf libreoffice lintian plymouth rsyslog 中的 dir;执行
  如果 [ !-d /var/spool/$dir ] ; 那么
    mkdir /var/spool/$dir
完毕

cd /var/spool
rm -f 邮件
ln -s /var/邮件


# 需要 rsyslog 来获取新创建的日志文件:
sudo 服务 rsyslog 重启

/usr/bin/logger“(已完成为 tmpfs 创建所需的目录)”

并且,当然要让脚本可由 root 执行,并根据 Jesse 的指示从 rc.local 调用它。

相关内容