なんとかなるさね

マイコンをネタにブログを始めてみました


QEMU | Ubuntuのchroot機能とマルチアーキテクチャ機能を使ってARM Linux Arduinoスケッチを実行 

1つ前のエントリでUbuntuのchroot機能でCEV-RZ/A1L Linuxのルートファイルシステムをエミュレーション
したついでに、いつものLinux Arduinoスケッチ(sketch_jan10a.cpp.elf /dev/tty /dev/ttyS2 /dev/ttyS3)を
実行しようとして、CEV-RZ/A1L Linuxのルートファイルシステムでは実行出来ないことに気付きました。

(1) CEV-RZ/A1L Linuxの/devに、/dev/cosoleはあるが、/dev/ttyや/dev/ttyS2や/dev/ttyS3がない
(2) VMware Playerの共有フォルダ機能でWindowsとVMware Player上のUbuntuで共有したフォルダがない

このうち、(2)は単にUbuntu上のCEV Linux SDKでビルドしたCEV-RZ/A1L Linuxのルートファイルシステム
フォルダ(Ubuntu上でビルドしましたのでUbuntu上にあります)のどこかにmountコマンドで共有フォルダを
割り当ててしまえば良いだけなのですが、(1)については困ってしまいました。(もともと、パソコンとCEV-
RZ/A1Lでは使用出来るデバイスが異なりますので、/devの内容が異なるのも当然といえば当然なのですが。)

あれこれ試行錯誤した結果、とりあえず、以下のようにすれば何とかなることがわかりました。

(1-1) Ubuntuの本物のルートフォルダを一旦CEV-RZ/A1L Linuxのどこかにmountコマンドで割り当てる
(1-2) その場所から見えるUbuntuの/dev/ttyをCEV-RZ/A1L Linuxの/dev/ttyにシンボリックリンクする

具体的には、以下のようにしました。(追記 : /dev/ttyS1なども同じだろうと思い込んで一緒にシンボリック
リンクしてしまいましたが、後になって試したところ、こちらの方は動作しませんでした、、、)

mkdir -p $NEWROOT/home/ubuntu/Galileo
sudo mount -t vmhgfs .host:/Galileo $NEWROOT/home/ubuntu/Galileo

mkdir -p $NEWROOT/home/ubuntu/root
sudo mount --bind / $NEWROOT/home/ubuntu/root
ln -s /home/ubuntu/root/dev/tty $NEWROOT/dev/tty
ln -s /home/ubuntu/root/dev/ttyS1 $NEWROOT/dev/ttyS1
ln -s /home/ubuntu/root/dev/ttyS2 $NEWROOT/dev/ttyS2
ln -s /home/ubuntu/root/dev/ttyS2 $NEWROOT/dev/ttyS3

sudo chroot $NEWROOT /bin/sh
ls /dev
cd ~/Galileo/sketchbook
build/sketch_jan10a.cpp.elf /dev/tty /dev/ttyS2 /dev/ttyS3 ; stty sane

また、NEWROOTは、それぞれ以下の通り設定しました。

CEV Linux SDK V1.00.00の場合

NEWROOT=~/CEV_Linux_SDK_V1.00.00/buildroot-2013.05-cevrza1l-20130912-1/output/target

CEV Linux SDK V2.00.00の場合

NEWROOT=~/CEV_Linux_SDK_V2.00.00/buildroot-2013.08.1-cevrza1l-20131202-1/output/target

CEV Linux SDK V1.00.00の場合の実行結果 (スケッチはLinaro ARM Linux GCC 4.7でビルドしました。)



CEV Linux SDK V2.00.00の場合の実行結果 (スケッチはCEV Linux SDK V2.00.00 GCC 4.7でビルドしました。)



なお、今までは、このスケッチを実行するとLinuxコマンドプロンプトウィンドウでキーボード入力がエコー
バックされなくなってしまっていましたが、今回、stty saneコマンドを実行して復帰させるようにしました。

追記 : 雑感

chroot後でも元々の/devの全てにアクセス出来るようになれば、Linuxカーネル組み込み製品で以下のような
運用が出来て、ちょっと便利そうな気がしました。

* 通常運転時には、それこそ本当に必要最小限のファイルだけでルートファイルシステムを構成する
* メンテナンス時には、外付けデバイス上に構成した普通のルートファイルシステムにchrootする
* またはイーサネット(or USB仮想LAN)接続先に構成したリモートルートファイルシステムにchrootする

この必要最小限のニュアンスは、使われないならlsコマンドもcpコマンドも無しで良いというニュアンスです。

関連記事

2014/01/29   blog-entry-414   category: Arduino Lib & CrossGCC

go page top