2010年11月28日日曜日

第2回 V7から始めるUNIX講座 まとめ

第2回はexec()です。
前回まででfork()をざっと見ましたので、新しく作ったプロセスを別プロセスに化けさせるexec()です。

ソースコードはこちら
http://www.tamacom.com/tour/kernel/unix/S/98.html#L22

Wikiによれば
http://ja.wikipedia.org/wiki/Fork#Fork-Exec
fork()によって子プロセスが親プロセスのコピーとして生成され、exec()システムコールを呼び出すことで(子プロセス)自身の内容を置き換える。
子プロセスがexec()を呼び出すと、そのアドレス空間の内容は全て失われ、指定されたプログラムを実行するためのアドレス空間のマッピングが設定される。これをオーバーレイと呼ぶ。
とあります。
→なのでexec()するとfork()した時にコピーした(環境変数:スタック?)が消えてしまうので、とっといて積み直す。
exec()をまたがって保持するようにしている。
ソースのどこだったか、ちょっと不明です。

ではソースコードを見ていきますと


22 exec()
23 {
24 ((struct execa *)u.u_ap)->envp = NULL;
25 exece();
26 }


実体はexece()ですがパラメータがない?
放送では、filename, agrc, argp, envを渡すと言われたような?

37 if ((ip = namei(uchar, 0)) == NULL)

namei関数でOSのファイルをサーチする機能をコールします。
ファイル名からinodeを読み込んで、それのメモリ上のポインタを返します。inodeについては後述。

●inodeに関して
UNIXではファイル名はファイルの実体を示していない。
PATHもファイル名の拡張でしかない。
例えばハードリンクを使えば同じ実体に複数のファイル名を付与することが可能になる。
そのため、ファイル名では実体を特定できない。

ファイルの実体はinode(iはindexのi)で管理している。
inodeについては、inode.hを参照
http://www.tamacom.com/tour/kernel/unix/S/61.html

構造体inodeにファイルを管理するための情報(userid,groupid,inode)などを保持しています。
13個(NADDR)分のエントリ?を確保しているとのことでしたが、ちょっと理解が追いついてないです。

lsの-iオプションでinode番号が見られる。
inodeの個数はファイルシステムを作るとき(mkfs)に決まる。
→以前inodeの数が上限に達してDISK容量が余っていたにも関わらずファイルが作れなくなったことがあります。
DISKはあっても管理情報がいっぱいになるとファイルが作れなくなります。

v7の時にはファイルシステムは一種類しかなかった。
当時の他のOSではファイルを作る時にファイル名の他にあらかじめサイズを決めるとか色々制約があった。Unixではサイズを自動的に拡張できるので画期的だった。

現在のUnixのファイルシステムは全てv7の頃のものの派生。
→そのためまずV7でファイルシステムを勉強してから他のファイルシステム(LongFileName,NFS)の理解も早くなる。
Ext2,3はBSDの拡張のひとつ。

カーネルの中でのファイルの読み込み:User構造体に情報をセットしてreadi を呼ぶ。
readi
http://www.tamacom.com/tour/kernel/unix/S/94.html#L19

inodeについてはWiki参照
http://ja.wikipedia.org/wiki/Inode

41 if(access(ip, IEXEC))
access関数で実行権限をチェックします。

50~93行 余りわかりませんでした。

96 if (getxfile(ip, nc) || u.u_error)
gettxfile: 新しいテキストをinodeから読み込む。

168 readi(ip);
としている。
execはreadの変形といえます。

text領域(機械語のコードを格納)にも読み込める。
そのため他のプロセスに化けるというか、自分自身を他のプロセスのイメージで塗り替えるというのが実体?
プログラムを実行するには、PC(プログラムカウンタ)に次に実行するアドレス(例:関数呼び出ししたらリターンしたときに戻る場所をセットしておく)を指定した実行ファイルのものに書き換えてやるってことになる?

実行ファイルのヘッダにエントリポイントが書いてあってそれをプログラムカウンタにセットするするってことのようですがそれだと実行ファイルを生成(コンパイル)した際に実行するアドレスが決まっているということ?

