連載
» 2012年06月27日 09時45分 UPDATE

実践しながら学ぶ Android USBガジェットの仕組み(6):緊急事態発生!? 起動不能になったPCをAndroidで救出せよ! (1/2)

今回からAndroid USBガジェットの機能として比較的よく使用されている「USBマスストレージクラス(USB Mass Storage Class)」の仕組みを詳しく解説していく。Androidボードを使って、起動不能になったPCを救出できるか!?

[中垣内勇祐、村上雅彦、森崇、中谷洋一(永和システムマネジメント),@IT MONOist]

はじめに

 今回からAndroid USBガジェットの機能として比較的よく使用されている「USBマスストレージクラス(USB Mass Storage Class)」について解説していきます。

 USBマスストレージクラスが提供する機能の利用シーンについては、連載第1回「Android USBガジェットを使ってみよう!」の2ページ目で紹介した通りです。今回からはその“仕組み”について詳しく触れていきます。

 とはいえ、単純にAndroidの構造やUSBマスストレージクラスの仕様について解説するだけでは面白くないので、本シリーズでは実際に“モノづくり”を楽しみながら理解を深めていきたいと思います。

AndroidでPCを救出せよ!

プロローグ

――某月某日、ちょっとしたトラブルが発生しました――

中垣内 あれ……!? PC(Windows)が起動しないぞ。昨日何かしたかなぁ……。と、とにかくセーフモードでもいいから何とかOSを起動しなくては……(汗)。

――しばし試行錯誤――

中垣内 ダ、ダメだー。セーフモードも途中で止まってしまう……。ひょっとして、ファイルシステムが壊れかけているとか? となると……。


※PCを使用していると、誰しも直面し得るトラブルですね(場合によっては、本当にディスクが破損してしまうこともあるので、日ごろから大切なデータはバックアップを取りましょう)。



中垣内 うーむ。ノートPCだし、HDDを取り出すのはちょっと面倒だよなぁ。こうなると、「KNOPPIX」の出番か! えーと、確か以前にKNOPPIXのCD-ROMを作ったはずだけど……。

――机の引き出しから整理されていないCD-ROMの山が……――

整理されていないCD-ROMの山が

中垣内 ……。ど、どれだっけ……(汗)。あーーーっ!! しかもこのノートPC、CD-ROMドライブないし……。外付けドライブはどこだっけ??

登場! Androidボード試作機1号

村上 中垣内さん、AndroidにKNOPPIXをインストールしておいて、USBからブートさせたらどうです?

中垣内 えっ……?

 おっ!! それ面白そうやね。チョイ待って!

……

製作中

……

 よっしゃ、できた! まだ、試作中の「Androidボード(試作機1号)」だけど、これを使えば何とかなるんじゃないかな。

中垣内 試作中……って(というか、森さん作るのが速すぎてコワイ)。

 このボードとPCをUSB接続して、PCのBIOSを設定して〜。そんでもって、端末でパスを入れて〜と。

Androidボード(試作機1号)

 どうだ? これで再起動だ!

再起動

全員 おーーーっ!! キターーーッ!


USBマスストレージクラスのおさらい

 結局、他のメンバーの協力を得て、中垣内さんのPCは事なきを得たわけですが……。一体、Androidにどんな魔法をかけたのでしょうか? 以降でその“種明かし”をしていきます。

 本題に入る前に、ベースとなる知識として、USBマスストレージクラスのおさらいをしておきましょう。

 AndroidのUSBマスストレージクラスを利用すると、USB接続でPC側からAndroid上のSDカード内のファイルへアクセスできます。この際、PC側はAndroidを“USBメモリ”として認識します(図1)。

USBマスストレージクラス(USBメモリ) 図1 USBマスストレージクラス(USBメモリ)

 つまり、USBマスストレージクラスを使うと、先ほどのAndroidボードがUSBメモリになるわけです。そして、USBメモリとして扱えるのであれば、「USBブートも可能」と考えるのはごく自然なことです。

 繰り返しになりますが、今回の場合、PC側はAndroid上のSDカードのことを“USBメモリ”として認識します。SDカード内のデータを“USBブート可能なイメージ”に置き換えてしまえば、Androidボードは“ブート可能なUSBメモリ”となるわけです。

 これが基本的な考え方となります。後は、少し応用を加えれば、割と簡単にAndroidを改造することが可能です。

