BeagleBoard-xM – Android用SDカードの作成。

BeagleBoard-xMでAndroidを動作させるために使用するSDカードの作成メモ。

※Linuxカーネル・Androidファイルシステムのビルドは別エントリで。

前準備

ビルドしたx-loader(MLO)+u-bootでうまく動かせなかったので、BeagleBoard-xMに付いてきたサンプルのSDカードから拝借する。

  • ビルド環境にサンプルSDカードをセット。
    ※サンプルのSDカードは貴重なので、念のためLOCKしておくと吉。
  • SDカードが認識されると"/media/BEAGLE“として認識されるので下記操作でコピーする。
    今回は/root/imagesディレクトリを作成して、そこにコピーする。 

    # mkdir /root/images
    # cp /media/BEAGLE/MLO /root/images/.
    # cp /media/BEAGLE/u-boot.bin /root/images/.

  • SDカードをアンマウントする。

    # umount /media/BEAGLE

アンマウントしてからSDカードを取り出す。

新しいSDカードのセット

新しいSDカードをビルド環境にセットする。

SDカードがフォーマット済みで、認識されている場合はdfコマンドを実行すると

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             49448752  28244404  18692428  61% /
none                   1024868       224   1024644   1% /dev
none                   1030472      1120   1029352   1% /dev/shm
none                   1030472        92   1030380   1% /var/run
none                   1030472         0   1030472   0% /var/lock
/dev/sdb1               802992         0    802992   0% /media/3639-6662

のように認識されている事を確認できる。この場合は「/dev/sdb」がSDカードのデバイス名。

このままだとパーティション作成に支障が出るので、

# umount /media/3639-6662

のようにumountコマンドを実行してSDカードをアンマウントしておく。

※”3639-6662″はSDカードのパーティション名なので、SDカード毎に異なる。

上記のようにdfコマンドを実行しても一覧に表示されない場合はdmesgコマンドを実行してみる。

出力されるメッセージの中から

# dmesg
(snip)
[    7.341992] scsi 3:0:0:0: Direct-Access     USB2.0   CardReader COMBO 0100 PQ: 0 ANSI: 0
[    7.343352] sd 3:0:0:0: Attached scsi generic sg2 type 0
[    7.359086] sd 3:0:0:0: [sdb] Attached SCSI removable disk
(snip)
[ 1016.547642] sd 3:0:0:0: [sdb] 15523840 512-byte logical blocks: (7.94 GB/7.40 GiB)
[ 1016.557600] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[ 1016.583501] sd 3:0:0:0: [sdb] Assuming drive cache: write through
[ 1016.583508]  sdb: sdb1 sdb2 sdb3
(snip)

のような部分を見つけてデバイス名を割り出す。

SDカードの情報確認

fdiskコマンドを実行してSDカードの容量を確認する

# fdisk -l /dev/sdb

実行すると下記のようなメッセージが表示される。

ディスク /dev/sdb: 7948 MB, 7948206080 バイト
ヘッド 81, セクタ 10, シリンダ 19165
Units = シリンダ数 of 810 * 512 = 414720 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1              11       19166     7757824    b  W95 FAT32

このメッセージから、SDカードの容量は7,948,206,080バイトという事がわかる。

SDカードを初期化する際にヘッド数・セクタ数・シリンダ数をパラメータとして与える必要があり、このうち

  • ヘッド数:255
  • セクタ数:63

固定となる。1セクタも512バイト固定となるので、これらの値を用いてシリンダ数を求める。

つまり

7948206080÷255÷63÷512=966.314348

となり、合わせて小数点以下切捨てとなるので、このSDカードのシリンダ数は966となる。

SDカードの初期化(パーティション作成)

SDカードの情報が揃ったら、SDカードの初期化を行う。

SDカードの初期化はfdiskを使用する方法が一般的のようだが、当方の環境ではいまいち調子が悪いので、DevKitにあるmkmmc-android.shの内容に沿った形で操作を行う。

まず、ddコマンドを用いてSDカードの先頭から1ブロック1024バイトとして1024ブロック分を0クリア。

# dd if=/dev/zero of=/dev/sdb bs=1024 count=1024 &>/dev/null

次にsfdiskコマンドを用いてSDカード上に3つのパーティションを作成する。

mkmmc-android.shではパーティションを

  • 第1パーティション(/dev/sdb1)
    • 用途:boot用
    • 形式:vfat
    • 容量:9シリンダ分(mkmmc-android.shの通り)
  • 第2パーティション(/dev/sdb2)
    • 用途:rootfs用
    • 形式:ext3
    • 容量2GB以上(mkmmc-android.shでは「(全体シリンダ数-第1パーティションのシリンダ数)÷2」としている模様。)
  • 第3パーティション(/dev/sdb3)
    • 用途:sdカード用
    • 形式:vfat
    • 容量:残り

のように作成している様子。

