SVX日記
2008-06-05(Thu) Fedora9、SDカードチューン
Disk /dev/mmcblk0: 16.0 GB, 16071000064 bytes
4 heads, 16 sectors/track, 490448 cylinders
Units = シリンダ数 of 64 * 512 = 32768 bytes
Disk identifier: 0x0c2b7c5b
デバイス Boot Start End Blocks Id System
/dev/mmcblk0p1 465 429200 13719552 83 Linux
/dev/mmcblk0p2 429201 459824 979968 83 Linux
/dev/mmcblk0p3 459825 490448 979968 83 Linux
というのも、起動ディスクにしているコンパクトフラッシュもそうだが、あまり細かく分割してしまうと、容量が逼迫してきた時にやっかいなことになる。LVMというテもあるが、緊急事態が発生した場合を考えると、オイラはあまり好きではない。
だが、ベッタリ全域を確保してしまうと、ちょっとファイルシステム関係のテストをしたいとか、WindowsとやりとりするためにVFAT領域が必要だとか、そんな時に困るのだ。だからそこそこの容量(例えばCDのisoイメージが入る程度)を別に区切っておく。今回は1GBをふたつ確保してみた。なお、使わない時はスワップ領域にしておいてもいい。swapon, swapoffでいつでも付け外しできるからね。
X40は、非常に安定してサスペンド、および、レジュームができて、大変によろしい。いまや、ノートPCにとってはサスペンド機能は必須機能ともいえる。しかしその都度、SDカードの領域がブッ飛んでしまっては致命的である。
どうも、レジュームの際、SDカードドライブに新たに別のデバイス名が振られているあたりの挙動がアヤしい。別にデバイス名が変わっても、サスペンド前にアンマウントしておけば問題ないだろうが、オイラは電車の中でPCを使うので、降りる駅が近づくのを見越してアンマウント、なんてとてもやってられんのだ。
逆転の発想で、可動部のないSSDなんだから「電源入れたまま持ち運ぶ」というのもアリだろうが、それもなぁ。フタ閉めると、熱が逃げないのもちょっとイヤンな感じだし。時々なら、コンパイル通勤、なんてもオツだけども。
どうにかしたいので、下調べから始める。lspciすると、搭載されているSDカードコントローラはRicohのR5C822というヤツらしい。カーネルソースに潜ると、/usr/src/linux/drivers/mmc/hostの下にricoh_mmcってのがある。コレかな?
どうにもならないような気もしながらも「grep -ri suspend *」みたいな悪あがきをすると……アレ? Suspending, Resumingみたいなシステムログを出すコードがあるんですが……もしかして機能は潜在してるの!?
さらに、広くsuspendをキーにソースを漁ると/usr/src/linux/drivers/mmc/core/mmc.cの中にCONFIG_MMC_UNSAFE_RESUMEという定義の有無によって、suspend関係のコードのコンパイルを抑制している箇所が見つかった。これって、カーネルのコンパイルオプションでは!?
# view /usr/src/linux/drivers/mmc/core/Kconfig
#
# MMC core configuration
#
config MMC_UNSAFE_RESUME
bool "Allow unsafe resume (DANGEROUS)"
help
If you say Y here, the MMC layer will assume that all cards
stayed in their respective slots during the suspend. The
normal behaviour is to remove them at suspend and
redetecting them at resume. Breaking this assumption will
in most cases result in data corruption.
This option is usually just for embedded systems which use
a MMC/SD card for rootfs. Most people should say N here.
……DANGEROUSという単語が気になるが、サスペンド中に抜き差ししないことを前提にするよ、でないとデータ破壊が起きるよ、というだけのコトのようだ。つーか、現状でもサスペンド中に抜き差ししなくてもブッ壊れてしまうんですけど……。
設定にはモジュールのコンパイルが必要になるが、縁起物なので、最新カーネルのソースRPMを持ってきて、ついでにカーネルのアップデートもしてしまおう。「# rpm -ivh kernel-2.6.25.3-18.fc9.src.rpm」としてソースを展開して「# vi /usr/src/redhat/SOURCES/config-generic」としてコンパイルオプションを手動で変更する。変更点は以下だ。
# CONFIG_MMC_UNSAFE_RESUME is not set
CONFIG_MMC_UNSAFE_RESUME=y ※追加
でもって「# rpmbuild -ba --target=i686 --with baseonly --without debuginfo /usr/src/redhat/SPECS/kernel.spec 」でカーネルをコンパイル。
ちなみに、オイラの環境では完了までに7時間かかった。サッサと終わらせたい人は、別のマシンでビルドするといい。別のマシンでなくても、USBのHDD上や、NFS上でコンパイルするだけでも相当違ってくると思われる。
カーネルのRPMパッケージは「/usr/src/redhat/RPMS/i686」の下に「kernel-2.6.25.3-18.fc9.i686.rpm」として生成される。「# rpm -ivh kernel-2.6.25.3-18.fc9.i686.rpm」としてインストールし、再起動、新しいカーネルを選択して起動しよう。