2009/11/13(金)Ubuntu9.10なmbookでサスペンド
初期の状態でサスペンドを行うとmbookはフリーズして失敗し、BIOSでSDIO Controllerをdisabledにするとサスペンドが成功することから、USB周りがあやしいと思っていました。無線LANのフリーズの時は苦労したので、今回もきついかな、と思いつつ検索してみるとなんてことはなく、SDカードをマウントしたままサスペンドするとフリーズしてしまうのは割と有名なbugでした。
解決方法は簡単で、サスペンド前にSDカードをアンマウントするだけです。もっともアンマウントし忘れると大変なので、サスペンドをしたら自動でアンマウントするようにします。
サスペンドに入る前
$ sudo vi /usr/sbin/pm-suspend ================# SD card unmountunmount /media/microsd# The rule here? Simplicity. export STASHNAME=pm-suspend
【追記】pm-suspendは変更しないで、下述の00umountchvtにアンマウント処理を入れます
ビデオドライバ
次は復帰に関してなのですが、その前にnblogの中の人のmbookのビデオドライバについて説明しておきます。前回9.10のインストールときは、9.04用psbドライバを流用する方法を説明しましたが、今は9.10に対応したPPAを利用しています。9.10からはPPAの組み込みが簡単になりました。$ sudo add-apt-repository ppa:kalon33/ppa3Dは使わないので、最小限の4つだけ利用しています。
- psb-kernel-headers
- psb-kernel-source
- psb-modules
- xserver-xorg-video-psb
サスペンドからの復帰
話を戻してサスペンドからの復帰です。初期の状態ではサスペンドから復帰すると画面が崩れてしまう場合と、ブラックアウトになる場合があるようです。画面が崩れた場合は Ctrl+Alt+F1 で仮想端末に切り替えてから、Ctrl+Alt+F7 で復帰できます。ブラックアウトになってしまった時は仮想端末を切り替える方法が使えないので、acpi-support の DOUBLE_CONSOLE_SWITCH=true についているコメントを外し、ブラックアウトが起こらないようにします。
$ sudo vi /etc/default/acpi-support
================
# Uncomment the next line to switch away from X and back again after resume.
# This is needed for some hardware, but should be unnecessary on most.
DOUBLE_CONSOLE_SWITCH=true
最後に画面の崩れ対策です。崩れないようにできればいいのですが、これはビデオドライバが原因のようです。psbドライバを組み込まないでサスペンドさせると、画面がまったく崩れません。
画面の崩れは Ctrl+Alt+F1 のあと Ctrl+Alt+F7 で復帰できるので、これを自動実行するスクリプトを作成します。/etc/pm/sleep.d に実行ファイルを置いておくとサスペンド時に実行されるので、00umountchvt というファイルを作成してパーミッションを755にしておきます。中身は以下の2行です。
chvt 1 chvt 7chvtは仮想端末の切り替えを行うコマンドで、とりあえずこれで目的は果たせるのですが、これだとサスペンドに入るときと復帰時の2回実行されてしまうのでもう少し修正します。
検索していたら見つけた、サウンドドライバをサスペンドの復帰時に読み直すスクリプトらしいのですが流用させてもらいます。
【追記】SDカードのアンマウント処理を追加しました。
case "$1" in hibernate|suspend) [ -b /dev/mmcblk0p1 ] && umount /dev/mmcblk0p1 ;; thaw|resume) chvt 1 chvt 7 ;; *) exit $NA ;; esac
まとめ
以上で自分の場合はサスペンドがうまくいくようになりましたが、環境が違うと、この方法でうまくいくかわかりません。SDカードのマウントでフリーズする辺りは、早々に修正されそうな気もします。ちなみにnblogの中の人は、まったくと言っていいほどサスペンドを使わないので、修正が来ても気づかないかもしれません。
2009/10/31(土)mbookでUbuntu9.10
RCからのアップグレードで問題なさそうだったのですが、いろいろ手を加えまくったのでもう1度クリーンインストールしつつまとめてみました。ほとんど以前の記事の手直しになります。
- インストール
- 解像度を1024x600にする
- タッチパネルを使えるようにする
- 音を出す
- 無線LANを使えるようにする
- 内蔵HSDPAでWWAN通信
- まとめ
インストール
mbookの起動時にFn+F11でUSBメモリから起動し、いつものようにインストールします。インストール自体は特に問題ないのですが、リリースに不具合として「ext4 ファイルシステムでは巨大なファイルが破損する恐れがあります」というのが上がってましたので、動画などで512MB以上のファイルを扱う場合は注意が必要かも(問題ないという話もあり)しれません。ちなみにクリーンインストールだとext4でフォーマットされます。作業が多いので、内蔵無線LANが使えるようになるまでは、挿すだけで使えるUSB接続のLANアダプタ(有線無線問わず)があると便利です。
解像度を1024x600にする
以前からUbuntuのwikiに、HardwareSupportComponentsVideoCardsPoulsboというのが上がっていて、今でもこの方法が主流のようです。これをスクリプトにしたページがありますので、比較的お手軽にpsbドライバを組み込めると思います。wget http://gma500re.altervista.org/scripts/poulsbo.sh && sh ./poulsbo.sh個人的にはレポジトリでまとめてインストールするのが好みなので、Lucazade(gma500)に期待していたのですが、xserver-xorg-video-psbがFailed to buildのままで残念でした。xserver-xorg-video-psb以外をインストールしても、結局最後の部分で手動が入るので、上記にあるGMA500REのスクリプトでインストールするのが楽だと思います。
スクリプトを実行して、再起動すると1024x600になります。
タッチパネルを使えるようにする
- 解像度を1024x600にしてから作業に入ります。
- GalaxTouchDriver から該当するファイル(自分の場合は2.06.2905)をダウンロードします。
- 展開して setup.sh を実行し、途中の選択肢は[2]PS/2 を選びます。
- /etc/init.d/rc.local の case “$1” inの前に echo -n serio_raw > /sys/bus/serio/devices/serio4/drvctl と付け加えます。
- 再起動後、eGalaxTouchを起動して、Toolタブから4点キャリブレーションで調整して設定終了です。
音を出す
/etc/modprobe.d/alsa-base.conf に以下の2行を追加します。alias snd-card-0 index=0 options snd-hda-intel model=basic再起動後、ターミナルで alsamixer を実行して、右から2番目にあるMonoのボリュームを大きくします。
無線LANを使えるようにする
ファームウェアの準備- firmwareをダウンロードしてきます。
- 展開してFwImageの中にある、helper_sd.bin を sd8686_helper.bin に名前を変えます。
- sd8686_helper.bin と sd8686.bin を /lib/firmware にコピーします。
ビルド環境の構築
まずはビルド環境を整えます。
$ sudo apt-get install build-essential kernel-package libncurses5-dev libqt3-mt-dev $ sudo apt-get install linux-source-2.6.31 $ cd /usr/src $ sudo tar xvjf linux-source-2.6.31.tar.bz2 $ cd linux-source-2.6.31 $ sudo cp /boot/config-2.6.31-14-generic .config $ sudo make oldconfig
libertasの修正
以下、/usr/src/linux-source-2.6.31/ で作業します。
libertas-dev mailing listのログにあったsd8686 linux system hang when associating to access pointからの流れが解決方法で、後半には差分が書かれてるのですが、2.6.29で取った差分らしく、9.10(karmic)のカーネル2.6.31だと微妙に違っていてうまくいきません。
2.6.31用に直したのが以下のテキストですのでコピーして libertas.patch など適当な名前で保存しておきます。
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 6850981..ede1c5b 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c @@ -1496,6 +1496,13 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, ret = lbs_cmd_fwt_access(cmdptr, cmd_action, pdata_buf); break; + case CMD_802_11_GET_LOG: + cmdptr->command = cpu_to_le16(CMD_802_11_GET_LOG); + cmdptr->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_get_log) + + S_DS_GEN); + ret = 0; + break; + case CMD_GET_TSF: cmdptr->command = cpu_to_le16(CMD_GET_TSF); cmdptr->size = cpu_to_le16(sizeof(struct cmd_ds_get_tsf) + diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c index c42d3fa..4fe93b4 100644 --- a/drivers/net/wireless/libertas/cmdresp.c +++ b/drivers/net/wireless/libertas/cmdresp.c @@ -189,7 +189,21 @@ static int lbs_ret_802_11_bcn_ctrl(struct lbs_private * priv, priv->beacon_period = le16_to_cpu(bcn_ctrl->beacon_period); } + lbs_deb_leave(LBS_DEB_CMD); + return 0; +} + +static int lbs_ret_802_11_get_log(struct lbs_private * priv, + struct cmd_ds_command *resp) +{ + struct cmd_ds_802_11_get_log *log = &resp->params.log; + lbs_deb_enter(LBS_DEB_CMD); + priv->wstats.discard.retries = get_unaligned_le32(&log->retry); + priv->wstats.discard.code = get_unaligned_le32(&log->wepundecryptable); + priv->wstats.discard.misc = get_unaligned_le32(&log->ackfailure); + lbs_deb_leave(LBS_DEB_CMD); + return 0; } @@ -266,7 +280,9 @@ static inline int handle_cmd_response(struct lbs_private *priv, case CMD_RET(CMD_802_11_BEACON_CTRL): ret = lbs_ret_802_11_bcn_ctrl(priv, resp); break; - + case CMD_RET(CMD_802_11_GET_LOG): + ret = lbs_ret_802_11_get_log(priv, resp); + break; default: lbs_pr_err("CMD_RESP: unknown cmd response 0x%04x\n", le16_to_cpu(resp->command)); diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h index c8a1998..7ce35fc 100644 --- a/drivers/net/wireless/libertas/hostcmd.h +++ b/drivers/net/wireless/libertas/hostcmd.h @@ -771,6 +771,7 @@ struct cmd_ds_command { /* command Body */ union { + struct cmd_ds_802_11_get_log log; struct cmd_ds_802_11_ps_mode psmode; struct cmd_ds_802_11_get_stat gstat; struct cmd_ds_802_3_get_stat gstat_8023; diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c index 8bc1907..9e0d161 100644 --- a/drivers/net/wireless/libertas/wext.c +++ b/drivers/net/wireless/libertas/wext.c @@ -788,7 +788,6 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev) int stats_valid = 0; u8 rssi; u32 tx_retries; - struct cmd_ds_802_11_get_log log; lbs_deb_enter(LBS_DEB_WEXT); @@ -830,13 +829,8 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev) quality = rssi_qual; /* Quality by TX errors */ - priv->wstats.discard.retries = dev->stats.tx_errors; - memset(&log, 0, sizeof(log)); - log.hdr.size = cpu_to_le16(sizeof(log)); - lbs_cmd_with_response(priv, CMD_802_11_GET_LOG, &log); - - tx_retries = le32_to_cpu(log.retry); + tx_retries = priv->wstats.discard.retries; if (tx_retries > 75) tx_qual = (90 - tx_retries) * POOR / 15; @@ -852,9 +846,9 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev) (PERFECT - VERY_GOOD) / 50 + VERY_GOOD; quality = min(quality, tx_qual); - priv->wstats.discard.code = le32_to_cpu(log.wepundecryptable); +// priv->wstats.discard.code = le32_to_cpu(log.wepundecryptable); priv->wstats.discard.retries = tx_retries; - priv->wstats.discard.misc = le32_to_cpu(log.ackfailure); +// priv->wstats.discard.misc = le32_to_cpu(log.ackfailure); /* Calculate quality */ priv->wstats.qual.qual = min_t(u8, quality, 100); @@ -864,6 +858,9 @@ static struct iw_statistics *lbs_get_wireless_stats(struct net_device *dev) /* update stats asynchronously for future calls */ lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0, 0, 0, NULL); + + lbs_prepare_and_send_command(priv, CMD_802_11_GET_LOG, 0, + 0, 0, NULL); out: if (!stats_valid) { priv->wstats.miss.beacon = 0;
差分はgitで当てます。
$ sudo apt-get install git-core $ sudo git apply libertas.patch
カーネルビルドをmbookで行うと5時間以上かかるので、ドライバのみビルドします。
$ sudo cp /usr/src/linux-headers-2.6.31-14-generic/Module.symvers ./ $ sudo make modules_prepare $ sudo make M=drivers/net/wireless/libertas
ドライバの組み込み
無線がONになってる場合は、WLAN-BTボタンを押して、無線をOFFにしてから組み込まれてるドライバをはずします。
$ sudo modprobe -r libertas_sdio libertas/lib/modules/2.6.31-14-generic/kernel/drivers/net/wireless/libertas/ に現在のドライバがあるので、(使わないと思いますが)一応バックアップしておきます。./drivers/net/wireless/libertas/ にビルドしたドライバ libertas.ko と libertas_sdio.ko が出来上がってるのでmodulesの方へコピーして、念のため depmod -a をしておきます。
WLAN-BTボタンを押して、dmesgやlsmodで新しいドライバが組み込まれたか確認します。
NetworkManagerで無線の設定をして、固まらなければ成功です。カーネルイメージのバージョンアップがあるたびに libertas.ko と libertas_sdio.ko をコピーするのを忘れないようにします。
内蔵HSDPAでWWAN通信
mbookに内蔵されているのは、C-motech CHE-628Sというモデムです。lsusb で確認すると以下のように表示されます。Bus 004 Device 002: ID 16d8:6007 CMOTECH Co., Ltd.しかし、usbserialのドライバがまだ入っていないので、ttyUSB*が存在しません。ですので、まずはudevにドライバの組み込み設定をします。/etc/udev/rules.d/50-local.rules というファイルを作成して、次のような中身にします。
SUBSYSTEM=="usb", SYSFS{idProduct}=="6007", SYSFS{idVendor}=="16d8", RUN+="/sbin/modprobe usbserial vendor=0x16d8 product=0x6007"
再起動すると、/dev以下に ttyUSB0~2 まで出来るはずです。あとは gnome-ppp をインストールして設定していきます。モデムは /dev/ttyUSB1 を使用、Options の Check carrier line のチェックを外す、を注意しておけば大丈夫だと思います。




