2004年8月22日日曜日

リモートサーバに適したリブート時のfsck設定


某所に置いているhis.luky.orgが今朝方にハングアップしていたようである。

pingには応答するし、nmapで見ても各種開放ポートには答えようとしているようだが実際にはサービス停止していた。



リセットや電源OFF/ONをお願いしたが、復旧しないため現地に行ってみた。



ハングアップの原因は不明であるが、結果としてはブート時のfsckでオペレータ判断待ちで止まっていた。



��まぁ、想定通り。



どうせfsckを手動で行うときも-yオプションを付けてやるので、起動の都度そうするべくrcSなどをいじろうと思ってちょっと調べた。



ちなみに、his.luky.orgはDebian/GNU Linux の woodyをベースにしている。




/etc/inittabを見ると、ブート時には/etc/init.d/rcSが動くようになっている。

そこで、/etc/init.d/rcSを見ると、/etc/default/rcSを評価した後に

/etc/rcS.d/配下のスクリプトを、スクリプト名が若い順番に実行している。



etc/rcS.d/直下でgrep -r fsck *を実行すると、S10checkroot.shとS30checkfs.shが引っかかった。

S10checkroot.shは/etc/init.d/checkroot.shへのシンボリックリンクなので、実体の方を見てみると、


[前略]
. /etc/default/rcS
[中略]
#
# Check the root file system.
#
if [ -f /fastboot ] || [ $rootcheck = no ]
then
[ $rootcheck = yes ] && echo "Fast boot, no file system check"
else
#
# Ensure that root is quiescent and read-only before fsck'ing.
#
mount -n -o remount,ro /
if [ $? = 0 ]
then
if [ -f /forcefsck ]
then
force="-f"
else
force=""
fi
if [ "$FSCKFIX" = yes ]
then
fix="-y"
else
else
fix="-a"
fi
spinner="-C"
case "$TERM" in
dumb|network|unknown|"") spinner="" ;;
esac
[ `uname -m` = s390 ] && spinner="" # This should go away
echo "Checking root file system..."
fsck $spinner $force $fix /
#
# If there was a failure, drop into single-user mode.
#
# NOTE: "failure" is defined as exiting with a return code of
# 2 or larger. A return code of 1 indicates that file system
# errors were corrected but that the boot may proceed.
#
if [ $? -gt 1 ]
then
# Surprise! Re-directing from a HERE document (as in
# "cat << EOF") won't work, because the root is read-only.
echo
echo "fsck failed. Please repair manually and reboot. Please note"
echo "that the root file system is currently mounted read-only. To"
echo "remount it read-write:"
echo
echo " # mount -n -o remount,rw /"
echo
echo "CONTROL-D will exit from this shell and REBOOT the system."
echo
# Start a single user shell on the console
/sbin/sulogin $CONSOLE
reboot -f
fi
[後略]

と言うように、fsck -yにするための仕掛けも盛り込まれており、オペレータプロンプトを出すところも書かれていた。



fsck -yとするには if [ "$FSCKFIX" = yes ] が成立すればよい。

そこで、/etc/配下で grep -r FSCKFIX * を実行したところ、

/etc/default/rcSで設定していることが分かった。



現時点では、/etc/default/rcSを以下のように一番最後の1行だけnoからyesに変更している。


#
# Defaults for the boot scripts in /etc/rcS.d
#
# Time files in /tmp are kept in days.
TMPTIME=0
# Set to yes if you want sulogin to be spawned on bootup
SULOGIN=no
# Set to no if you want to be able to login over telnet/rlogin
# before system startup is complete (as soon as inetd is started)
DELAYLOGIN=yes
# Set UTC=yes if your system clock is set to UTC (GMT), and UTC=no if not.
UTC=no
# Set VERBOSE to "no" if you would like a more quiet bootup.
VERBOSE=yes
# Set EDITMOTD to "no" if you don't want /etc/motd to be editted automatically
EDITMOTD=yes
# Set FSCKFIX to "yes" if you want to add "-y" to the fsck at startup.
FSCKFIX=yes


0 件のコメント:

コメントを投稿