別プログラムなら別の仮想空間で実行されるので同じアドレスでも問題なし。
同じプログラムを複数実行しても、実体は別として複数のプロセスが動くので同じアドレスでも問題なし。
ってことのように思えます。

第1回 V7から始めるUNIX講座 復習

先々週から始まった、V7から始めるUNIX講座

まだまだ知識不足ですね。
第2回目が始まる前に30分ほど復習の時間をとっていただけましたので、メモを書いておきます。

第1回のまとめは以下参照
http://xiangcai.at.webry.info/201011/article_7.html


●SWAP、Paging
SWAP、Pagingについては問題なし
仮想記憶を実現するには、ハードウエアサポート(MMU)が必要になる。

(余談)
SUN1は68000を使っていたが、68000はMMUを搭載していない。
どうやって仮想記憶を実現したかというと68000を2つ搭載していて
1つめのCPUがこけたら2つめのCPUで復旧するという方法で実現していた。

SUN1について
http://ja.wikipedia.org/wiki/Sun-1

68000の仮想記憶については以下の「MC68000 での仮想記憶のサポート」参照
http://ja.wikipedia.org/wiki/MC68000

仮想記憶について
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6


●仮想記憶に関する補足
仮想記憶は参照の局所性(プログラムが限られた時間内では特定のページのみアクセスする)を利用して必要なページのみメインメモリ内に保持することで、実メモリ以上のプログラムを見かけ上同時に実行しているかのようにみせることが出来る。

使わないページのHDDへの退避について
LRUアルゴリズムに従ってページをHDDへ退避します。
FreeBSDでは、2 Way Clock arugorizumu?を使っている
→2 Way Clock arugorizumuで検索しましたがヒットしませんでした。

下記のページの「ページ置換え」のところに「クロックアルゴリズム」という記述がありますが、これだろうか?
http://www.multisoft-lab.com/os/memory.html

●Pageについて
最初から4KBに分かれていて、問答無用でぶった切り


●スタックとヒープ
C言語の実行可能ファイルにおけるフォーマットを理解する必要がある。
→リンカ・ローダ実践開発テクニック(坂井 弘亮著)が参考になります。
ネットだとこの辺とか
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-17/process-memory.html
http://www.ertl.jp/~takayuki/readings/info/no02.html

以下のセクションに分かれている
header
text
data
bss
heap
stack
以下の図参照(こんなイメージ?)
画像


新たな疑問
forkはプロセスID以外まったく同じコピーを作るとのことでしたが、これらのセグメントも全てコピーしている?
heapは下に伸びる、stackは上に積むと、どっかでぶつかったりしないのだろうか?
1つのプロセスで確保できるメモリは2の16乗(65536)つまり64KB(1024×64)?

●forkについて
大体OK
forkが二度リターンする(とっても重要)

以下のコードで実装しているのですが


503 if (save(u.u_ssav)) {
504 sureg();
505 return(1);
506 }



ここのsaveが数少ないアセンブラのコード
http://www.tamacom.com/tour/kernel/unix/S/1.html


.globl _save
714 _save:
715 mov (sp)+,r1
716 mov (sp),r0
717 mov r2,(r0)+
718 mov r3,(r0)+
719 mov r4,(r0)+
720 mov r5,(r0)+
721 mov sp,(r0)+
722 mov r1,(r0)+
723 clr r0
724 jmp (r1)


スタックにレジスタの値を退避して、r1へジャンプしているのは分かるのですがどうやらこの辺は核心部分らしく、まだピンと来ません。
何度も出てくるそうなので、今のところは、ここまでとしておきます。
カーネルにおけるタスクのスイッチングについても、今後の課題

2010年11月27日土曜日

GingerBread Tabletは世界初は東京発か!!

まだ、N1にもGingerBreadは振ってきてませんね。
先週来たのはバグフィックスぽい。

N1への提供は12月6日になるのではとのもっぱらの噂です。

