2011/05/15

パーティションの切り直し

所持している SC-02B の内蔵SDのパーティションが、シリンダ境界で切り分けられていない個体だったので、パーティションの切り直しを行った。デフォルトのパーティションサイズをメモしておく意図で、内蔵SD のパーティションを切り直す方法をまとめておく。当然ながら、パーティションテーブルの変更を行うと、その領域のデータは破棄されるので注意。

busybox が必要なので、SuperOneClick に付属している busybox をあらかじめ C:\SC02BOMJJ1 にコピーしておく。また、root 権限が必要なので、SuperOneClick で Shell Root になっておく。

C:\SC02BOMJJ1> adb push busybox /data/local/tmp/
C:\SC02BOMJJ1> adb shell
# chmod 755 /data/local/tmp/busybox
# /data/local/tmp/busybox fdisk /dev/block/mmcblk0


ここからは、普通の fdisk の操作と同じ。必要そうなコマンドのみ列挙してみた。
コマンド内容
dパーティションの削除
lパーティションタイプの列挙
nパーティションの作成
m使用可能なコマンドの一覧を表示
pパーティションテーブルの内容を表示
q変更を保存せずに終了
tパーティションタイプを変更する
wパーティションテーブルの内容をディスクに書き込んで終了

コマンドで p を入力すると、現在のパーティションテーブルの内容を表示できる。パーティションを切り直す場合は、この状態になるようにパーティションを作成することになる。
Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
/dev/block/mmcblk0p2         1672705     1918464     1966080  83 Linux
/dev/block/mmcblk0p3         1918465     1944064      204800  83 Linux

所持している SC-02B だと、以下のように does not end on cylinder boundary と警告が出ていた。この警告が出ていても大きな問題はないが、ディスクアクセスのパフォーマンスが若干落ちる可能性がある。
Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes 
1 heads, 16 sectors/track, 1944064 cylinders 
Units = cylinders of 16 * 512 = 8192 bytes 

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
Partition 1 does not end on cylinder boundary
/dev/block/mmcblk0p2         1672705     1918464     1966080  83 Linux
Partition 2 does not end on cylinder boundary
/dev/block/mmcblk0p3         1918465     1944064      204800  83 Linux
Partition 3 does not end on cylinder boundary

上記の警告を出なくするには、パーティションを一度全部削除して作り直す必要がある。
コマンド d でパーティションを順に削除していく。削除候補のパーティションが複数ある場合は、数字でパーティションを指定する。
Command (m for help): d
Partition number (1-4): 3
Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
Partition 1 does not end on cylinder boundary
/dev/block/mmcblk0p2         1672705     1918464     1966080  83 Linux
Partition 2 does not end on cylinder boundary

Command (m for help): d
Partition number (1-4): 2
Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
Partition 1 does not end on cylinder boundary

Command (m for help): d
Selected partition 1
Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System

これでまっさらな状態になったので、次は新しくパーティションを作成する。
コマンド n でパーティションを作成する。なお、primary partition を作成する。順に、パーティション番号、パーティションの開始位置、パーティションの終了位置を指定する。これを全パーティション分繰り返す。
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (2-1944064, default 2): 5
Last cylinder or +size or +sizeM or +sizeK (5-1944064, default 1944064): 1672704

Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (2-1944064, default 2): 1672705
Last cylinder or +size or +sizeM or +sizeK (1672705-1944064, default 1944064): 1918464

Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
/dev/block/mmcblk0p2         1672705     1918464     1966080  83 Linux

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (2-1944064, default 2): 1918465
Last cylinder or +size or +sizeM or +sizeK (1918465-1944064, default 1944064): 1944064

Command (m for help): p

Disk /dev/block/mmcblk0: 15.9 GB, 15925772288 bytes
1 heads, 16 sectors/track, 1944064 cylinders
Units = cylinders of 16 * 512 = 8192 bytes

              Device Boot      Start         End      Blocks  Id System
/dev/block/mmcblk0p1               5     1672704    13381600  83 Linux
/dev/block/mmcblk0p2         1672705     1918464     1966080  83 Linux
/dev/block/mmcblk0p3         1918465     1944064      204800  83 Linux

内容に間違いがないか確認する。間違っていた場合は、パーティションを削除してから再度作成し直す。最後にコマンドで w を入力してディスクに書き込む。ディスクに書き込まない限り、変更は保存されないので注意。
Command (m for help): w
# exit

逆に変更内容を破棄する場合は、コマンドで q を入力する。
Command (m for help): q
# exit

