タイトルが示すように、私は別々のパーティションに/var
と/var/log
を持っています。
シャットダウン時に、umount /var/log
というエラーが発生し、後でumount /var
が失敗しました。
私の質問は:
この問題をデバッグする方法は?
それが重要な場合、私はDebianStretchを実行しています。
これまでウェブを検索していたところ、journald
が/var/log
にログインする際に問題が発生しましたが、私のシステムではjournald
ログは/run
に移動します。
つまり、/var
を占有している何かが他にあります。
1)理想的には、マウントエラーが発生した時点でシャットダウンプロセスを停止し、シェルを開いてlsof
を発行するか、同じことを行うスクリプトをどこかに配置します。しかし、私は十分な知識がありません。どうすればよいですか?
init.d
を必要とせずにlocal_fs
スクリプトを作成し、それをrc0
とrc6
にK99
を付けて配置すると、適切なタイミングで実行され、ログファイルに出力が書き込まれるという漠然とした考えがあります。
あるいは、rcレベルにはそのような細かい制御がないので、スクリプトとそれを実行するためのsystemd
ユニットを作成する必要があります。
とにかく、ここでの問題は、それを試しても、それが適切なタイミングで実行されたかどうかわからないので、ログに表示されるものが前から、後、その場で、いつからであるかはわかりませんエラーが発生します...?
2)または、lsof
を使用して通常のrc2実行システムで/var/log
に何が書き込まれているかを確認し、すべての起動スクリプト/メソッドを見つけて、/var
と/var/log
がマウントされました。
また、シャットダウン依存関係ループを作成しないようにしてください。
最初に問題を特定してから、システム構成をやみくもに上書きし始めます。
A)次に、これは質問のハイジャックのようなものですが、おそらく/etc/fstab
には、「マウントの順序については、/var
、/var/log
を/
と同じように扱う」という設定があります。
私の解決策は投票することでした。ログインしました/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