それとは別にWoow! Digitalという聞いたことがないメーカから、12月にGingerBreadのTabletを出すかもという情報が出てきました。
名前は、「The One」
画像


http://www.gapsis.jp/2010/11/android-23gingerbreadwoow-digital-one12.html

NVIDIA Tegra 2
OSにはGingerbread
内蔵メモリは1GB
ストレージは16GBを
ディスプレイは10インチのTFT液晶で、解像度は1024×600。
タッチパネルは静電容量方式
対応するネットワークはWi-Fi(IEEE802.11b/g)と3G。Bluetoothもサポート
この高スペックで想定価格は42,000円程度。

おいおい、これホントなら買うしかないだしょ。

Camanjiのタブレットも気になりますが、スペック的には、「The One」ですね。

2010年11月21日日曜日

第1回 V7から始めるUNIX講座 まとめと疑問

先週から始まった、 V7から始めるUNIX講座、UST中継しますが保存しないので記憶および視聴者の方のつぶやきを元にまとめながら、疑問に思ったことを書いていきます。

メモ書きなので系統だった書き方になっていませんがご容赦を

はじめに
カーネルソースは/usr/sysの下
総ステップ数は25KSくらい

1、SWAPとPagingの違い
UNIXでいうところのSWAPとPagingの違いについて

●SWAPはメモリからプログラム全体をハードディスクに追い出す。
そのため、完全にプログラムを実行できる(メモリ上)、できない(HD上)のいずれかになる。
(補足)
Lions本によれば、proc構造体のp_addrにより以下のように判断できるようです。
メインメモリ内:ブロック番号
HD内:ディスクレコード番号

●Pagingは、プログラムをPageと呼ばれる単位(4KB)に分割して、使っていない(今後も使わないだろう)部分をあるアルゴリズムを使って決定しHDに追い出して(ページアウト)、現在実行中のものだけをメモリ上に保持する。

プログラムがページアウトされたメモリにアクセスしたら、ストップしてハードディスクから読み出し(ページイン)して実行する。
そのため16MBのメモリしかなくても、それ以上のプログラムを実行することが出来る。

Pagingという説明でしたが、つまり仮想記憶をサポートするということになると思います。
仮想記憶を実現するためにハードウエアレベル(MMU)でも対応が必要。
そのため初期のUNIXではSWAPしかなかった。

SWAPとPagingの違い:イメージ
画像


仮想記憶のイメージ:不連続な実メモリをプログラムからは連続したメモリ領域のように見せる。
仮想記憶の実態は、使っているところだけメモリに保持していて、使ってないところはHDに内に追い出しているので実メモリ以上のプログラムを(見かけ上)同時に動かすことができる。
画像


実行していない部分を追い出すのは、リストみたいなものを持っていて古いものを判別している?
画像


疑問
Page単位でプロラムを分割するということですが、
1、最初から4KBに分かれている?あるいは、だれかが4KB単位に分割する?
2、4KBに分かれるときは、問答無用?あるいは関数単位とかでなるべく固める?
3、最後のページで4KBに満たないときは、何か値を詰めたりする?

2、スタックとヒープ
環境変数はスタックの奥底に格納されていて、execしても書き換わらない。

ちょっとここの説明分かりませんでした。
一般的に
スタック:ローカル変数、関数呼び出しの際の引数や関数呼び出し元(関数の実行が終了した後の戻り先)の格納場所として使われます。 置かれた変数は関数の実行が終了した時点で消滅します

ヒープ:ヒープ領域に確保された値はスタック領域におかれた変数と違い、関数の実行が終了しても存在し続けます

3、procとuser
proc構造体はスワップアウトされない(必ずメモリに存在する)スケジューラが使用するため。
user構造体はスワップアウトされる場合がある。

user構造体に参照しているフォルダ、ファイル等が保持している。
フォルダを削除できないのはこれを見ているから

4、TSS(Time Sharing System)
スケジューリングして瞬間で動いているのは1つのプロセス。
停止した状態をproc構造体に保持しておいて、順番に実行している

