読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

xorg-xserver-input-evdev をアレしてから復旧するまで

症状

xorg-xserver-input-evdev をダウングレードしたところ X 上で全ての操作ができなくなった
GRUB2 の設定で GRUB menu が表示されないようになっていたためリカバリモードが起動できない


全ての入力を司るドライバが死んでしまったので起動したのち,ログイン画面からまったく進むことができなくなった.もちろん戻ることもシャットダウンすることもできない.リカバリモードで起動できれば復旧の見込みがある.しかし Ubuntu 単体でインストールしている場合デフォルトでは GRUB menu は表示されずリカバリモードに移行ができない.現在 Ubuntu が採用しているのは GRUB2 とよばれるバージョン.通常であれば shift キーを押しっぱなしで起動すると GRUB menu が表示されるはずであるが GRUB loading. が表示されるだけでいくらがんばってもメニュー画面は表示されず.


という状態から復旧までの道のりは以下から.

目標

xorg-xserver-input-evdev を再インストール
GRUB2 の設定ファイルを書き換えて GRUB menu が表示されるようにする

復旧手順

1. USB 起動ディスクの作成
2. live image から GRUB2 設定ファイルを変更
3. recovery mode の netroot でログインしてアップグレード

1. USB 起動ディスクの作成

他のマシンを利用.今回は Ubuntu で起動ディスクの作成.インターネットから Ubuntu 10.04 の iso イメージを取得.たとえば ここ からダウンロードできる. iso イメージは適当な場所に保存.空の USB メモリを差す. System->Administration->Startup Disk Creator を起動して iso イメージと USB メモリを選択する.このとき USB メモリを正しくフォーマットしておかないとインストールできない.フォーマットはどうプログラムから実行できる.だいたい 5 min. 程度でインストールは完了する.

2. live image から GRUB2 設定ファイルを変更

USB メモリを差して起動する.あらかじめ BIOS の設定で USB メモリがハードディスクよりも優先されることを確認しておく*1.起動したら該当のハードディスクをマウントする. Ubuntu 10.04 では nautilus を開いて適当にダブルクリックするとマウントしてくれる.

マウントができたら端末を開く.この段階での目標は /boot/grub/grub.cfg/etc/default/grub を書き換えてリカバリモードで起動できるようにすること.である.

grub.cfg の中身には以下のようなセクションが存在する.ここに存在する set default を変更することで起動されるカーネルなどを指定できる.普通なら最新のカーネルは 0 番で対応するリカバリモードは 1 番なので,リカバリモードで起動したければ set default=1 と変更する.

### BEGIN /etc/grub.d/00_header ###
load_env
set default=0                       # ここの値を変更する
if [ ${prev_saved_entry} ]; then
  saved_entry=${prev_saved_entry}
  save_env saved_entry
  prev_saved_entry=
  save_env prev_saved_entry
fi

なお, grub.cfg は自動生成ファイルなのでこのファイルを直接編集することは推奨されていない.しかし今回は live image での起動なので更新コマンド(update-grub2)を実行することができないため苦肉の策として直接更新する.

ついでなので本来の設定ファイル /etc/default/grub にも変更を加えておく.再ログインした際に update-grub2 を実行することで grub.cfg に変更を反映することができる.

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=saved
#GRUB_HIDDEN_TIMEOUT=3                    # ここをコメントアウト
#GRUB_HIDDEN_TIMEOUT_QUIET=false          # ここをコメントアウト
GRUB_TIMEOUT=-1                           # 0 だったものを -1 に変更
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

GRUB_DISTRIBUTOR=Ubuntu
GRUB_GFXMODE=1280x800           

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
# GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entrys
#GRUB_DISABLE_LINUX_RECOVERY=true

GRUB_HIDDEN_TIMEOUTGRUB_HIDDEN_TIMEOUT_QUIETGRUB menu を起動するかどうか質問する画面を隠すための設定.特にGRUB_HIDDEN_TIMEOUTが 0 に設定されていると自動的に GRUB_DEFAULT が起動されてしまうのでコメントアウトする.また GRUB_TIMEOUT を -1 に設定することで強制的に GRUB menu を立ち上げるように設定.

GRUB2 に関する詳しい内容については以下のサイトから.

3. recovery mode の netroot でログインしてアップグレード

grub.cfg のおかげで自動的にリカバリモードが立ち上がるようになっている.リカバリモードでは netroot (ネットワーク有で root ログイン) を選択してコンソール画面に落ちる)*2.忘れないうちに update-grub2 コマンドで grub.cfg を更新しておく.目標はキーボードドライバのアップデートなのでまずはネットワークをつなぐ.

たまたま DHCP を使えない環境にあったので与えられた固定 IP を設定して接続する.普段は GUI (nm-applet) で設定していたのだけど現時点では使用不可能なので /etc/network/interfaces/etc/resolv.conf を直接編集する.

## /etc/network/interfaces ##
auto lo
iface lo inet loopback


auto eth0
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask xxx.xxx.xxx.xxx
gateway xxx.xxx.xxx.xxx
## /etc/resolv.conf ##
nameserver xxx.xxx.xxx.xxx
nameserver xxx.xxx.xxx.xxx

ネットワーク設定に関しては以下のサイトから.


この状態でネットワークを起動 (sudo service networking start) すれば無事にインターネットに接続できる.そこで apt-get update & upgrade を実行すればめでたくダウングレードしてしまった入力デバイスドライバを更新できる.あとは exit で抜けてリカバリメニューから通常の起動を選択すればよい.マウスやキーボードがきちんと動いていることを確認して復旧完了となる.

おつかれさまでした.

*1:なお X200 では F1 キーが BIOS 設定画面の起動キーになっている

*2:USキーボードを使っているのですが日本語キーボードとして認識されていたためいろいろと大変でした