まとめ
かなり長文になりましたが以上がmbookにUbuntu9.10をインストールする方法になります。所持していないのでわかりませんが、おそらく工人舎のPMシリーズもほぼ同様にインストールできると思われます。webカメラはあいかわらずWindowsで起動(Fn+B)してから、再起動しないと使えない(PMはBIOSで設定できる)し、内蔵モデムもNetworkManagerから使用できない(こちらはもう少し)などまだまだ課題が多いのですが、とりあえず9.04で出来ていたことは最低限なんとかなっていると思います。
ビデオドライバ(psb)がおかしいのと省電力関係(USB周り)に不具合があるっぽいので、サスペンドやハイバネーションは今のところ厳しいかもしれません。この辺りはビデオドライバを無理矢理インストールしてるので、ある程度仕方ないかもしれません。
【追記】サスペンドに関しては別記事にまとめてみました。
半年付き合うことになるので、少しずつ解決していきたいと思います。
2009/10/28(水)さくらのフレッツ接続
さくらのフレッツ接続は、サービス開始の2004年10月から利用していたのでちょうど5年になります。当時は光回線(Bフレッツ)で追加料金なしに固定IPアドレスを割り振ってくれるところはほとんどなくて、月980円で固定IPアドレス付き、というのはとても助かりました。2007年9月から新規受付中止になったので、そろそろやばいのかなと思っていましたが、よく2年もったと思います。
いきなりなくなると困るので、もう1セッション(Bフレッツは2つまで)をASAHIネットにして平行して使っていましたが、これも去年固定IPアドレスが別料金になってしまいました。2008年6月に、500円で固定IPアドレスというサービスが始まったので、そちらに移行して、回線を遊ばせておくのはもったいないので、nblogを始めました。
現在、nblogは月500円で運用されてます
(電気代もかかってます)
話が脱線しましたが、乗り換えたDIXも年払いだと10780円(月898円)なので、固定IPアドレス付きと考えれば結構お安いと思います。自分は気にしないのでよくわからないのですが、ネットの評判だと速度は遅いらしいです。i-revoも1日5GBの制限がありますので、ヘビーな使い方をする人は厳しいでしょう。低価格で誰もが満足できるプロバイダというのはなかなか難しいかもしれません。個人的には固定IPアドレス付きのメリットが大きいのでどちらのプロバイダもかなり満足しています。
というわけで(?)、さくらのフレッツ接続、5年間ありがとうございました。
2009/10/25(日)mbookでUbuntu9.10RC
9.10ベータのときは半べそ状態でしたが、コツコツ設定をして、9.04とほぼ同じ環境ができあがえっていたりします。一応すでにできていることをまとめると、
- 解像度は1024x600
- タッチパネルOK
- 無線LANはNetworkManagerで設定
- 音は大音量
- 内蔵HSDPAでWWAN通信
解像度は1024x600
PPAの方は、いくつかのファイルはkarmicの方に上がってきてるのですが、xserver-xorg-video-psb のStatusがまだFaildなので、これが上がればおそらく souece.list に追加するだけで使えるようになると思います。今はまだ9.04のドライバを使いまわしするのが主流みたいです。手順は何通りかあるのですがやってることはどれも一緒な状態です。
タッチパネルOK
Xのバージョンが特に大きく変わったわけではないので、解像度の設定ができればそのまま動作します。
無線LANはNetworkManagerで設定
無線のドライバをビルドしなおして、使えるようになります。ドライバを作り直さない限りはフリーズ問題がつきまといますので、これが一番敷居が高いかもしれません。
音は大音量
9.04と同じ設定で音が出ます。
内蔵HSDPAでWWAN通信
これも9.04と同じなんですが、なんか適当にいぢっていたら、NetworkManagerに内蔵モデムからの接続が表示されたので、現在はgnome-pppを使わないで、NetworkManagerからHSDPA接続をする設定を調べているところです。以前は nm-modem-probe を用いてNetoworkManagerがモデムの識別を行っていたのですが、9.10からこの辺りが大きく変わって、今回は modem-manager というのを使ってるっぽいのですが、まだ情報が少なくて追いかけてる最中です。
というわけで(おそらく)安心して9.10にアップグレードできそうです。
2009/10/16(金)UbuntuなmbookでNetworkManagerを使う
最初に
mbookはSDIO接続のsd8686という無線LANカードが入っています。これをUbuntuで使うためには以前書いた通りで、メーカーのサイトからファームウェアをダウンロードし、sd8686.bin、sd8686_helper.bin という名前にして /lib/firmware に置きます。
しかし、sd8686のドライバ本体であるlibertasの挙動がおかしいのかことあるごとにフリーズしてしまい、使い物になりません。iwconfigで手動設定すれば使えますし、最悪それでも構わないのですが、友人にmbookを自慢するときに無線の接続がコマンドだったりすると(少なくともnblogの中の人は)がっかりしてしまいます。
moblinで遊んでいるときに知った、Connection Managerのconnmanを使うことにより、無線もGUIで接続可能になりましたが、Ubuntu9.04のconnmanはバージョン0.4とまだ低いため、お世辞にも安定しているとは言えません。おまけに9.10ベータではそのconnmanですら使えなくなってしまいました。connmanの方は正式版でどうなるかまだわかりませんが、NetworkManagerはカーネル(に含まれているドライバ)依存っぽいのであいかわらずフリーズすると思われます。
ということで、自分では原因を突き止められないので、ひたすらgoogle先生にがんばってもらいなんとか解決できたのでまとめておきます。
ビルド環境の構築
結論から書くと、ドライバ(libertas)のSourceを変更して作り直す作業になります。ですので、まずはビルド環境を整えます。
$ sudo apt-get install build-essential kernel-package libncurses5-dev libqt3-mt-dev $ sudo apt-get install linux-source-2.6.28 $ cd /usr/src $ sudo tar xvjf linux-source-2.6.28.tar.bz2 $ cd linux-source-2.6.28 $ sudo cp /boot/config-2.6.28-15-generic .config $ sudo make oldconfig
参考サイト
dogmap.jp - カーネル再構築のススメ
libertasを手直し
libertas-dev mailing listに流れていたsd8686 linux system hang when associating to access pointが解決方法なので一連の流れに目を通しておきます。そしてあとのほうで流れてきたpatchを当てます。差分はgitで当てるのですが、そんなに量があるわけではないので手作業でも大丈夫かと思います。
参考サイト
Design Recipe 別館 Blog - Git の使い方の基本の"き"
このままビルドするとエラーが出るので、それを直します。もっともnblogの中の人はプログラムも英語もよくわからないので適当に直しました。詳しい人が見て補完してくれると助かります。以下2ヶ所がpatchを当てた後に自分が直したところです。
1つ目:wext.cでlog構造体が定義されてないというエラーが出たのでコメントアウトします。
/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas/wext.c // priv->wstats.discard.code = le32_to_cpu(log.wepundecryptable); // priv->wstats.discard.misc = le32_to_cpu(log.ackfailure);2つ目:ヘッダーに依存するエラーが出るので頭の方に付け加えます。
/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas/cmdresp.c #include <asm/unaligned.h>
ビルドしてエラーがでなければ、/usr/src/linux-source-2.6.28/drivers/net/wireless/libertas 以下に各種koファイルが出来上がるので、それを組み込みます。
$ sudo make-kpkg clean $ sudo make-kpkg --initrd --revision=test01 kernel_image kernel_headers以前は./script以下をいじって、ドライバだけビルドした記憶があるのですが、構成が変わってしまったのかファイルが見当たりませんでした。今回はカーネルの設定も変更したので、カーネルごとビルドしましたが、ドライバが目的ならlibertas関連だけビルドすれば大丈夫だと思います。
ドライバの組み込み
無線がONになってる場合は、WLAN-BTボタンを押して、無線を切ってから組み込まれてるドライバをはずします。
$ sudo modprobe -r libertas_sdio libertas/lib/modules/2.6.28-15-generic/kernel/drivers/net/wireless/libertas 以下にある現在のドライバをバックアップして、ビルドした libertas.ko と libertas_sdio.ko をコピーします。
WLAN-BTボタンを押して、dmesgやlsmodでドライバが組み込まれたか確認します。
NetworkManagerで無線の設定をして、固まらなければ成功です。Kernelイメージのバージョンアップがあるたびに libertas.ko と libertas_sdio.ko をコピーするのを忘れないようにします。
2.6.31なカーネルではまだ動作確認してないのですが、たぶん同じように修正できると思います。ここ1週間ほど、NetworkManagerで運用していますが、サスペンドからの復帰もこなしてくれるので、とても便利になりました。libertasを入れ替えているので、Wicdにしても固まることはありません。あと2週間ほどで9.10が出てしまいますが、とりあえず9.04での環境構築は終了といった感じです。