5、fork
forkすると全てのものを親から受け継ぐ(コピーする)。違うのPIDのみ。
ただし、親プロセスが消費した時間は子プロセスに引き継がないで0リセットする。→458~464行
わざわざforkしてからexecしてるのは、パイプとリダイレクト読むと分かってくる。乞うご期待

fork()
http://www.tamacom.com/tour/kernel/unix/S/98.html#L422
431行:mallocとあるがCのメモリ確保ではなくてメモリ上に領域が取れるかのチェック
438~445行:プロセス数の最大までループしながら、proc構造体の空いてるところを探している。
457行:newproc()で実際のプロセスの生成を行っている。
458~464行:生成した子プロセスにプロセスIDをセット、時間は0でリセット

newproc()
http://www.tamacom.com/tour/kernel/unix/S/96.html#L426
442行:プロセス数の上限は、30000
461~471行:ほとんどのものを親からコピーする

476~487行:ファイルはディレクトリのアクセスカウントをインクリメントする。コピーして親が参照しているファイルについても継承するため。

fork関数は2度リターンする。
503~506行:1をリターンしている。子ププロセス側のリターン:forkの457行目で分岐して、子プロセスの初期化実施。ただしリターン先は子プロセスのfork関数
529行:0をリターンしている。親プロセス側のリターン:forkの457行目で分岐して、親プロセスの処理実施

(疑問)
今まで何度もforkとexecの話は聞きましたが、どうしても分からなかったのは、「Forkが2回リターンする」ってのを知らないせいだというのが先週の説明でやっと分かりました。すっきりー(^^)

ですが、普通にリターンしてしまうと、後続の処理が実行できないので、どうやってるんだろう?
この辺のコードでうまくやっててくれるとは思うのですが?


503 if (save(u.u_ssav)) {
504 sureg();
505 return(1);
506 }

       

fork(newporc)が2回リターンするイメージ
画像


6、FD(file descriptor)の実態
ファイルをオープンした時には、0~19の小さな整数が返る。

実装は以下の通り。
http://www.tamacom.com/tour/kernel/unix/S/85.html#L218

user構造体の*u_ofile[NOFILE]に保持しているので、配列の上限NOFILE(20)以上のファイルは開けない。





Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック)
技術評論社
山森 丈範

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック) の詳しい情報を見る / ウェブリブログ商品ポータル

2010年11月17日水曜日

禁書が届きました

日曜日のV7から始めるUNIX講座

いや面白かった、V7の関数って一つ一つは短い、1ページに収まるくらいです。
いきなりLinuxのソースコード見るのは確かに敷居が高すぎる。

まずは、V7で勉強して基本を押さえるってのは、良いなと思いました。
実は放送が始まるまでに家の中探してたのですが、ついに見つからずにポチッた
Lions' Commentary on UNIX
が届きました。
放送で紹介されてたUNIXカーネルの設計も一緒に
画像


Lions' Commentary on UNIX自体はV6の解説本らしいですが、forkのところ読んでみたらV7と一緒でしたね。
前半がソースコード(コメント付き)、後半に解説という構成の本です。
前書きを読むとは元々は2冊だったようです(ソースコードと解説)
まえがきを読むと、出版までに紆余曲折があったのことが分かります。
表紙にあるようにUNIXに興味がある人たちがコピーを繰り返してアングラで広まっていたそうです。

ソースコード部分は9,000ステップ
1人でも読めなくはない。一説によると1人で理解、保守できるのは10,000ステップが限界ってことなのでそれを若干下回る分量になります。
それをこうやって書籍で見れるのは素晴らしいですね。

基本趣味なのですが、OSについて理解が深まることは、仕事にも間接的にいい影響があるのではないかと思います。
先人に敬意を払いつつ、まずは読み進めてみることにします。

都内ですが、Lions' Commentary on UNIXの読書会も開催されているようです。
http://atnd.org/events/9595
さっそく登録してみました。

今後、LinuxベースのOS(Android, Meego, Linaro)はますます発展していくでしょうから、楽しみです。

2010年11月14日日曜日

