Tech:android:parted

出典: Tariki

目次

SDカードのパーティショニング

公式ROMでは必要とされていないが、ROMによってはSDカードをパーティショニングして、Linuxのext2またはext3パーティションが必要という場合がある。またLinux swapが必要という場合がある。

逆に公式では、SDカード全体が1パーティション・FAT32領域になっていればよい。これはデータ領域としてしか使わないためである。

SDカードのパーティションの役割分担

FAT領域

FAT領域はもちろん、PCとUSB接続をしてandroidからunmountしPCにmountしたとき、USBフラッシュメモリのようにみえる。このためにFAT領域はFATである必要がある(何のこっちゃ)。

ext2/3 (4)パーティション

ext2/3パーティションはandroid OS (Linux) で使う分にはFAT32領域より速い。というか特殊なことをしないでandroidで使うディスクはext2/3なのである (SDカードのFAT32領域が使えているのは、『特殊なマウント』をしているからである)。ROMによってはext4フォーマットに対応している場合もあるが、まあext3なら間違いはないだろう。

この領域が何に使われるかというと、a2sd (app2sd)という枠組みで使われる。本体フラッシュメモリ上の/app/、/data/をSDカード上に追い出してしまい、本体の空きを多くする(つまり大量のアプリケーションを本体にロードしたり大量のアプリケーションデータを本体に持てる)ということになる。

さらに私は、Class 6のSDを使っているが、そうするとアプリケーション(のキャッシュ)の起動が速い、というメリットがある。

Linux swapパーティション

Linux swap領域は、スワップを生かす場合にまあ必要である。

まずandroid OSでは、スワップが使えない場合(少ない実RAM上だけでアプリケーションを実行する場合)は、次々とバックグラウンドに回ったアプリケーションを殺す。だからフォアグラウンドに戻された場合にプログラム (.apkのキャッシュ.dex、1.6以降はハード依存のキャッシュ.odex) を再ロード→前回バックグラウンドに回った続きから実行、という作り方がプログラマには求められるのだが、それはともかく再ロードには時間がかかる。

実はswapの読み書きだってSDカードというフラッシュメモリなので、swapが使えないからといって本体フラッシュメモリから再ロード、というのとどちらが速いかというと、これは微妙である(笑)。本体フラッシュとSDカードのどちらが速いか、みたいな問題になる。Class 6のフラッシュメモリでは本体フラッシュよりやや速いようだが、Class 4以下では速くなる効果はない。事実、実メモリが少ないバージョン (32B、NTTのOEMがそうである) でswapを取りすぎて、swapに時間が掛かりすぎて一瞬 (……というか長ければ3秒とか) 停止する、といいう使いにくさを訴えているひとも多い。まあだからswapを取るか、どのくらい取るか、というのは(日常の使い方に応じた)チューニングのひとつとなる。

androidのOSは、swapをFAT32領域上に取ることもできる。つまり通常のROMでも (swapをonにできさえすれば)、通常のパーティショニングされていないFAT32のフラッシュメモリにswapできる。しかしFAT32への読み書きは、上記よりさらに遅かったりするので、あればよいかどうかは(同上略)。なお本体フラッシュに通常はswapは取られない。取ろうと思えば取れるが、書き換えが激しいファイルを寿命が短いのに取替えがきかない本体フラッシュにとるバカはいない、ということである。

パーティショニングされたSDカード使用の注意点

こうして取られたext2/3、swap領域があるSDカードは、むやみに抜き差しできない。純正OS (というかext2/3、swap領域を取らない実装)は、データ、たとえば音楽とか写真をSDに保存しておいて、それをすいすい運用中に入れ替えできることがメリットであるのに、それが失われるわけである。まあ8GとかのSDカードがあったら、MP3ファイルなんかは何をそんなに溜め込んでおくんだ? というくらい入るので、交換の必要はあまりないわけだが。なおswapだけをSDカードに取っているROMの場合は、swapをOFFにする (これはそういうアプリがある) ことで、安全に抜き差しできる。私はswapがFAT32上にある状態でSDを運用中に抜いてしまった失敗を一回したが、SDカードがぐしゃぐしゃになっただけでしばらく動いていたのにはあきれた。というか、swapがあるパーティションをunmountできる実装にあきれた (ROMのSuperMagicの項を参照)。

