|
SL-C700ではプログラムの動作領域として利用できるメモリの領域が標準では数メガ程度しかありません。そのため、メモリを消費するアプリケーションをいくつか動かしただけで、すぐにメモリ不足に陥り、アプリケーションが落ちたりシステムが不安定になったりします。
メモリ不足は何もSL-C700だけでなく通常のLinuxでも起こることで、この回避方法として通常のLinuxではハードディスク上などに退避場所を作成し、メモリが足りなくなった場合は一時的にの領域を利用するようにしています。この領域の事をスワップファイルといいます。Windowsユーザーには仮想メモリのようなものと言った方がわかる人が多いでしょうか。
SL-C700でも、標準ではサポートされていませんがコンソールなどからコマンドを叩くことで、SDメモリやCFメモリなどのストレージ領域上にswap領域を作成し利用することが出来ます。swapを利用すれば、頻繁に出るメモリ不足のメッセージに悩まされることも減るのですが、メリットばかりではなく、デメリット、というかいくつかのリスクを負う必要があります。まずそのリスクについて十分理解してから、利用するかどうかを検討してください。
・swap領域として確保した領域は通常のストレージとしては利用できない
これは当たり前のことですが、例えば64MのSDカードに32Mのswap領域を確保すると、本当にメモリカードとして利用できるのは残りの32Mだけ、という事になります。
・メモリとして使うことで書き込みが多発し、ストレージ領域の寿命を縮める
一般にSDメモリの書き込み寿命は100万回と言われています。普通に使っていればそれほど気にする必要はありませんが、仮想的にメモリとして利用する場合は書き込みが通常の利用に比べて頻発するので、具体的にどれぐらいという事は出来ませんが寿命は確実に短くなります。
具体的にどれぐらい差があるのかは、100万回書いたことが無いのでわからないのですが。
訂正
すみません、100万回って嘘です。10万回でした。
追記(2003/1/17)
SDカードを販売しているP社に問い合わせたところ、SDカードの書き込みセクタはランダムで選んでいるらしいです。
なので仮想メモリの部分だけがすぐに壊れるという事は無いようです。それと、理論上は大容量のカードの方が寿命は延びるって事になりますね。ただ、パーティションを切ってswapに割り当てている場合はどうなるのかわかりません。
・仮想メモリとして利用しているので、メモリの抜き差しは出来ない
メモリとして常時アクセスが発生している可能性があるので、SL-C700の動作中にメモリを抜くことが不可能になります。無理やり抜くのは非常に危険で、いわば動作中のPCからハードディスクやメモリを引っこ抜くようなものだと考えてください。
(少しオーバーですがそれぐらいに捉えてておきましょう)
データはもちろん、SDカードが破損する可能性がありますし、OSがいかれてフルリセット、という可能性も考えられます。最悪の場合はSDスロットが壊れるかもしれません。最後のはちょっとオーバーかもしれません。
・作成時にタイプミスするとシステムを壊す可能性もある
swapファイルの作成時に利用するコマンド、特にmkswapなどはタイプミスするとディスクを破壊する可能性があるとマニュアルに書かれています。慎重に入力する必要があります。
こんな感じで、最悪の場合はSDカードやデータなどが壊れる可能性があるリスキーな方法だという事を理解しておいて下さい。(swap自体が危険だというわけではなく、簡単に取り外し可能な領域上にswap領域を作るという行為が危険なわけですが、本体メモリ上にswap領域を作成してしまうと今度は本体メモリの寿命を縮める事にもなりますし、SL-C700の場合は本体メモリの読み書きが遅いので必然的にswap領域は外部ストレージ領域上に作ることになり、CFはAirH"などをさすことが多いのでSDメモリ上に作る場合が多くなります。そして外部ストレージ、特にSDメモリは簡単に(CFは引っ張る必要があるけどSDは軽く押し込むだけで)取り外せてしまうので要注意です)
で、swapを作らない方向としてはこんな運用方法があります。
・高速起動オプションを片っ端から外す
アプリケーションの中には高速起動オプションという、メモリを消費する変わりにそのアプリケーションを高速に起動するというオプションを持つものがあります。(Windowsで言えば一太郎の常駐、みたいなものですね)そのオプションを持つアプリケーションはHome画面のアイコンをタップアンドホールドした画面でチェックを入れたり外したりすることが出来ます。

カレンダー、アドレス帳、ToDo、メモ帳、メール、イメージノートなどの高速起動オプションを片っ端から外せば10M以上の空きは確保できるようです。起動や動作に時間はかかるようになりますが、結構有効な手段だと思います。
・アプリケーションを複数起動しない
アプリケーションを複数個一度に起動しなければ、メモリ不足はそれほど頻発する現象ではありません。Netfrontでも、いくつも窓を開いたりしなければ、それほど画像の多くないWebの閲覧なども大丈夫です。
こんな感じで運用方法の工夫でも、メモリ不足は幾分回避できます。
しかし、それでも、例えば大容量のファイルを扱わなければいけないだとか、画像をいくつも開かなければいけないだとか、こういう運用が面倒くさいだとか、何らかの理由でswap領域が必要な人もいるかもしれません。
そういう人は上記のデメリットを踏まえた上で自己責任でswapファイルを作るのも良いかも知れません。
あくまで以下はこちらの記事を参考にしつつ、あれこれ調べてみた自分用のメモです。読んで参考にするのは自由ですが、カードが壊れようが本体が壊れようがシステムが飛ぼうが私も他の誰も手助けできませんのでご了承ください。
SDに32Mのスワップ領域を作る場合を例に手順を説明します
まずターミナルを起動し、以下のコマンドを叩きます。なお、太字になっている部分が実際に入力するコマンド部分です。
bash-2.05$ dd if=/dev/zero of=/mnt/card/.swapfile bs=512
count=65536
ddというのはファイルの変換やコピーを行うコマンドで、このコマンドでスワップに使うファイルを作成します。
of=/mnt/card/.swapfile
にてスワップファイルを作成する場所と名前を指定します。
この場合は/mnt/cardに.swapfileという名前のファイルを作成します。.をつけることで隠しファイルになるので、間違って消す可能性が軽減されます。別の名前、別の場所に作りたい場合はこのof=〜の部分を変更します。
if=/dev/zero
という指定でファイルをゼロで埋めています。これは別に0でなくてもいいのですが、連続した文字列でないといけないし、変える意味も無いのでこのまま使いましょう。
bs=とcount=でスワップ用のファイルのサイズが決まります。
多分ファイルサイズは512*65536÷(1024*1024)=32メガなんだと思います。
64Mにする場合はbs=1024とします。
で、上記ddコマンドを実行し
65536+0 records in
65536+0 records out
のようなメッセージが帰ってくれば成功です。(数分程度かかる場合があります)
次に
bash-2.05$ mkswap /mnt/card/.swapfile
mkswapというコマンドで、作成したswapファイルをswap領域として初期化します。
Setting up swapspace version 0, size = 33550336 bytes
といったメッセージが帰ってくれば成功です。(数分程度かかる場合があります)
それでは現在のメモリの状態を確かめます。
bash-2.05$ su
#
としてスーパーユーザーになり
# free
を実行してみます。
Mem:
Swap:
Total:
の順に現在のメモリ状態が表示されます。SwapのTotalは0になっているはずです。それではswapファイルを有効にしてみます。スーパーユーザーのままで
# swapon /mnt/card/.swapfile
#
を実行します。 成功したら何のメッセージも表示されないで#のプロンプトのみが帰ってくると思うので、そのまま
# free
と入力して再度メモリ状態を確認します。
Mem:
Swap:
Total:
の順に現在のメモリの状態が表示されます。SwapのTotalに32764といった数字が入っていれば、それだけの領域がswap領域として認識されています。
メモリカードは原則取り外し不可能ですが、どうしても取り外したいときにはアプリケーションを全て終了させてターミナルから
bash-2.05$ su
# swapoff /mnt/card/.swapfile
の順に入力し、swap領域を無効化します。
swap領域の使用度合いによって完了する時間が異なりますが、#のプロンプトが帰ってきたらswap領域の無効化は完了です。
通常の手順でカードを取り外しましょう。
カードをさしたタイミングで自動認識させる
SDカードをさしたタイミングで、自動的にswaponする方法があります。
ブート時に自動的にマウントする方法や、カード認識時にマウントする方法など、手段は色々あるのですが、私はカード認識時に自動マウントする方法のほうが、万一swap領域が壊れた時のリスクが少ないかなと素人考えで思っているのでそちらを使っています。(SDカードを抜いておけばカードが認識されない=swap領域もマウントされない ので万一swap領域が壊れたらSDカードを抜いて再起動すればいいかなと思っています。といってもシステムがクラッシュしてしまったら何をさそうが抜こうが関係ないのですが(笑))
SDカードをさした場合の認識作業は/etcにあるsdcontrolというファイルによって行われるようです。
ここにswaponを書き加えてやります。
手順としてはターミナルから
bash-2.05$ su
# cd /etc
# vi sdcontrol
として、viにて赤字の部分を追記します。
viの使い方はこちらを参照。
見てわからない人はやらない方が無難です。
!/bin/sh
#
# sdcontrol 1.0 2001/8/8 21:33:19 (Hideki Hayami)
#
〜中略〜
###### for QPE ######
case "$ACTION" in
'insert')
mount $FSTYPE $FATOPTS $DEVICE $MOUNT_POINT
MOUNT_RES = `mount | grep $DEVICE`
if [ "$MOUNT_RES" = "" ]; then
mount $FSTYPE $DEVICE $MOUNT_POINT
fi
chkmntsh ${MOUNT_POINT}
if [ -d $SMB_MOUNT ] ; then
rm -rf $SMB_MOUNT
fi
ln -s $MOUNT_POINT $SMB_MOUNT
mkdir -p $MOUNT_POINT/$INSTALL_DIR
#echo mount $? >> /tmp/sd
swapon /mnt/card/.swapfile
;;
この方法は2chで見つけたのですが、同様にカードを外すタイミングでswapoffするという方法も書いていたのですが、私はswapoffは自動化せずに手動で意図的に行った方が良いと思っているので今回は方法を記述しません。(っていうか、いくつかそれっぽいところがあって、調査する必要があるのですが、上記の理由から調査する気もありません)
感想
私はそれまでは高速起動オプションは全て切っていたのですが、swapファイルを利用するようになってからいくつかの頻繁に使うアプリケーションには高速起動オプションをつけるようになりました。動作もキビキビして結構いい感じです。
が、あんまりシステムに負荷をかけるのが怖いので、重いアプリケーションはあまり複数起動しないように心がけています。
どのPDAでも、またPCでも、ハードディスクやメモリカードを使用中に抜いてはいけない、というのは常識なのですが、swapを作成するとその領域はOSが使うことになるので、アプリケーションをインストールした場合よりも頻繁に読み書きが発生する事になります。また、アプリケーションを全部終了させたからswapが使用されなくなる、というわけでもありません。(裏でOSが何か別のことに使っている可能性もあります)そのため、メモリカードを気軽に抜けなくなってしまうわけです。
しかし、個人的にはそれほど無茶な使い方をしなければ、さほど神経質になる必要も無いのではないかなとも思いますが、最悪の場合はフルリセットとSDカード一枚オシャカ、という覚悟だけはしておいた方が良いかもしれないですね。
私は以上のことを踏まえた上で快適に使っています。
んー、それと「この記事見てもやりかたわからないので教えてください」とか言われても私にはこの記事以上にわかりやすく説明は出来ないので勘弁してください。
|