[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