パーティションテーブルの内容をディスクに書き込んだ場合、変更されたパーティションに書き込まれていたデータは破棄される。/dev/block/mmcblk0p1 は /sdcard 内のデータ、/dev/block/mmcblk0p2 は /data、/dev/block/mmcblk0p3 は DioDict の辞書なので、内蔵SDの全データとアプリのデータ、DioDict の辞書は破棄される。また、パーティションを変更すると未フォーマットの状態になるので、リカバリモードで起動して wipe data/factory reset しておく。DioDict も使用するのであれば、リカバリ方法 を参考にリカバリを行う必要がある。

20 件のコメント:

  1. こんばんは。こちらの記事を参考にさせて頂いて
    パーティションを変更させて頂きました。
    最後の、wipe data/factory reset をやり忘れて
    リカバリしてしまった所、

    E:Can't mount /dev.block/mmcblk0p2
    (Invalid argument)
    E:install_application_for_customer:Can't mount
    DATA
    E:copy_data_default_apk:Can't mount DBDATA:
    とリカバリ画面に表示され、
    起動しても画面が真っ暗になってしまいました。
    factory resetを行いましたが、回復せずです。

    アドバイスがあれば頂きたいと思いまして
    コメントさせて頂きました。

    返信削除
    返信
    1. (コメントを誤って削除してしまったので、同じ内容で再投稿させていただいた関係で日時が変わっていますm(==)m)
      マウントに失敗しているということなので、パーティションを切るのに失敗しているのではないでしょうか。リカバリモードで接続すればadbによる操作はできると思うので、そこからパーティションを切り直す必要がありそうです。

      削除
  2. こちのページを参考にパーティションを切り直したいのですが、通常起動しないため、recovery modeで起動してadbでパーティションを切ろうと思っています。リカバリーモードでadb shellまでは出きます。ただ、ルート権限がないのでsuが出来ません。$→#に切り替えができずに困っています。(純正ROMを焼いてしまってこの現象になりました。)
    superone clickは使えませんので、adb shellだけでどうやってrootが取れるでしょうか?それができると上記の方法でパーティションの切り直しができそうです。

    返信削除
    返信
    1. SuperOneClickのフォルダ内にあるpsneuter等の脆弱性を突くツールを、
      adbのコマンドを使って実機に送り込み、実機上で実行してみれば
      いいのではないでしょうか?
      SuperOneClick自体、内部ではpsneuter等のツールを使って一時rootを
      取得しているわけなので。

      削除
  3. ご回答ありがとうございます。そういう方法があるんですね。突破口が少し見えてきました。私の知識が限られており、時間がかかるかもしれませんが、上記の方法を挑戦してみようと思います。本当にありがとうございました。

    返信削除
  4. psneuter等のファイルを送り込んで、実機上で実行してみたら無事に一時ルートが取れ「#」になりました。その語、上記の方法でパーティションの切り直しができました。本当に感謝です。ありがとうございました。

    返信削除
  5. 僕もtiknpさんと同じような状況です。コメントを参考にpsneuter等のファイルを送り込んで、一時rootをとることが出来ました。
    しかし、# /data/local/tmp/busybox fdisk /dev/block/mmcblk0と打つと、fdisk: can't open '/dev/block/mmcblk0'と出てしまい、進めません。何が原因なのでしょうか。
    お答えいただけたら幸いです。

    返信削除
    返信
    1. /data は /dev/block/mmcblk0 ブロックのパーティション /dev/block/mmcblk0p2
      にあるので、そのパーティションにある fdisk は実行できるのに、その親にあたる
      ブロックが開けないはずはありません。

      削除
  6. 返信ありがとうございます。なぜできないのか不思議です。
    コマンドプロンプトの画面はこのような感じになっています。なにか問題点はありますでしょうか?http://gyazo.com/6e435a8e548e6b652760be629a83ac7f

    あと、リカバリーモードで起動した際、赤文字で、

    E:Can't mount /dev/block/mmcblk0p1
    (No such file or directry)
    E:copy_dbdata_media:Can't mount SDCARD:

    と書かれているのですが、これは関係ありますでしょうか?
    参考までに画像を貼っておきます。
    http://gyazo.com/28cd530a39d4fe443250cc27c954a9d9

    返信削除
    返信
    1. リカバリモード起動時に Movinand Checksum Confirmation Fail と出ているのが気になります。
      私も見たことはないので分かりかねますが、Movinand はフラッシュメモリを指しているので、内蔵SDに問題があるかもしれません。

      削除
    2. 返信ありがとうございます。
      なるほどです。内蔵SDが壊れていたらそりゃ直りませんよね。
      ありがとうございました。

      削除
  7. E:Can't mount /dev.block/mmcblk0p3
    no such file or directory
    E:install_application_for_customer:Can't mount
    HIDDENSDCARD となりreboot nowで止まります エンターすれば普通に起動しますが、エラーでなく、普通に起動できないでしょうか。
    初心者です、cynogenmod10.2からjj1に戻すとこうなりました。
    E:copy_data_default_apk:Can't mount DBDATA:
    どうか、よろしくお願いいたします。

    返信削除
    返信
    1. /dev/block/mmcblk0p3が存在しないからマウントできないといわれているので、
      パーティションがあるかどうか確認して下さい。
      なければパーティションを切り直すしかないと思います。
      手順は上記エントリに書いてあります。

      削除
    2. お返事、ありがとうございます。
      わたしには、とてもコマンドプロンプトでは、無理なのでgoogle playのパーテーションツールで見たら 0,1はあるのですが、問題の3がなかったです。
      windowsのfdiskなら、わかりますが、andoroid は、私には困難過ぎます。
      最新のcwmですべてのパーテーションをスワイプして 初期化をしましたが、やはり3がないと 言われます、残念です。

      削除
    3. AndroidのfdiskもLinuxと同じですし、Windowsともそんなに違いはない気はしますがさておき。
      Odin3でJJ1用のPITファイルを用意してRe-Partitionにチェックが付いている状態で焼き直せば、PITファイルの内容に従ってパーティションを切り直してくれると思うので、それでもいいような気はします。

      削除
    4. お返事ありがとうございます。
      それは、何回もしましたが、同じコメントが出てきて、一端、止まります。
      このまま使っていて、差し支えないということも、聞いたのですが、普通に再起動して、戻したいのです。
      cyanogen入れるときに、海外のromだと、そのまま、入らないので、加工済みを、入れたときにパーテーション書き換えられたと思います。
      re-partionで領域開放で入って、エラー消えると思ったのですが、だめでした。
      リナックス用の領域の切れるCDでbootして、PCにUSBでつないで、開放しましたが、おそらくandoroidの部分はできていなかった思います。
      pitファイルで完全に領域開放するものはあるのでしょうか。
      なにとぞ、ご助言お願いいたします。

      削除
    5. JJ1用のPITを使えば普通はうまくいくと思いますが、MicroSDやSIMを抜くとうまくいく、みたいな報告は以前上がっていたような気がします。
      SC-02Bのパーティションを操作するだけなら、adbとbusybox(SuperOneClick等に同梱されている)を使って上記手順に従って操作するだけなので、大して難しいものではありません。
      パーティション情報がCyanogenMod用になっているため、パーティションの削除のところで、指定するパーティション番号が変わるくらいだと思います。

      削除
    6. shela様、ありがとうござます、感謝です。
      結果から、言いますと、エラーなく、帰ってきました。
      ここへいくまでの、道のりの大変なこと、初心者には辛いでが、嫌いではないので、できました。
      busyboxのコピー shell root #マークが出ない、rootがうまく行ってない、一難さればまた一難、領域の開放まで、行き、jj1 pit入れましたら、今度は1がないといわれて、起動して最初のロゴのところで画面が消えてしまいます、最後はshela様と同じようにパーテーション切りました、その時点でエラーはなくなり、jj1入れなおして、初期化しても、エラー出ません。
      ありがとうございます。

      削除
  8. パーティションの切り直しを調べていまして、こちらにたどり着きました。
    全くの素人でお恥ずかしいのですが、最初のC:\SC02BOMJJ1というのは、Cドライブ直下に任意で名前を付け作成したフォルダということでよろしいですか?
    あと、そのフォルダにbusyboxをコピーするとはどのように行えばよろしいでしょうか。
    初歩的な質問ですがお願い致します。

    返信削除
    返信
    1. C:\SC02BOMJJ1というのは、Cドライブ直下に任意で名前を付け作成したフォルダ、という意味ですが、Windowsのフォルダ・ファイル操作も覚束ない状態でLinuxのパーティション操作を行えるとは到底思えません。
      Linuxには精通していてWindowsはよく知らないと言うことならわかりますが、前提知識が足りなさすぎて壊すのがオチなのでやめた方がいいです。

      削除