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をコピーして使用することになる。
コメント
[…] SDカードは「BeagleBoard-xM – Android用SDカードの作成。」で作成したものを使用する。(SDカードは予めビルド環境にセットしておく。) […]
[…] 「BeagleBoard-xM – Android用SDカードの作成。」を参照してSDカードを準備する。 […]