VMWare Playerで仮想ディスクのサイズを変更する

えっと、普段は64ビットマシン(Windows7)でAndroidのフルビルドとかやってます。
VWMWare Player3.1.2にUbuntu10.04をゲストOSとしてインストールして環境構築してます。
当初40GBほど仮想ディスクを割り当てたのですが、あっという間にディスクが減ってきます。
残り20%:8Gほど。8GBぽっちだと、repo syncでソース取ってくるくらいなら良いですが、Makeしたら間違いなく足らなくなります。

ということで仮想ディスクのサイズ変更をしたいなと、
仮想マシン→仮想マシンの設定 ハードディスクのユーティリティで増やしても、Ubuntuにログインしてdfしても、あれ容量増えてない。
調べてみると、VWMwareで設定変更しても、それはゲストOSに反映されないので、パーティションツールとか使って広げてねと。
う~ん、けっこう悩みました。色んなサイトに書いてあるんですが、皆さんさらっと文章で書いてあるだけで手順がイマイチ分からない。ということで今日試行錯誤してみました。

一応念のため「パーティション情報を修正するので、あらかじめバックアップ等を行い、手順を良く確認してから作業を行って下さい」

●準備するもの
GParted 0.7.0.4 パーティションの追加、サイズ変更、削除するツール(パーティションの結合は未対応)
以下のサイトからLiveCDのISOのイメージをダウンロードして下さい。
http://gparted.sourceforge.net/download.php

●VMWare側の設定
仮想マシン→仮想マシンの設定
画面でハードディスクを選択します。
画像


ユーティリティで「拡張」をクリックします。
画像


ディスク容量の拡張ウインドウがポップアップするので、「ディスク最大サイズ」でサイズを大きくして下さい。
ここに書いてあるように「パーティションおよびファイルシステムのサイズは変化しません」
画像


拡張ボタンを押すと拡張が始まります。
画像


拡張が完了します。
画像


仮想マシン設定画面に戻り、ディスクサイズが拡張されたか確認します。
画像


●GPartedのブート設定
GPartedはLiveCDのISOイメージなので、仮想マシンにおいて、GPartedをブートするように設定します。

まずは、そのままだと仮想ディスクからブートしてしまうのでBIOSでブートの優先順位を仮想CD-ROMを一番上にします。
といっても、実マシンのBIOSではなく、仮想マシンのBIOSです。
仮想マシンでBIOSを起動するには、VMware構成ファイルを編集します。
ただのテキストファイルなので、メモ帳等で開いて以下の設定を追記します。
bios.forceSetupOnce = "TRUE"

仮想マシン→仮想マシンの設定
画面でCD/DVDを選択します。
「デバイスのステータス」で起動時に接続にチェックを入れます。

「接続」でISOイメージファイルを使用するを選択し、参照ボタンでダウンロードしたGPartedを指定します。
画像


仮想マシンを再生します。BIOS画面が表示されます。
矢印ボタンでBootタグを選択します。CD-ROMを一番上に持ってきます。”-”を押すと上に移動します。
F10 Save & Exitで設定を保存してリブートします。
画像


●GPartedでの作業
リブートすると、GPartedが仮想CD-ROMから起動します。
GParted Live(Default settings)でエンターキーを押下します。
画像


キーマップの選択
タブキーで移動して「select keymap from full list」でエンターキーを押下します。
画像


リストから「Japanese / PC 110 / Standard」を選択して「OK」を押下します。
画像


言語設定
言語設定画面が表示されるので、15を入力してエンターキーを押下します。
画像


起動モードの選択
そのままエンターキーを押下します。
画像


GPartedが起動します。
画面上で110GBが未割り当てになっているので、こいつを「/dev/sda1」に追加したいんです。
画像


対応しているフォーマットを確認しておきます。
Ext4にも対応してるのでOKです。
画像


まず、拡張領域のSWAPを削除します。linux-swapを右クリックして「Delete」を選択します。
画像


SWAPが未割り当てになりました。
画像


