さえきさんの ホームページ  -  Armadillo のページ -


その5 - colinuxでのクロスコンパイル環境 -


 Armadillo組み込みLinuxカードの活用を コツコツ とすすめてきました
Armadilloの 拡張I/Oポートの利用で 紹介したように 拡張I/Oが
Armadilloは、PC/104規格に準拠していて 組込み機器開発に 大変重宝です

その4 - Armadilloに 専用リモート操作装置  で 紹介しましたように
直接Armdillo Linuxカードに付帯した 専用の操作装置の作成も済みまして

さて さらに進め より本格的な組み込みLinuxの応用装置を 考えています

最近 PC/104規格対応拡張ボードのなかに PLA搭載のすごいものもあって
入手し 検討をすすめています  それには ドライバソフトの開発が伴います
これまでは MebiusPCのVineLinuxやIBM_XP_PCでのCygwinなどでやってましたが
開発環境整備をねらって colinuxを導入してみました  メモを記します

colinuxでのクロスコンパイル環境の整備

colinuxのインストール・設定が済んだあと armadillo用のクロスコンパイル環境の整備をしました:

colinux:/home/saekisan# ls -l /home/
-rw-r--r-- 1 saekisan saekisan 1626882 Dec 8 18:02 binutils-arm_2.9.5.0.37-1e3_i386.deb
-rw-r--r-- 1 saekisan saekisan 71184 Dec 8 18:02 cpp-arm_2.95.2-12e4_i386.deb
-rw-r--r-- 1 saekisan saekisan 1079958 Dec 8 18:03 g++-arm_2.95.2-12e4_i386.deb
-rw-r--r-- 1 saekisan saekisan 971218 Dec 8 18:03 gcc-arm_2.95.2-12e4_i386.deb
drwxrwxrwx 2 saekisan saekisan 4096 Dec 8 18:03 lib
-rw-r--r-- 1 saekisan saekisan 106758 Dec 8 18:03 libstdc++2.10-arm_2.95.2-12e4_i386.deb
-rw-r--r-- 1 saekisan saekisan 87288 Dec 8 18:03 libstdc++2.10-dev-arm_2.95.2-12e4_i386.deb
drwxrwxrwx 2 saekisan saekisan 4096 Dec 9 10:50 saekisan

colinux:/home/saekisan# ls -l /home/lib
-rw-r--r-- 1 saekisan saekisan 890388 Dec 8 18:03 libc6-arm-cross_2.1.3-19_all.deb
-rw-r--r-- 1 saekisan saekisan 2340050 Dec 8 18:03 libc6-dev-arm-cross_2.1.3-19_all.deb
-rw-r--r-- 1 saekisan saekisan 137022 Dec 8 18:03 libncurses5-arm-cross_5.0-6.0potato1_all.deb
-rw-r--r-- 1 saekisan saekisan 280350 Dec 8 18:03 libncurses5-dev-arm-cross_5.0-6.0potato1_all.deb
-rw-r--r-- 1 saekisan saekisan 13188 Dec 8 18:03 libpopt-dev-arm-cross_1.4-1.1_all.deb
-rw-r--r-- 1 saekisan saekisan 10290 Dec 8 18:03 libpopt0-arm-cross_1.4-1.1_all.deb
-rw-r--r-- 1 saekisan saekisan 152686 Dec 8 18:03 slang1-arm-cross_1.3.9-1_all.deb
-rw-r--r-- 1 saekisan saekisan 220322 Dec 8 18:03 slang1-dev-arm-cross_1.3.9-1_all.deb
colinux:/home/saekisan#

これらは  ArmadilloHPのcross-dev からDLしたものです  
devl/deb下 の 6つ と lib/deb下 の 8つ です

