[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:18017] How to recover when can't login
皆様こんにちは。田村です。
先般、"apt-get failed!" なるスレッドで、助けていただいた者です。
佐野氏のお勧めもあって、回復手順をまとめてみました。
皆様の後参考になれば幸いです。
また、お気づきの点などありましたら、なんなりと御指摘下さい。
<症状>
・一般ユーザーでログインできない。具体的には、
起動メッセージが流れたあと、"(none)login:"と表示される。
ログイン名を入力すると、今度は "(none)password:"と表示される。
正しいパスワードを入力しても、再び "(none)login:" となり、
いつまでたってもログインできない。
・Ctrl + Alt + Delete キーを押すと、root のパスワードを
入力するよう促され、それを実行すると、
"(none)~#" と表示されて一応コマンド入力が可能になる。
ただし、shutdown コマンドで終了処理ができない(堂々めぐりになる)。
<原因>
・/bin/sh が何らかの理由により消えている(シェルが無い)。
・上記の結果、起動時に"/"(root file system)への正常な
マウントが行なわれず、read only でマウントされてしまっている。
<原因についての解説>
Linux カーネルは起動手順の終りに "/" (root file system) を read only で
マウントして、/sbin/init を実行しようとします。
/sbin/init は /etc/inittab を参照して、そこに書かれている指示に
従って動作します。
/etc/inittab には
# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS
という記載があります。つまり、「最初の仕事」として /etc/init.d/rcS を
実行しようとするわけです。
ところが、ここで /etc/init.d/rcS の先頭を見ると
#! /bin/sh
#
# rcS Call all S??* scripts in /etc/rcS.d in
# numerical/alphabetical order.
となっていて、最初の行で /bin/sh によって実行される script だと
宣言しています。現在の状態では /bin/sh がありませんから、
この script は実行できません。 "BANG!"
この状態では "/" が read only でマウントされた状態のままで、
その他の file system は /proc も含めてまったくマウントされていない
だろうと思います。ここで一般ユーザーとしてログインしようとしても、
/home 以下にあるはずのそのユーザーの HOME ディレクトリがまだシステムに
接続されていませんから、ログインできないわけです。
Ctrl+Alt+Del キーを押した時の動作は /etc/inittab に
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
と規定されています。通常ならここで再起動の動作が始まるはずですが、
「異常事態」なのでおそらく
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
こちらに移行しているのでしょう。 /sbin/sulogin は single user mode で
利用される root 専用のログインコマンドです。
<回復手順>
*以下では、"/" (root file system) が hda (IDE primary master) に
あることを前提にしています。その他のドライブにある場合は、適宜
デバイス名を変更 (例えば SCSI の 1 番目なら sda など) してください。
1:まず、cat /etc/mtab を実行する。で、一行目の表示が
/deb/hda* / ext2 rw, errors=remount-ro,errors=remount-ro 0 0
となっていたら、root file sytem がリードオンリーで
マウントされている。
2:次に e2fsck -p /dev/hda*(*は、各自の環境に置き換えて下さい)を、
Linux パーティションの全てに対して実行する。
途中エラーメッセージが出るかもしれないが、
最後に "Filesystem modified" となって終了すればOK。
念のため、改めて e2fsck を実行してみて、"clean"と出れば
問題無し。
3:次に / を手動でマウントする。コマンドは "mount /dev/hda* / "。
もし、既に / にマウント済とのメッセージが出た場合は、
"mount -n -o remount,rw / /dev/hda*" を実行。
このコマンドの意図は、
-n は /etc/mtab に書き込みをしないで mount を実行、
-o remount,rw は既にマウントされているパーティションを
状態を変えて (ro -> rw) マウントし直す、
最後の "/" はルートパーティションを対象、という意味です。
4:ls -l *sh を実行して、/bin/sh 存在を確認。
<表示例(/bin/sh は存在していません)>
bash
csh -> /etc/alternatives/csh
fdflush
rbash -> bash
5:ln -s bash sh を実行して、sh にシンボリック・リンクを
張ってやる。bash が無い場合は、上記4で表示された
他のシェルを利用。
そして、おまじないとして"sync;sync;sync" を実行しておくと、
安心です。
6:telinit 2 を実行。すると、無事再起動するはず。
以上
田村一平@只今 emacs20 と gnome のアップデートにハマリ中
e-mail: ippei1@xxxxxxxxxxxx