拡張領域「/dev/sda2」を削除します。/dev/sda2を右クリックして「Delete」を選択します。
画像


これで、「/dev/sda1」以外のパーティションが1つになりました。
画像


「/dev/sda1」のサイズを変更します。右クリックして「リサイズ/移動」を選択します。
画像


別ウインドウがポップアップするので、上の領域の右端をドラッグします。
画像


後方の空き領域にSWAP用に2GBくらい残して広げます。
画像


「/dev/sda1」のサイズが変更できました。
画像


未割り当てで右クリックして「New」を選択します。
画像


種類で「拡張パーティション」を選択して「Add」を押下します。
画像


拡張パーティションが作成されました。
画像


未割り当てを右クリックして「New」を選択します。
画像


種類は「論理パーティション」、ファイルシステムは「linux-swap」を選択して「Add」を押下します。
画像


Swapの追加が完了します。
画像


メニューの「Apply」ボタンを押すと、確認のウインドウがポップアップするので「Apply」を押下します。
画像


パーティションの変更の適用が始まります。「全ての操作が無事完了しました」と表示されたら「Close」ボタンを押下します。
画像


変更が適用されました。「/dev/sda1」「/dev/sda2」が作成されます。
画像


GPartedから起動しないように、設定を元に戻します。
画像


仮想マシンを再起動します。

Ubuntuにログインして、サイズの確認を行います。
ちなみにこれが変更前の状態です。
画像


そしてこれが変更後の状態です。
使用可の領域が約114GBに増えました。
画像


ちょっとややこしいですが、順番に作業すれば、難しくないと思います。
仮想ディスクの追加でも良いのですが、けっきょくゲストOSでFDISKでパーティションテーブルを変更してマウントポイントを決めてと手間はそんなに変わらないのでディスク容量が余っていましたので、がつっとでっかく容量を増やす方法を試しました。

UbuntuでAndroid端末を認識させる

UbuntuにAndroidアプリの開発環境を構築するところまでいったので、次は実機の接続に関して書いておきます。

●Windowsの場合
Windows版なら、AndroidSDKの配下のusb_driverの下にドライバがあるので接続してウイザードが起動したら、ここを指定してやれば基本OKです。
Galaxy sは別途kiesというツールを入れないとドライバ入らなかったです。
以下参照
http://xiangcai.at.webry.info/201010/article_11.html

●Ubuntuの場合
Ubuntu(Linux)には、デバイスドライバは特にありません。
ただ、Ubuntuでは外部のデバイスと接続するには、デバイスファイルが必要です。
/dev/xxxxxxxxってのです。
デバイスファイルは手動でも書けなくはないですが、カーネル2.6以降は新しいデバイスの接続、切断がカーネルから通知されるようになりました。
この通知をudevというプロセスがデーモンとして常駐(udevd)していて受け取って、デバイスファイルの作成、削除を良しなにやってくれる仕組みになっています。
試しにPSコマンドで見てみると、4ついますね。

oono@ubuntu:~$ ps -aux | grep udev
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
root 342 0.0 0.0 17032 1116 S 07:08 0:00 upstart-udev-bridge --daemon
root 344 0.0 0.0 17216 1028 S 07:08 0:00 udevd --daemon
root 475 0.0 0.0 17212 956 S 07:08 0:00 udevd --daemon
root 476 0.0 0.0 17212 908 S 07:08 0:00 udevd --daemon

ただ、udevも何も情報がないところからデバイスファイルを作れないので作る際の情報(ルール)を教えてあげる必要があります。
ルールは、「/etc/udev/rules.d」というディレクトリに置きます。
見てみると、あれ?数が少ないですね。
READMEを見てみると、ここにはローカルなルールを置けとありますね。
パッケージなどが見るルールは「/lib/udev/rules.d」にありました。
私が最初に見たのは8.04だったので、それから変わったのでしょうね。間違ってシステムが使うルールを改変したりすることがなくなるので良いことです。

●ルールの書き方
http://developer.android.com/guide/developing/device.html
のDeveloping on a Deviceの欄に手順が書いてあります。

