SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2008-06-05(Thu) Fedora9、SDカードチューン

  16GBというのは、多いようで決して十分ではない。でもって、X40にはSDカードスロットが付いているわけで……

  画像の説明

  ……もう16GBいってしまうのであった。そんなに高くはないしね。パーティショニングは以下とした。

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関係のコードのコンパイルを抑制している箇所が見つかった。これって、カーネルのコンパイルオプションでは!?

  カーネルのコンパイルオプションなら、Kconfigに説明があるはず……と、あったッ!! なになに……

# 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という単語が気になるが、サスペンド中に抜き差ししないことを前提にするよ、でないとデータ破壊が起きるよ、というだけのコトのようだ。つーか、現状でもサスペンド中に抜き差ししなくてもブッ壊れてしまうんですけど……。

  基本的にSDカードの抜き差しがない組み込み機器に対して使うオプションであり一般には使わない機能、ともあるが、オイラはHDDの代わりに使うのだから、そもそも抜き差しするつもりはない。やっちまえ。

  設定にはモジュールのコンパイルが必要になるが、縁起物なので、最新カーネルのソース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」としてインストールし、再起動、新しいカーネルを選択して起動しよう。

  で、ドキドキしながら、サスペンド……レジュームッ!! 何度やっても壊れないッ!! やったーッ!!

  なお、ソースを見る限り出力されるはずのサスペンド、レジューム時のメッセージが出ないので不審に思って調べを進めたところ、そもそもRicohのR5C822に対応するモジュールは、ricoh_mmcではなくsdhciであった。

  とりあえずディスク領域が32GBに拡張され、現在至高のThinkPadであるX300の半分まで来た。こちとら、5万円ソコソコでメインメモリは1.5GBとX300より上どわッ!! と、異様に遅いSSDへの書き込み速度を棚に上げて悦に入りつつ、おやすみである。