今回使用したSDカードは8GBなので、第2パーティションは適当に400シリンダ分確保(2GBは十分に確保出来るので)する事にした。

まずはsfdiskを実行する。sfdisk起動時に与えるパラメータは以下のとおり。

sfdisk -D -H ヘッダ数 -S セクタ数 -C シリンダ数 デバイス名

従って、今回は

# sfdisk -D -H 255 -S 63 -C 966 /dev/sdb

として実行する。実行すると次のようなメッセージが表示された後、パーティション作成のためのデータを入力するように求められる。

現在、誰もこのディスクを使っていないかを調べます...
OK

ディスク /dev/sdb: シリンダ数 966、ヘッド数 255、63 セクタ/トラック

sfdisk: エラー: セクタ 0 には msdos シグニチャがありません
/dev/sdb: 認識できないパーティション領域タイプ
古い場面:
パーティションが見つかりません
以下の書式で入力して下さい -- 指定しなかったフィールドには初期値をセットします
<start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
普通は <start> と <size> (そして恐らく <type>)を指定するだけで構いません。

/dev/sdb1 :(←ここからデータ入力開始)

データの入力は各パラメータをカンマ区切りで入力していく形になる。

フォーマットは

開始シリンダ番号,終了シリンダ番号,形式,ブート指定

となり、例えば/dev/sdb1なら

,9,0x0c,*

と入力すればいい。

実際には

/dev/sdb1 :,9,0x0c,*
/dev/sdb1   *      0+      8       9-     72261    c  W95 FAT32 (LBA)
/dev/sdb2 :,400,,-
/dev/sdb2          9     408     400    3213000   83  Linux
/dev/sdb3 :,,0x0c,-
/dev/sdb3        409     965     557    4474102+   c  W95 FAT32 (LBA)
/dev/sdb4 :エンターキーのみ

のように入力していく。

エンターキーのみ入力すると、データ入力が終わったとみなされる。

新たな場面:
ユニット = 8225280 バイトのシリンダ、1024 バイトのブロック、0 から数えます

デバイス ブート 始点    終点 #シリンダ #ブロック  Id  システム
/dev/sdb1   *      0+      8       9-     72261    c  W95 FAT32 (LBA)
/dev/sdb2          9     408     400    3213000   83  Linux
/dev/sdb3        409     965     557    4474102+   c  W95 FAT32 (LBA)
/dev/sdb4          0       -       0          0    0  空

のようなメッセージが表示され、最後に

ディスクへの書き込みを行ないますか? [ynq] y

と聞かれるので、良ければ”y”を入力する。

上記操作後、fdiskコマンドでSDカードを確認すると

# fdisk -l /dev/sdb

ディスク /dev/sdb: 7948 MB, 7948206080 バイト
ヘッド 255, セクタ 63, シリンダ 966
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1   *           1           9       72261    c  W95 FAT32 (LBA)
/dev/sdb2              10         409     3213000   83  Linux
/dev/sdb3             410         966     4474102+   c  W95 FAT32 (LBA)

のように表示された。

パーティションのフォーマット

SDカードにパーティションを作成したら、各パーティションをフォーマットする。

フォーマットは

  • vfatの場合
    mkfs.vfatコマンドを使用
  • ext3の場合
    mkfs.ext3を使用

となる。

実際には

  • 第1パーティション

    # mkfs.vfat -c -v -F 32 -n boot /dev/sdb1

  • 第2パーティション

    # mkfs.ext3 -c -L rootfs /dev/sdb2

  • 第2パーティション

    # mkfs.vfat -c -v -F 32 -n data /dev/sdb3

とした。

一応バッドセクタチェックオプション”-c”と詳細表示オプション”-v”(vfatのみ)を付けてある。

最後にsyncコマンド実行後、SDカードを抜き差しすると

/dev/sdb2              3162452     70332   2931472   3% /media/rootfs
/dev/sdb3              4465356         4   4465352   1% /media/data
/dev/sdb1                71133         1     71133   1% /media/boot

のように自動でマウントされる。

MLO・u-boot.binのコピー

サンプルSDカードから拝借したMLOとu-boot.binをSDカードにコピーする。

# cp /root/images/MLO /media/boot/.
# cp /root/images/u-boot.bin /media/boot/.

MLOは必ず先にコピーすること。

SDカードを抜くときは

# umount /media/boot
# umount /media/rootfd
# umount /media/data

してから抜くのを忘れずに。

補足

このSDカードに別途ビルドしたuImageやrootfsをコピーして使用することになる。


コメント

  1. […] SDカードは「BeagleBoard-xM – Android用SDカードの作成。」で作成したものを使用する。(SDカードは予めビルド環境にセットしておく。) […]

  2. […] 「BeagleBoard-xM – Android用SDカードの作成。」を参照してSDカードを準備する。 […]

タイトルとURLをコピーしました