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 らしい。

dmesg と dmidecode

https://gist.github.com/3900321

以下は踏んだ地雷の記録。

低速病

とりあえず 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 されるまでは効果が持続するはず*42012.11.10追記:↓のカーネルモジュールで実現したほうが、システム起動から終了まで確実にカバーできるので削除

13:05 追記:カーネルモジュール書いたった。

https://github.com/autch/pm_qos_req

これをコンパイルしてできた pm_qos_req.ko を initrd で読みこむようにすると Linux 起動から終了まで普通に動くようになるはず。副作用は電池の減りが早くなることか。使い方は id:autch:20121102#1351829004 に書いた。

ビデオドライバ

上記低速病に比べればぜんぜんたいしたことない問題だが、Debian wheezy の Linux 3.2 は Cedar Trail のビデオチップに対応していない。これは experimental から Linux 3.5 を入手してインストールすれば解決するようだ。

2012/11/2 追記

experimental の Linux 3.5 だと、pm_qos_req の存在にかかわらず initrd で udev を読み込んだあたりでハングするようになってしまった。仕方ないので kernel.org から本家 Linux 3.6 のソースを入手してビルド・インストールし、いまは普通に使っている。ただし上記 pm_qos_req のインストールはいまだ必要。

謎のキーコード 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 を追加する。

*1:メモリは 4GB 標準搭載なのに、OS が 32bit のみなので上限は 2.9GB

*2:シフトキーでも進展がないときは、Fn + F2(無線LAN On/Off)とかも連打するといける(ぇー

*3:ps すると sleep が居残っているが、これを kill すると効果がなくなる。

*4:kill された後システムがシャットダウンや再起動するまではキー連打で耐えるべし(ぇー