web-dev-qa-db-ja.com

別のパーティションの/ var、/ var / logがシャットダウン時にアンマウントに失敗する、デバッグ方法

タイトルが示すように、私は別々のパーティションに/var/var/logを持っています。

シャットダウン時に、umount /var/logというエラーが発生し、後でumount /varが失敗しました。

私の質問は:

この問題をデバッグする方法は?

それが重要な場合、私はDebianStretchを実行しています。

これまでウェブを検索していたところ、journald/var/logにログインする際に問題が発生しましたが、私のシステムではjournaldログは/runに移動します。

つまり、/varを占有している何かが他にあります。


1)理想的には、マウントエラーが発生した時点でシャットダウンプロセスを停止し、シェルを開いてlsofを発行するか、同じことを行うスクリプトをどこかに配置します。しかし、私は十分な知識がありません。どうすればよいですか?

init.dを必要とせずにlocal_fsスクリプトを作成し、それをrc0rc6K99を付けて配置すると、適切なタイミングで実行され、ログファイルに出力が書き込まれるという漠然とした考えがあります。

あるいは、rcレベルにはそのような細かい制御がないので、スクリプトとそれを実行するためのsystemdユニットを作成する必要があります。

とにかく、ここでの問題は、それを試しても、それが適切なタイミングで実行されたかどうかわからないので、ログに表示されるものが前から、後、その場で、いつからであるかはわかりませんエラーが発生します...?


2)または、lsofを使用して通常のrc2実行システムで/var/logに何が書き込まれているかを確認し、すべての起動スクリプト/メソッドを見つけて、/var/var/logがマウントされました。

また、シャットダウン依存関係ループを作成しないようにしてください。

最初に問題を特定してから、システム構成をやみくもに上書きし始めます。


A)次に、これは質問のハイジャックのようなものですが、おそらく/etc/fstabには、「マウントの順序については、/var/var/log/と同じように扱う」という設定があります。

2
Zoltan K.

私の解決策は投票することでした。ログインしました/root、これはルート上にあり、マウント解除される最後のものでした。このバージョンのスクリプトは「停止」を尊重しますが、プッシュする可能性があります。

出力を調べると、正確なタイミングは他のプロセスと比べて少し変わっていますが、パーティションは正しくアンマウントされているようです。

したがって、エラー/警告メッセージは無害に見えます。

これが私がポーリングに使用したスクリプトです。インストール手順はコメントにあります。スクリプトに「oflogger」という名前を付けます。

#! /bin/sh
### BEGIN INIT INFO
# Provides:          oflogger
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: log the open fd-s in selected dirs (/var, /var/log)
# Description: Log the output of lsof and mount, filtered by dir into the
#              root's home every 0.1s .
#              The root's home is not the safest place, but we want to log
#              as long as we can, so the location must be at the root
#              partition.  We don't want to litter with this logfile,
#              so the ~root seems to be a Nice, out-of-way place, which
#              will probably also ring a bell when backuping the system.
#              NOTE: We want this to be absolutely the last thing to be
#                    killed (and the first one to be started), so even
#                    though it obviously needs a filesystem, we do not
#                    add this requirement.
#                    This is because the task of this program is exactly
#                    to identify processes that may obstruct umounting.
### END INIT INFO

# INSTALL:
#cp oflogger /etc/init.d/
#ln -s /etc/init.d/oflogger /etc/rc0.d/K99oflogger
#ln -s /etc/init.d/oflogger /etc/rc1.d/K99oflogger
#ln -s /etc/init.d/oflogger /etc/rc2.d/S01oflogger
#ln -s /etc/init.d/oflogger /etc/rc3.d/S01oflogger
#ln -s /etc/init.d/oflogger /etc/rc4.d/S01oflogger
#ln -s /etc/init.d/oflogger /etc/rc5.d/S01oflogger
#ln -s /etc/init.d/oflogger /etc/rc6.d/K99oflogger
# not adding to rcS.d
#cp /usr/bin/cut /usr/bin/uniq /usr/bin/lsof /usr/bin/sort /root/

# unINSTALL:
#rm /etc/init.d/oflogger
#rm /etc/rc0.d/K99oflogger
#rm /etc/rc1.d/K99oflogger
#rm /etc/rc2.d/S01oflogger
#rm /etc/rc3.d/S01oflogger
#rm /etc/rc4.d/S01oflogger
#rm /etc/rc5.d/S01oflogger
#rm /etc/rc6.d/K99oflogger
#rm /root/cut /root/uniq /root/lsof /root/sort

LSOF='/root/lsof'
GREP='/bin/grep'
CUT='/root/cut'
SORT='/root/sort'
UNIQ='/root/uniq'

test -x "$LSOF" || exit 0

. /lib/lsb/init-functions

pid=''

case "$1" in
  start)
    echo "===start" >> /root/lsof.log
    # NOTE: Error output from here will end up in the system log,
    #       and since lsof produces an error message every time
    #       it runs, we rather disable it.
    #       ALTERNATIVE:
    #       just filtering that 1 offending message, but since
    #       we know the script works, we just ignore this problem
    while sleep 0.1
    do
        echo '.../var'
        $LSOF | $GREP '/var' | $CUT -d' ' -f1 | $SORT | $UNIQ
        echo '.../var/log'
        $LSOF | $GREP '/var/log' | $CUT -d' ' -f1 | $SORT | $UNIQ
        echo '...mount'
        mount | grep '\<var\>'
        echo '---------------------'
    done 2>/dev/null 1>>/root/lsof.log &
    ps=$!
    ;;
  restart)
    echo "===restart" >> /root/lsof.log
    ;;
  force-reload)
    echo "===force-reload" >> /root/lsof.log
    ;;
  reload)
    echo "===reload" >> /root/lsof.log
    ;;
  stop)
    echo "===stop" >> /root/lsof.log
    if [ x != x"$ps" ]
    then
        kill $ps
    fi
    ;;
  status)
    echo "===status" >> /root/lsof.log
    ;;
  *)
    echo "===*" >> /root/lsof.log
    ;;
esac

exit 0
0
Zoltan K.