/etc/udev/rules.d/51-android.rules
というファイルを新規で作って、以下の一文を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"

USBデバイスでベンダーIDが0bb4でパーミッションが0666で作成するという意味です。
ベンダーIDは各メーカが個別で重複しないように保持しています。
http://mcn.oops.jp/wiki/index.php?USB/PnP

そのため、接続するAndroid端末のベンダーIDを調べて指定する必要があります。

●ベンダーIDの調べ方
http://developer.android.com/guide/developing/device.html
の下の方にUSB Vendor IDsという欄があり、分かっているものの一覧があります。
このベンダーIDを使えば良いです。




ManufacturerUSB Vendor ID
Acer0502
Dell413c
Foxconn0489
Garmin-Asus091E
HTC0bb4
Huawei12d1
Kyocera0482
LG1004
Motorola22b8
Nvidia0955
Pantech10A9
Samsung04e8
Sharp04dd
Sony Ericsson0fce
ZTE19D2


この一覧に乗っていないベンダーの場合は、「lsusb」というコマンドで調べることが出来ます。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/510showusbdev.html

●実際に接続
手元にあるAndroid端末を使ってやってみました。

★NexusOne
接続してlsusbしても情報が出てきません。どうやらホストOS(Windows7)側に接続を持っていかれてるようです。
なので、VMWareの右下にあるアイコンを右クリックして「接続(ホストから切断)」を選択します。
アイコンが有効になって、点滅すればOKです。

画像


lsusbの実行結果が
Bus 001 Device 002: ID 18d1:4e12

51-android.rulesに以下を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"

NexusOneを抜き差しします。/dev/の下に以下のデバイスファイルが追加されていました。
brw-rw---- 1 root disk 8, 16 2010-11-14 15:39 sdb
crw-rw---- 1 root disk 21, 2 2010-11-14 15:39 sg2

Eclipseを起動してDDMSを起動します。Devicesに名前が表示され、OSも2.2.1になっています。
画像


AndroidSDKのtoolsの下へ移動してadb shellを実行しています。
ubuntu:~/software/android-sdk-linux_x86/tools$ ./adb shell
$ ls
config
cache
sdcard
acct
mnt
d
etc
system
sys
sbin
proc
init.rc
init.mahimahi.rc
init.goldfish.rc
init
default.prop
data
root
dev
$
ということでadbコマンドも実行可能なので問題なく接続しています。

以下同じなので省略しますが
Galaxy s
Bus 001 Device 004: ID 04e8:681c Samsung Electronics Co., Ltd

HT03-A
Bus 001 Device 006: ID 0bb4:0c02 High Tech Computer Corp.
何故かHT-03Aはルールを記述しなくても認識しました。

GDDフォン
Bus 001 Device 007: ID 0bb4:0c02 High Tech Computer Corp.
同じく何もしなくても認識されました。

IS01
Bus 001 Device 008: ID 04dd:9337 Sharp Corp.

ということで最終的に以下の記述を追記することでUbuntu上のEclipseおよびadbからアクセスできるようになりました。

SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04dd", MODE="0666"

-----
--------
AUTHOR: 電脳羊(Android Dream)
TITLE: Ubuntu10.04(64bit)でAndroidアプリの開発環境の構築
DATE: 11/14/2010 11:35:00 AM
PRIMARY CATEGORY: 開発
CATEGORY: Android
STATUS: publish
ALLOW COMMENTS: 1
ALLOW PINGS: 1
CONVERT BREAKS: 1
-----
BODY:
Ubuntu10.04でAndroidアプリを開発するための開発環境を構築します。
せっかくなのでNDKの環境も併せて構築します。

●必要なもの
・Eclipse Galileo(3.5.2)
→Helios(3.6)だとADTが対応していないのでGalileoを使います。
・Eclipse 日本語化言語パック (サードパーティ版)
・ADT 0.9.9
・AndroidSDK
・AndroidNDK