Androidを仮想CD-ROMドライブにする

 ここで、現実的な話に移りましょう。前述の通り、手段としてUSBメモリブートを用いてもよいのですが、KNOPPIXのダウンロードサイトにあるのは“CDイメージファイル(ISOファイル)”です。そこからUSBメモリブートできるようにするには少々手間がかかります。できることならば、ダウンロードしたISOファイルをそのまま使用したいですよね。

 ご存じの通り、世の中にあるUSB機器の中には“CD-ROMドライブ”があります。そこで、「どうにかして、AndroidをUSBメモリではなく、“CD-ROMドライブ”に仕立てることはできないものか?」と考えるのは割と筋の通った話です(図2)。

 つまり、USBメモリからのPCブートではなく、CD-ROMドライブからのPCブートということです。

USBマスストレージクラス(CD-ROMドライブ) 図2 USBマスストレージクラス(CD-ROMドライブ)

 ただし、Android側から見ると、ISOファイルは通常ファイルでしかないので、そのままではうまく認識しません。ここで利用するのが、Android(Linux)の特殊なデバイスファイル「ループバックデバイス(Loopback device)」です。これにより、容易に通常ファイルを仮想デバイス化することができます。SDカード内のISOファイルをループバックデバイスでデバイス化することで、ダウンロードしたISOファイルをそのまま使用でき、簡単にCD-ROMドライブとして扱うことができるのです。

 後は、PC側のBIOS設定で、USB CD-ROMドライブをブートシーケンスの先頭にして、PCをブートするだけです。

 以下に、Androidボード試作機1号でのオペレーション内容を示します(注1)。

※注1:オペレーション実施前に、試作機1号用にカーネルを再構築し、ボードに組み込んでいます。


1.ボードにSDカードを挿入する

ボードにSDカードを挿入する

2.シリアル端末上で、ISOファイルが入っていることを確認する

ISOファイルが入っていることを確認

 全部で、3つのISOファイル(KNOPPIX、Puppy Linux、Ubuntu)があります。

  • knoppix_v6.7.1CD_20110914-20111018.iso …… KNOPPIX
  • ubuntu.iso …… Ubuntu
  • wary-511-01j-k2.6.32.28-small.iso …… Puppy Linux

 この中で、今回使用するものはKNOPPIXです。

3.シリアル端末上で、「losetup」コマンドを使って、KNOPPIXのISOファイルを仮想デバイス化する

KNOPPIXのISOファイルを仮想デバイス化

 仮想デバイスができたかどうかは、ループバックデバイスファイル「/dev/block/loop0」に対し、「losetup」コマンドをたたいた結果で確認します。正しく仮想化できていると、設定したISOファイルのファイルパスが表示されます。

4.仮想化したデバイスファイルをUSBマスストレージクラスに認識させる

 AndroidのUSBマスストレージクラスのデバイスドライバには、「/sys」配下に特殊ファイル(/sys/devices/platform/s3c6410-usbgadget/gadget/lun0/file)が存在します(注2)。この特殊ファイルに対して、デバイスファイルのパスを書き込んでおくと、USB接続時にPC側からそのデバイスを参照できるようになります。今回の場合は、KNOPPIXのISOファイルをループバックデバイス(/dev/block/loop0)で仮想デバイスにしていますので、そのファイルパスを書き込みます。

# echo “/dev/block/loop0”  >  /sys/devices/platform/s3c6410-usbgadget/gadget/lun0/file 

※注2:この特殊ファイルは、ボードごとにファイルパスが異なります。


5.PCのBIOS設定を変更する

PCのBIOS設定を変更する

6.PCと端末をUSB接続し、PCを起動する

PCと端末をUSB接続し、PCを起動する
       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.