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コマンドも無しで良いというニュアンスです。
したついでに、いつもの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コマンドも無しで良いというニュアンスです。
- 関連記事
-
- OSエミュレータ | LinuxバイナリをWindows上で実行するAtratusというソフトウェアを試してみた (2)
- OSエミュレータ | LinuxバイナリをWindows上で実行するAtratusというソフトウェアを試してみた→×
- QEMU | VMware Player上のUbuntuでMinGW32 GCCをapt-getしてインストールしてみた
- QEMU | ARM (Linux非対応) Insight-7.4でARM Linux Arduinoスケッチをデバッグ
- QEMU | UbuntuのARMユーザランド + ARM Linux GDBでARM Linux Arduinoスケッチをデバッグ (2)
- QEMU | UbuntuのARMユーザランド + ARM Linux GDBでARM Linux Arduinoスケッチをデバッグ→△
- QEMU | UbuntuのネイティブなGDBSERVERをインストールして動かしてみた
- QEMU | Ubuntuのchroot機能とマルチアーキテクチャ機能を使ってARM Linux Arduinoスケッチを実行
- QEMU | Ubuntuのchroot機能でCEV-RZ/A1L Linuxのルートファイルシステムをエミュレーション
- QEMU | Ubuntuのマルチアーキテクチャ機能を使ってARM Linux Arduinoスケッチを実行
- QEMU | CEV Linux SDK V2.00.00 GCC 4.7でビルドしたARM Linux ArduinoスケッチをQEMUで実行
- QEMU | Linaro ARM Linux GCC 4.7でビルドしたARM Linux ArduinoスケッチをQEMUで実行
- Arduino IDE | Linux Arduino互換ライブラリをCEV Linux SDK V2.00.00 GCC 4.7でビルド→正常終了
- Arduino IDE | Linux Arduino互換ライブラリをUbuntu/Linaro x86 Linux GCC 4.7でビルド→正常終了
- Arduino IDE | Linux Arduino互換ライブラリをLinaro ARM Linux GCC 4.7でビルド→正常終了
2014/01/29 blog-entry-414 category: Arduino Lib & CrossGCC
| h o m e |