これらを colinuxへftpアップ  (上のリストでは Armadillo経由nfs で /home 下へアップ)
colinux側コンソールにて dpkg -i *.deb や dpkg -i lib/*.deb などでまとめてインストール
このとき libc6-devがいないよ との長々エラー apt-get install libc6-dev  とやる
ミススペルで またエラー apt-get -f install(ここまでで あとなしよ)で 続行して 完了した

試しのhello.cのコンパイルは 一瞬でした 早いです  そして  実行可を確認 (これ 肝心)
armadilloの方で 実行です −− 当然ですけど これも OK !! ホッ です

ところで この際 調子に乗って armadilloでntfdサーバを機能させたくて Armadilloのカーネルを
再構築しようと試みたのですが   (これについて詳しくは 項をあらためて レポートします)
カーネルソースを Armadillo HP から DL し、make menuconfig を指示したところ 先へ進みません
対話式にパラメータを設定するための 追加のインストール apt-get install libncurses5-dev
要しました このあと make dep 、make r 、make clean は順調に進み ImageImage.gzを得ました

念願のカーネル再構築にも目処がつき この開発環境は 今後大いに活用してゆきたい と喜んでいます

−−−−−−−−−−−−−−−−−−−−−−−−

colinuxでのクロスコンパイル手順 は以下のとおりです:

1.40(colinux)の/home/saekisan(/homeは nfs exportされています)で コンパイル作業をします

# arm-linux-gcc [-I/usr/arm-linux/include -L/usr/arm-linux/lib] hello.c -o hello [ ]部省略出来るみたい
colinux:/home/saekisan# gcc -o hello hello.c

生成された実行ファイル(例では「hello」)をfileコマンドで確認すると(apt-get install fileで取り込みました)
ホストPCのLinux(CPU:x86)ではなく、ターゲットのLinux(CPU:ARM)で動くものであることが分かります。

# file hello
hello: ELF 32-bit LSB executable. ARM, version 1 (ARM) for GNU/Linux 2.2.0,
dynamically linked (uses shard libs), not stripped

1.40(colinux)側で chmod +x と実行可能にしてやり 1.20(armadillo)側で 実行し確認します


1.20(armadillo)では mount -t nfs -o tcp colinux:/home /mnt と/mntにマウントしてあります
armadilloへ向かって ftpでファイルを送り込むなり armadilloの他のディレクトリから mvやcpして
/mnt下にファイルを置けば それらは colinuxの /home下に置いたのと 同等だということです

colinux:/home/saekisan# ls -l  で
-rwxr-xr-x 1 root root 11524 Dec 9 11:41 hello
-rw-r--r-- 1 root root 78 Dec 8 18:29 hello.c
colinux:/home/saekisan#    ということで 

saekisan@armadillo:/mnt/saekisan$ ls -l    で
-rwxr-xr-x 1 root root 11524 Dec 9 11:41 hello
-rw-r--r-- 1 root root 78 Dec 8 18:29 hello.c
saekisan@armadillo:/mnt/saekisan$   ということです

ところで  面白い事実をみつけた:  file というコマンド 使えますね  なんで出来たのかの手掛かりにはなる
面白いことというのは armadillo自体にセルフコンパイル出来る gccをインストールしてあるが 何より遅い 本当に

それだけではなく どういうことなのか 出来たファイルサイズが倍以上に大きいのです  実行結果は同じですが
いくつかでチェックしたけど    私の想像ですが これ以上時間を掛けてコンパクトさを求めない妥協では?

コンパイルの速度の点で 今後は colinuxでのクロスを使うことになろう  このとき セルフのと比べてみよう
(これ以外に これまでに cygwinでもつくってあるし MebiusPCのVine2.6Linuxでも出来るようになっています)

cat /proc/cpuinfo で見た結果です(それぞれ armadillo と IBMPCでのcolinuxとで):
Processor : ARM ARM720T rev 2 (v4l)
BogoMIPS : 36.76

model name : Mobile Intel(R) Pentium(R) 4 - M CPU 2.00GHz
bogomips : 1159.98

 "Bogo" は "bogus (偽、いんちき)" に由来するもので、「偽物」を意味します。
それゆえ、BogoMips は、プロセッサ速度に関するある種の尺度にはなりますが、
あまりにも「非科学的」な方法でしか計測していないので、BogoMips と呼ばれている
と いうものなんですが  能力に大きな差がありそうですね

−−−−−−−−−−−−−−−−−−−−

さて 忘れないうちに colinuxインストールの様子を メモしておきましょう:

http://scratchpad.fc2web.com/colinux/ と http://iwa.ath.cx/colinux/ を主に参考にしました

SourceForge上のcoLinuxのサイトからcoLinuxとディスクイメージを取得します。

coLinux-stable    0.6.2-linux-2.6.10   が 最新でした  感謝しつつDL

まずは、coLinux-0.6.0.exeダブルクリックしてインストーラを起動します
ライセンスの確認のあと とりあえず、ここではTAP-Win32とWinPcapの両方を選んでおきます

coLinuxに必要なルートディスクとスワップディスクの準備をします

ルートディスクの準備

ルートディスクはダウンロードした Debian-3.0r2.ext3-mit-backports.1gb.bz2  を使います。
展開します。これはCygwin上では次のようの行います。
$ cd /cygdrive/…/coLinux
$ bzip2 -d Debian-3.0r2.ext3-mit-backports.1gb.bz2

Debian-3.0r2.ext3-mit-backports.1gb 1GBのファイルができればOKです。

(この度の armadillo用の開発だけに使用するのに
最終的にいろいろインストールしたあとでも
dfでみたところ 以下のようですので 1Gで充分です
X-Windowなど本格的ですと増量が必要なのかも Filesystem   1k-blocks   Used   Available Use% Mounted on
/dev/cobd0   1032088  258256   721404  27%    /  )


スワップディスクの準備

128MBのスワップディスクイメージ(swap.fs)
$ cd /cygdrive/…/coLinux
$ dd if=/dev/zero of=swap.fs bs=1M count=128
128MBのファイルができればOK

…\coLinuxにあるファイル default.colinux.xmlを編集  以下は私の自宅IBMXP-PCでのようす:
(ところで colinuxをアンインストールすると、default.colinux.xmlも削除されます。
アンインストールする前にバックアップを取っておくように 次が楽です)



 以上です  XPでしたので ネットワークは tap  オフィスのは2000で bridged だったかな?


起動

colinux-daemon.exe -c default.colinux.xml のように
コマンドオプション -C で明示的に config.xmlを指定してやる必要ありです 
Windowsのコマンドプロンプト またはcygwinコンソールにて 起動できます まずは確認ですね

&つけてbgでやれば cygwin閉じてもいい  あとは 使用の際 同じくインストールフォルダにある
colinux-console-nt.exe をダブルクリックでコンソールが開いてくれます (ショーカットでもいい)
この確認後は ネットワーク設定でOK確認までやって 次のように サービス登録します

coLinuxをサービスとしてインストールする方法   手順は簡単:、

「./colinux-daemon -c default.colinux.xml --install-service」を実行した後、(-d 付がいいです)
"e:\colin2\coLinux\colinux-daemon.exe" --run-service "Cooperative Linux" -d -c "default.colinux.xml"
と 登録しました 一々妙な?コンソールが出ません   停止や再起動(.xmlを書き替えたときなど)では
コントロールパネル→管理ツール→サービス→「Cooperative Linux」から起動/停止および設定変更を行う。
アンインストールは、サービスを停止した上で「./colinux-daemon --remove-service」を実行すればよい

colinux起動後は コンソールを開き(自動では出さない設定なら \coLinux\colinux-console-nt.exeをダブルクリック)
ブートメッセージが流れた後ログインプロンプトが出たら ID「root」、パスワード「root」でログインする。
(早めに adduserで ユーザ登録済ませ passwdでルートPWも変更します)
初期状態ではキーボードの認識がUS配列です |は }(shift])「:」は「シフト+;」で入力 など

「dpkg-reconfigure console-data」を実行し、「Select keymap from arch list」→「qwerty」→「Japanese」
(「J」キーをタイプすることでショートカットできる)→「Standard」を選択すると、キーマップが
日本語配列に設定される。 ということでしたが はじめは苦労しました (ここでやれるか未確認 
この手続きは ネットワークがOKになったあと apt-getで 必要なものをインストールするときにやったです)


ネットワークの設定

エディタコマンドは nano が入っています 初めてだったがまあ楽です

/etc/hostsの修正 127.0.0.1 localhost
192.168.1.40 colinux
192.168.1.20 armadillo
  その他 LAN上のを記述しておけば 名前でアクセスできる
(WindowsPC内は C:\WINDOWS\system32\drivers\etcの hostsを編集)

/etc/resolv.conf
nameserver 192.168.1.1
 
/etc/network/interface
auto lo eth0

iface lo inet loopback

iface eth0 inet static
 address 192.168.1.40
 gateway 192.168.1.1
 netmask 255.255.255.0

書き換えが完了したら、以下のコマンドでそれを反映させます。

# /etc/init.d/networking restart
Reconfiguring network interface: conet0: initialized
done.

確認にはifconfigコマンドを使います。次のように表示されればOKです。

# ifconfig
eth0 Link encap:Ethernet HWaddr 00:43:4F:4E:45:30
inet addr:192.168.1.40 Bcast:192.168.0.255 Mask:255.255.255.0
---- 省略 ----

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
---- 省略 ----

細かな数字は違うかもしれませんが、eth0とloの2つ出力があることと、
eth0のinet addrが期待通りであればOKです。

またゲートウェイの設定は以下のコマンドで確認します。
# route
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0  *   255.255.255.0  U  0   0   0 eth0
default    192.168.1.1  0.0.0.0   UG  0  0   0 eth0

coLinuxにおけるネットワークとは
Windows上に仮想ネットワークドライバをインストールする(TAP方式)と、
WinPcapを利用して仮想ブリッジ接続する方式の2通りが用意されています。

さて ネットワークの設定は、ネットワーク環境が様々であり
一概に「これで大丈夫!」と云えるもの無しです
Windowsのネットワークは問題児を実感しました
いろいろやってみるしかないですかね 詳細略します
コントロールパネル-ネットワークのプロパティ画面とにらめっこ
セキュリティやら パリティ無しに とか  出来ないのも…

私のやった結論: 98XPなら TAPがいい  PCのネットワーク設定で2つをブリッジ設定で簡単
ところが 2000の方はそんな風にはなっておらず WinPcapを使用しました  結構ハマリます 
書くに書けないほどで やっと動いた という感じです  動いてしまえば やり直したくないです
(IPアドレスから言えば 両方ともブリッジです 192.168.1まではネットワーク内 
みな同じですので …  これで pingが LAN上どことも通ります  出来たぁ ホッ)


タイムゾーン  tzconfigコマンドを実行して選択します。
最初に「y」を入力したら、「5」を入力して次に「Tokyo」を入力
/etc/default/rcS で「UTC=no」を確認
最後に以下のコマンドを実行して設定を反映させます
(もちろん次回起動時からは自動的にこのコマンドが実行されます)。
# /etc/init.d/hwclockfirst.sh start


準備していたスワップドライブようやく活用します。
それにはまず/etc/fstabを以下のように編集します。
/dev/cobd0 / ext2 defaults 0 1
proc /proc proc defaults 0 0
/dev/cobd1 none swap sw 0 0

次に以下のコマンドでスワップドライブを初期化します。
# mkswap /dev/cobd1
Setting up swapspace version 1, size = 268431360 bytes

その次はスワップファイルを有効にします。

# /etc/init.d/mountall.sh start
Mounting local filesystems...
nothing was mounted


swapをリブートなしに有効にするには「swapon -a」を実行する
(/etc/fstabを参照してswapを有効化する)。
有効になっているかどうかは「swapon -s」で確認できる。

最後にfreeコマンドで確認します。Swapの行出力されればOKです。
# free
total used free shared buffers cached
Mem: 126892 62724 64168 0 6588 47588
-/+ buffers/cache: 8548 118344
Swap: 262136 0 262136


ここまで来れば インターネット越しに apt-getが出来ます  
 /etc/apt/sources.list編集(元のままでも 基本のは拾えるようです telnetdとか)

telnetd はまず あった方がいいです IP越しに かなり高速な反応で対話できます 
TeraTermを使用してますが colinuxとarmadilloを2つ同時に表示し 快適な対話環境です
passwd やadduser locale設定とか やること一杯あります 必要な都度 追加ですね

/etc/locale.gen
# apt-get install locales で、
/etc/locale.gen を編集 or 確認してください。
ja_JP.eucJP EUC-JP

これがあればOK、無ければ追加して
root権限で locale-gen を実行

Generating locales...
 ja_JP.EUC-JP... done
Generation complete.
  
こんなメッセージが表示されたらOK

※ dpkg-reconfigure locales でも同様の設定が行える
その後、一般ユーザにてログインして ~/.bashrc 辺りに
export LC_ALL=ja_JP.eucJP とか書いておく。

localeの選択は「en_US ISO-8859-1」「en_US.UTF-8 UTF-8」「ja_JP.EUC-JP EUC-JP」
「ja_JP.UTF-8 UTF-8」 などを揃えたほうがいいのかな?
# apt-get install console-data console-tools で「Select Keymap from arch list」
→「qwerty」→「Japanese」→「Standard」は やったかな? これでキーボードちゃんとなる

SAMBA や cofs などファイルの共用はあるけど 何がいいのか? この2つ、ネットワーク設定が
充分でなかったのか 機能せず  パスワード変換設定など ややこしくてあとまわし(ラストに追記した)

つぎの nfs で充分かつ良好でした  Linux同士がつながっていることの方が いいのでは と思います

−−−−−−−−−−−−−−−−−

coLinuxでNFSを使う
http://scratchpad.fc2web.com/colinux/nfs.html  より

最近のcoLinuxは標準のカーネルでNFS機能とNFS over TCP機能がサポートされているので、
カーネルの コンパイルをする必要はありません。サポートパッケージをインストールしてしましょう。

root@colinux# apt-get update
root@colinux# apt-get install nfs-kernel-server

次に、/etc/exportsを編集して外部に公開するディレクトリを指定します。
/homeディレクトリを IPアドレスが192.168.1.xのホストに公開するならば

root@colinux# cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
/home 192.168.1.0/255.255.255.0(rw)


NFSクライアントの構築

これはLAN上のLinuxの設定です。 Armadillo側です

NFSクライアントのサポート機能をインストール Debianなら以下の様な感じ

root@linux# apt-get update
root@linux# apt-get install nfs-common


あとは以下のようにマウントするだけです。
ここでも「-o tcp」をつけることにより「NFS over TCP」が有効としています。
root@linux# mount -t nfs -o tcp colinux:/home /mnt

ユーザIDの管理
coLinuxとLAN上のLinuxでのユーザIDを一致させておきましょう。それが一番楽です。

−−−−−−−−−−−−−−−−−−−−

coLinuxでSAMBAを使う

smbmountを使って、Windowsとファイルのやり取りをする方法です
http://www2.starcat.ne.jp/~kanocl/colinux/colinuxsmb.htm を参考に)

Windows側PCに 共有フォルダを作成します  まず フォルダをを作った後
右クリックしてプロパティで <共有とセキュリティ> を選択設定をします
大切なのは、この画面の<共有名>です。Linux側からアクセスするときに、必要になります
共有名は、共有フォルダの名前ではなくて、この枠に書かれているものを指しています
(c:\colin2下にSMBというフォルダを作りましたが 共有名はSMBにしました)
もう一つ PCのコマンドプロンプトを開き ipconfig /all で ホスト名を拾います
(オフィスのPCでは biostar、HOMEはIBMでした また ログインユーザ名はsaekisan)

つぎ colinux側    colinuxに、rootでログインします。
# apt-get install smbfs でinstall 途中 幾つか質問がある
ワークグループ、ドメイン名とか空欄のまま すすめた パスワードの暗号化はやってもらう
(ウインドウズ側が暗号化パスワードになっているということで  昔はプレーンだったらしい)
IPとかDHCPなにやらには NOをセレクトした  ささーっと おわった(2台で試した いいみたい)

# smbmount //ホスト名/共有名 マウントポイント -o username=ユーザー名,ip=IPアドレス
というマウントですが  まず
# mkdir /mnt/smb  (マウントポイントを作っておく。最初の時のみ) そして

# smbmount //BIOSTAR/SMB /mnt/smb -o username=saekisan IPはなし とキーイン
パスワード聞かれたので Windows側のパスワード (厄介なやつ)を入れた なにも表示なし

これでいいみたい  PC側のSMBフォルダに test.txtを作って置いた
それが colinux コンソールで ls -l /mnt/smb で test.txt が存在 catで拾えた
eucで作れば colinux側コンソールでちゃんと漢字読めたが PC側では 読めなかった
漢字は 問題ですね   ファイル名は とくに 注意が必要ですね
<アンマウント> は   # smbumount /mnt/smb


smb マウント法  メモまとめました        9:44 2005/12/21 作成:さえき

         自分のホーム下に 事前に mkdir smb, chmod 777 smb (RW可)で作成  その上で
         $ smbmount //BIOSTAR/SMB smb -o username=___ と
         $ smbumount smb               です (rootでの操作必要無しです)
      ファイル名は英数字がいい、(???になっちゃうよ)
      内容の方はTeraTermのSetup-TerminalメニューでKanji(receove)の方だけSJISにすれば いいよ


以上
−−−−−−−−−−−−−−−−−−−−

  

  作成:2005-12-9 最終更新日:2005-12-13