●ダウンロード
Eclipse Galileo(3.5.2)
3.5.2のLinux用64ビット版をダウンロードします。
http://www.eclipse.org/downloads/
右下の「Related Links」の下にEclipse Galileo(3.5)というリンクがあるのでクリック

画面から辿って必要なファイルをダウンロードします。
画像


Eclipse 日本語化言語パック (サードパーティ版)
http://sourceforge.jp/projects/blancofw/wiki/nlpack.eclipse
3.5.2 Stream Buildをクリックします。
各種パッケージ用の日本語化言語パックがあるのでダウンロードしたEclipseに合わせて選択して下さい。

ADT 0.9.9
Eclipse上でオンラインで取得します。ファイルとしてダウンロードする必要はありません。
http://developer.android.com/sdk/eclipse-adt.html
に記述があるようにEclipseで新規ソフトウエアの追加で「https://dl-ssl.google.com/android/eclipse/」からダウンロードします。

AndroidSDK
http://developer.android.com/sdk/index.html
Linux(i386)をダウンロードします。

AndroidNDK
http://developer.android.com/sdk/ndk/index.html
Linux 32/64-bit(x86)をダウンロードします。

●ファイルの解凍
Eclipse
ダウンロードしたファイルを適当な場所に解凍します。
tar -xzvf file_A.tar.gz とすればtar.gz形式のファイルを解凍と展開を一度に行います。

解凍したディレクトリで、./eclipse を実行して起動確認(メニュー、メッセージ類は英語)します。
Eclipseを終了します。

Eclipse 日本語化言語パック (サードパーティ版)
unzip file.zip を実行します。日本語化したファイルがeclipseに展開されます。
解凍したディレクトリで、./eclipse を実行して起動確認(メニュー、メッセージ類は日本語)します。

AndroidSDK
tar -xzvf android-sdk_r07-linux_x86.tgz を実行して解凍します。

AndroidNDK
unzip android-ndk-r4b-linux-x86.zip を実行して解凍します。

●ADTのインストールと設定
Eclipseを起動します。
ヘルプ→新規ソフトウエアのインストールを選択します。
ウインドウがポップアップするので、作業対象の入力欄に「https://dl-ssl.google.com/android/eclipse/」を入力して追加ボタンを押下します。
画面真ん中にDeveloper Toolsと表示されるので、全てのオブジェクトを選択して「次へ」押下します。
画像


そのまま「次へ」を押下します。
画像


同意を選択して「完了」を押下します。
画像


プラグインのダウンロードが始まります。
画像


セキュリティー警告が表示されますが、「OK」を押下します。
画像


ソフトウエア更新
「はい」を押下して、Eclipseを再起動します。
画像


Eclipseが起動したら、ウインドウ→設定を選択すると設定画面がポップアップします。
上から2番目に「Android」が追加されていることを確認します。
画像


Androidをクリックします。以下の画面が表示されるので、そのまま「Proceed」を押下します。
画像


設定画面でSDK Locationに解凍したAndroidSDKのパスを設定してOKを押下します。
画像


これでEclipse上でAndroidアプリの開発が出来るようになりました。

●AndroidSDKのバージョンアップ
ダウンロードしたAndroidSDKには最低限のものしか入っていません。必要なものをダウンロードします。
Eclipseの画面でウインドウ→Android SDK and AVD Managerを選択します。
画像


Installed Packagesを押下して「Update ALL」を押下します。
Updateの一覧が表示されます。
画像


Accept Allをクリックして、「Install」を押下します。インストールが始まります。
画像


若干時間が掛かります。

ADBのRestart確認画面が表示されるので「はい」を押下します。
画像


インストールが終わったら「Close」を押下した作業を完了します。
画像





Android開発 最新動向レポート2010 (CD+冊子)
インプレスR&D
日本Androidの会

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Android開発 最新動向レポート2010 (CD+冊子) の詳しい情報を見る / ウェブリブログ商品ポータル

Google Androidプログラミング入門
アスキー・メディアワークス
江川 崇

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Google Androidプログラミング入門 の詳しい情報を見る / ウェブリブログ商品ポータル