LuvBook LB-M150 (Atom N2800; Cedar Trail) に Debian をインストールする
OS レスが選べるということで、Linux を入れるつもりで Mouse Computer LuvBook LB-M150 をぽちった。こいつは CPU が Atom N2800 (Cedar Trail) ということで、サポート OS は Windows 7 の 32bit 版のみ*1、それ以前や 64bit 版にはドライバさえ提供しないということで、Linux で使えるかどうかかなり怪しい機種だったのだけれども、キワモノに突撃したい気分だったのでそうした。
調べてみると Lengda P10QC の OEM らしい。
低速病
とりあえず wheezy の weekly-image でインストールしようとしたときに、kernel が起動してからインストーラの画面が出るまでにえらい時間がかかることに気づいた。やがて RCU stall で Oops が出てくる。
画面がコンソールのときによく出るようで、しかもキーを押しているとなぜかその間だけディスクが動くらしく、とりあえず操作していない間はシフトキーでも押しておいてインストールを完了させた*2。これは Windows 8 の RP を入れようとしてインストーラが表示されるまでの間(と、その後ファイルのコピーをしている間)も同様だったし、ハードウェア構成を調べるために LiveCD として起動した Ubuntu でもそうだった。
起動メッセージを見ていると、kernel が起動した直後はなんともなくて、udev が上がってきたあたりからキーを押していないと先に進まなくなる。これが発病している間に hdparm -t /dev/sda とかやるとキーを押さないと進まなくなり、しかもひどい数値(2MB/s とか)になる。
ぐぐってみたら Ubuntu のフォーラムにもスレッドがあった。
Ubuntu日本語フォーラム / Ubuntu12.04起動時に画面が紫色になり進みません
さらに LKML を検索すると、それらしい記事があった。
Lost interrupts or very slow wake-from-idle on Cedar Trail Atom box
workaround が書いてあるのでありがたくいただく。
(echo -ne '\x01\x00\x00\x00'; exec sleep 1000d) >/dev/cpu_dma_latency </dev/null 2>/dev/null &
これを root のシェルで実行すると、この中で起動している sleep が動作している間は問題が発生しなくなる*3。これを実行してから top を見ていると、キーに触れなくても数秒おきに表示が更新されることで確認できる。
これをシェルスクリプトとして実行したところなぜかうまくいかないので、同等のことを C で実装した。
https://gist.github.com/3900506
このファイルを gcc -g -o cedartrail cedartrail.c などとしてコンパイルし、/usr/local/sbin/ に置いてから起動シーケンス上 udev より先に来るように設定する。Debian 用の initscript をつけておいたので参考に。このプログラムは勝手にバックグラウンドで動いてしかもその間 CPU を使わないので、システム終了時にこのプログラムが kill されるまでは効果が持続するはず*4。2012.11.10追記:↓のカーネルモジュールで実現したほうが、システム起動から終了まで確実にカバーできるので削除
ビデオドライバ
上記低速病に比べればぜんぜんたいしたことない問題だが、Debian wheezy の Linux 3.2 は Cedar Trail のビデオチップに対応していない。これは experimental から Linux 3.5 を入手してインストールすれば解決するようだ。
謎のキーコード 0x7c
dmesg を読んでいると
atkbd serio0: Unknown key released (translated set 2, code 0x7c on isa0060/serio0). atkbd serio0: Use 'setkeycodes 7c' to make it known.
というログがしょっちゅう記録されている。これを黙らせるにはカーネルコマンドラインに i8042.nomux=1 を追加する。