パーティショニング

Linux母艦を持っている場合、そちらにSDカードを挿してパーティショニングできるのであろうが、これは良く分からない。android機とWin/Mac系 (Linuxでもできるけど) PCを持っている場合について述べる。

コマンドラインから

フラッシュメモリのパーティショニングであるが、これはrecovery flashに入って、母艦PCからadb shellで行なうのが一般的である(あった)。

$ adb shell
/ # parted /dev/block/mmcblk0
(parted) rm 3 ←これ以降はpartedツールに与えるコマンド
(parted) rm 2 ←3パーティションあるSDのパーティション
(parted) rm 1 ←を解除する場合
(parted) mkpartfs primary fat32 0 2872 ←1パーティション目2872MBはfat32 ※
(parted) mkpartfs primary ext2 2872 3872 ←2パーティション目1GBはext2(3) ※
(parted) mkpartfs primary linux-swap 3872 4000 ←3パーティション目はswap ※
(parted) print 
……(中略)
Number Start End Size Type File system Flags
1 512B 2872MB 2872MB primary fat32 lba
2 2872MB 3872MB 1000MB primary ext2
3 3872MB 4000MB 128MB primary linux-swap(v1)

(parted) quit
/ # upgrade_fs ← ext2を作ってからext3に変換する
……(略)
/ # tune2fs -O extents,uninit_bg,dir_index /dev/block/mmcblk0p2 ←ext4に変換する場合
……(略)
/ # e2fsck -fpDC0 /dev/block/mmcblk0p2 ←ext4に変換する場合
……(略)

各パーティションの容量(※)であるが、partedに入ったら最初に、上記例の最後のようにprintで総容量を表示(メモリカードによって微妙に違っている)、そこからswapサイズを引いた値が2/3パーティション目の境界、そこからext2(3)サイズを引いた値が1/2パーティション目の境界、というように決定する(つまりいわゆるfree fogが1パーティション目のDOS領域になる)。これはlinux-swapは前記のようにあり過ぎてもいけないからであり(掲示板情報をよく読もう)、ext2(3)パーティションは所詮 /system/app/ とdalvik cacheになるだけのなのであり過ぎてもしょうがないからである。

それからFreeBSDなどのpartition editorを使ったことがあるひとは、上記のいい加減な数値指定でいいのか? と怖くなるかもしれないが、まず境界の位置は次のパーティションのはじまりイコール前のパーティションの終わり (『未満』みたいな指定になるようである)で重複したりしないようである。最初のパーティションの始まりはSDカードによっては0バイト目ではまずいようだが、その場合はてきとーに(上記例のように)ずらしてくれる。数値指定(デフォルトでMB)はてきとーに1024x1024とかを掛けてくれるみたいだし、『G』を付ければ1024x1024x1024を掛けてくれるみたいである。終わりの位置の指定はもしメモリカードの終端を超えれば怒られるだけで何も起きない。

だからいい加減な操作で結構なんとかなっちゃうが、16GBのカードを使ったときは閉口した。表示が0.1GB単位で丸められて表示されるので、最後の位置がまず分からないし、最後に128MB取りたいのだが下のほうの桁が丸められているのでわからない。いい加減な表示に付き合っていい加減に0.1GB単位で指定したらswapが200MBも取られて慌てた。結局指定はすべてMB単位で行ない、『怒られない』終端位置はトライ & エラーで探りあてた。設計者はこういう丸め表示が人間工学的だとでも思っているんでしょうか。

recovery flashからのパーティショニング

非純正・高機能版のrecovery flashでは最近(recovery flash RA 2.3.1あたり)、メニューでSDパーティショニングできる機能が付いた。まあ上記と基本は同じである(と思う。私自身は一回も活用していないので)が、マクドナルドでお茶母艦PCがなくてもパーティショニングからできてしまうのがすごい。