親戚のPCが動かなくなって見てくれと電話が入りました。5年ちょっと前に購入したWindows Vistaのマシンです。親戚はPCのことはからっきしで、ネットの契約も私がしたくらいです。
そろそろ寿命が来てもおかしくないなと思って、買い替えを覚悟させて様子を見に行くと、電源いれてもDeskTopがいつまでたっても表示されない状態でした。(HDDは動きっぱなし)あきらかに普段のシャットダウン(でもVistaはSleep!)でおかしくなってますね。電源ボタン長押しで強制再起動、F2でBIOSをデフォルトにしてさらに再起動、一応セーフモードで様子を見ます。いちおうDesktopが表示されて操作できるようになりましたが、HDDの動きが止まりません。当然、HDDの最適化なんて知らないだろうから、HDDの様子を見ると使用量は半分くらいしか使ってません。これならそんなに問題ないと思うんだけど、ブラウザ開いてみたらなんかIEにGoogle Tool Barがついてます。普段の検索はこっちでやってるとのことで、みたらChromeも入ってるじゃん。インストールされているプログラムを調べてみると、案の定おそらくGoogle Tool Barをインストールしたときにデフォルトの推薦でGoogle DeskToopが入ってました。(HDDが動きっぱなしなのはこいつだ!)普段使いの人にはあまり意味がない(そのくせ処理負荷だけ高い)ので、すぐに削除。
ウイルスチェックの状態を調べてみると、最初にはいってたウイルスバスターが更新されずにそのまま・・・まあ普通はこんなもんだよな、ということでこれも削除し、Microsoft Essential入れてきました。(ベストじゃないけど、ベターな選択)ただちゃんとパターン更新してくれるかな~ 後は、VistaのシャットダウンはSleepだから(意味わかってないだろうな)、1週間に1回はメニューのここで完全にシャットダウンしてくれと頼んできました。
とりあえずこれで、Desktopが表示されてHDDが異常に動きっぱなしの状態も解消されました。まあもう2,3年は動いてくれ。(普通の人に、この状態でWindows8渡したら、どうなることやら。M$ももう少しPC使うユーザーのこと考えてくれ)
2013年6月30日日曜日
2013年5月3日金曜日
ART-Linuxの実験 インストール(その2)
ここからが本番のリアルタイム制御専用システム(AP)のインストールです。急に難易度があがります。(産総研のHPにあった論文(?)をベースにやったことを意味を追加してメモしていきます)
4.必要なパッケージのDL
以下のパッケージをDLしてきます。
ap-linux-image-2.6.32-art-generic_20130227_i386.deb
ap-linux-headers-2.6.32-art-generic_20130227_i386.deb
apboot-1.0_20121213_i386.deb
ap-linux-*は、AP用のkernelです。あと、apbootはそれを起動するためのbootコマンドです。
まず、bootコマンドをインストールします。
sudo dpkg -i apboot-1.0_20121213_i386.deb
5.AP用システムの作成
次にAP用のFS(ファイルシステム)を作ります。これまで知らなかったんですが、Linuxでは試験用に別の形態のシステムを作成して動かす機能があり、それを使ってます。
mkdir -p ${APROOT}
sudo debootstrap ${SUIT} ${APROOT}
${APROOT}はAP用のファイルシステムのパス名で、動作させるコア数分だけ作成するようです。今回はCore2DuoなのでAPは1個しか作れませんから、1個だけです。
次の、debootstrapというコマンドが、当該パスの下に${SUIT}で指示されたUbuntuのファイルシステムを作成します。今回は’lucid’です。デフォルトではこのdebootstrapコマンドは入っていませんから、apt-getなりaptitudeでインストールしましょう。このコマンドはファイルシステムをネットからDLしてくるので、結構時間がかかります。
6.エクスポートの設定
システムを動かすうえで、BSPとAPのファイルシステムを相互に参照できると便利だろうということで、APのファイルシステムをBSP側で公開(export)する設定をします。
echo ${APIP} ${APNAME} >> /etc/hosts
echo ${APROOT} ${APNAME}\(rw,no_root_squash,subtree_check\) >> /etc/exports
exportfs -a
${APIP}はAP用のIPアドレス、${APNAME}はAPのホスト名です。適当に設定しましょう。(もちろんBSPから届くネットワークリーチャブルでなければ意味はないでしょうが)→APNAME=AP0とすること!11項のapbootでAPをAP0として起動しているため、これと合わせておく必要があります!
ちょっと思ったのが、いちいちechoコマンドで設定ファイルを修正していますが、直接viでやった方がいいと思います。一瞬、何をしているのか考え込んでしまいました。
7.ルータの設定
APから外部ネットワークに接続するためにはBSP経由行う必要があります。BSPにルータの設定をしてやらないといけません。/etc/network/interfacesに以下の設定をしてやります。
iface ap0 inet static
address ${BSPIP}
netmask 255.255.255.255
pointopoint ${APIP}
up iptables -t nat -A POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE
down iptables -t nat -D POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE
BSPにデバイスap0を定義し、これがAPと通信できるようルートを設定しています。${ETH}はBSP側のEthernetデバイスで、通常はeth0でしょう。あと、/etc/sysctl.confで以下の行のコメントを外してやります。
net.ipv4.ip_forward
8.APカーネルのインストール
ここまで長々とBSP周りの設定をしてきました。ここからやっとAPまわりの設定に入ります。4項でDLしておいたAPカーネルを、5項で準備しておいたAPカーネル用システムにインストールしてやります。
sudo dpkg -i --root=${APROOT} \
ap-linux-image-2.6.32-art-generic_20130227_i386.deb \
ap-linux-headers-2.6.32-art-generic_20130227_i386.deb
9.AP用システムの整備
まだまだ続きます。
(1)AP用システムへ移動(rootで入ることに注意)
# chroot ${APROOT}
(注:${APROOT}が/となり、このシステムのhostsファイル等の設定を行います)
(2)AP用システムのrootのpasswdを設定してやる。
(3)AP用システムの/etc/hostsにて、${hostname}-${APNAME}でホスト名を設定してやる。
(4)/etc/default/console-setup 中のACTIVE_CONSOLESをコメントアウトする。
(5)仮想シリアル端末からのログインを可能にする。
# cd /etc/init
# sed s/tty1/ttyBSP0/ tty1.conf > ttyBSP0.conf
# rm tty?.conf
# cd ..
# sed -i s/ttyS0/ttyBSP0/ securetty
(6)ureadaheadを停止する。
# cd /etc/init
# mv ureadahead.conf ureadahead.conf.bak
# mv ureadahead-other.conf ureadahead-other.conf.bak
(注:ureadaheadはlinux起動を早めるための先読みモジュールです。リアルタイム動作しようとしているので、こういうタイミングに影響が出そうなのは止めといた方が無難でしょう。起動してしまえば関係ないとは思うんですが、なくてもリアルタイム動作には影響しないし、悪さしかしないでしょうから。)
10.AP用のメモリの設定
さて、またBSP側の設定に戻ります。BSPのブート時にカーネルに起動オプションを設定して、AP用のメモリを確保してやらないといけません。
apmem:APに割り当てる低位メモリの領域(複数のAPがある場合はカンマで区切って)
aphighmem:APに割り当てる高位メモリの領域
ampshm:共有メモリに割り当てる低位メモリの領域(APが複数あろうと領域は一つだけです)
maxcpus:BSPカーネルが占有するコア数
どのくらいが適当なのかわからないので、とりあえず以下の設定で動かしてみました。
apmem=300M aphighmem=400M ampshm=100M
ここで「低位メモリ」って何?という意味がわからないと、どれくらいの領域を割り当てたらいいのか見当もつきません。「低位メモリ」とは、Linuxでは物理アドレスの0x00000000を仮想メモリの0xc0000000に割り当てることがほとんどです。つまり仮想アドレスの0xc0000000~0xffffffffの1GBは、物理メモリの最初の場所に配置されることになり、ここを「低位メモリ」と呼びます。
それでここが重要なんですが、Linuxでは複数のプロセスが独自の仮想メモリをもらい動作しますが、この「低位メモリ」は各プロセス共通に割り当てられます。つまり各プロセスがOSのサービスとデータをやりとりしようとしたり、OSのプロセスなんかはこの「低位メモリ」内で動くことになります。
つまり、BSPカーネルとAPカーネルは独自にこの「低位メモリ」領域がないと動けないため、それぞれに動作に必要なだけのメモリを割り当てておかないといけません。とはいっても、どれくらいあれば必要なだけあるかなんて、当該カーネルが動くときにロードするモジュールにもよるので一概に言えません。(特にリアルタイム制御したい、なんて目的なんで外部との専用通信モジュールが必要になることもあるでしょうし)なので適当にとしか言えないのが、つらいところです。
なおうまくメモリ領域が設定できたかは、BSP起動後に/proc/iomemを見てやれば確認できます。
11.APのブート
ここまできてやっとAPの起動ができます。以下のコマンドでインストールしたAP用カーネルが起動し、9(5)で設定した仮想シリアル端末からログインメッセージがでます。
# ifup ap0
# apboot ${APROOT}/boot/vmlinuz-2.6.32-art-generic rw \
ip=${APIP}:${BSPIP}:${BSPIP}:::bsp:p2p \
nfsroot=${BSPIP}:${APROOT},nolock
APが複数ある場合は、apbootのオプションで番号を指定できます。デフォルトは0から始まる番号です。
と、ここまでAPのブートまではできるようになりましたが(できたと思います・・・)、仮想シリアル端末が接続できない状態です。そのうち動くようになったら、また書きます。
追記:
11項でapbootする前に、以下のコマンドでシリアル端末を開いておきます。
sudo screen /dev/ttyAP0
そうするとapbootでAPが起動するときのログが表示されてきます。そこでわかりましたが、起動に失敗してました!ログを見てると、どうもNFSマウントのところで失敗しているようなんですが、なんかap0とap1が混在してる?そういやapbootでAP0として起動してるのに、NFSの設定やらhostsファイルやらAP1で定義してちゃあかんでしょ!
ということでそこを修正、だいぶ起動シーケンスが進むようになりましたが、今度はAP0からBSPへのネットワークが届かないとのこと。どこかルータの設定に問題があるようです。先は長いです。(しかしAPの起動って、数十秒単位で結構時間かかるのね・・・)
結果:
やっと動きました。ルータの設定で最初APIPとBSPIPを同じネットワークアドレスにしたのがまずかったのかと思ったんですが、それでも状況は変わりません。(でもこれはまずいと思います)
APの起動ログをよく見ると、どうもNFSのマウントでBSP側からの応答がないということらしいということで、BSPのNFSサーバ周りの設定を見直しました。デフォルトだとUbuntuのデスクトップ版ではサーバ関係のパッケージ何も入っていないので、後からnfs-kernel-server, nfs-commonを追加インストールしましたが、どこか問題があったようです。手動でnfsdを動かしてやろうと、
sudo /etc/init.d/nfs-kernel-server restart
とやると処理が固まってしまい、戻ってきません。いやこれは明らかにおかしいだろうとネットをググってみると、どうもportmapが動いていないとこうなるようです。psコマンドで見ると、確かに動いてません。設定のどこに問題があるのかわかりませんが、ブート時にportmapが起動してくれなくて、そのためnfsdも動いてなかったようです。そこでとりあえず手動でこのあたりを起動して、再度apbootしたら、あっさり動いてくれました。先に起動に時間がかかるといってたのは、NFSのマウントでtime-outを待っていたせいでした。
4.必要なパッケージのDL
以下のパッケージをDLしてきます。
ap-linux-image-2.6.32-art-generic_20130227_i386.deb
ap-linux-headers-2.6.32-art-generic_20130227_i386.deb
apboot-1.0_20121213_i386.deb
ap-linux-*は、AP用のkernelです。あと、apbootはそれを起動するためのbootコマンドです。
まず、bootコマンドをインストールします。
sudo dpkg -i apboot-1.0_20121213_i386.deb
5.AP用システムの作成
次にAP用のFS(ファイルシステム)を作ります。これまで知らなかったんですが、Linuxでは試験用に別の形態のシステムを作成して動かす機能があり、それを使ってます。
mkdir -p ${APROOT}
sudo debootstrap ${SUIT} ${APROOT}
${APROOT}はAP用のファイルシステムのパス名で、動作させるコア数分だけ作成するようです。今回はCore2DuoなのでAPは1個しか作れませんから、1個だけです。
次の、debootstrapというコマンドが、当該パスの下に${SUIT}で指示されたUbuntuのファイルシステムを作成します。今回は’lucid’です。デフォルトではこのdebootstrapコマンドは入っていませんから、apt-getなりaptitudeでインストールしましょう。このコマンドはファイルシステムをネットからDLしてくるので、結構時間がかかります。
6.エクスポートの設定
システムを動かすうえで、BSPとAPのファイルシステムを相互に参照できると便利だろうということで、APのファイルシステムをBSP側で公開(export)する設定をします。
echo ${APIP} ${APNAME} >> /etc/hosts
echo ${APROOT} ${APNAME}\(rw,no_root_squash,subtree_check\) >> /etc/exports
exportfs -a
${APIP}はAP用のIPアドレス、${APNAME}はAPのホスト名です。適当に設定しましょう。(もちろんBSPから届くネットワークリーチャブルでなければ意味はないでしょうが)→APNAME=AP0とすること!11項のapbootでAPをAP0として起動しているため、これと合わせておく必要があります!
ちょっと思ったのが、いちいちechoコマンドで設定ファイルを修正していますが、直接viでやった方がいいと思います。一瞬、何をしているのか考え込んでしまいました。
7.ルータの設定
APから外部ネットワークに接続するためにはBSP経由行う必要があります。BSPにルータの設定をしてやらないといけません。/etc/network/interfacesに以下の設定をしてやります。
iface ap0 inet static
address ${BSPIP}
netmask 255.255.255.255
pointopoint ${APIP}
up iptables -t nat -A POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE
down iptables -t nat -D POSTROUTING -s ${APIP} -o ${ETH} -j MASQUERADE
BSPにデバイスap0を定義し、これがAPと通信できるようルートを設定しています。${ETH}はBSP側のEthernetデバイスで、通常はeth0でしょう。あと、/etc/sysctl.confで以下の行のコメントを外してやります。
net.ipv4.ip_forward
8.APカーネルのインストール
ここまで長々とBSP周りの設定をしてきました。ここからやっとAPまわりの設定に入ります。4項でDLしておいたAPカーネルを、5項で準備しておいたAPカーネル用システムにインストールしてやります。
sudo dpkg -i --root=${APROOT} \
ap-linux-image-2.6.32-art-generic_20130227_i386.deb \
ap-linux-headers-2.6.32-art-generic_20130227_i386.deb
9.AP用システムの整備
まだまだ続きます。
(1)AP用システムへ移動(rootで入ることに注意)
# chroot ${APROOT}
(注:${APROOT}が/となり、このシステムのhostsファイル等の設定を行います)
(2)AP用システムのrootのpasswdを設定してやる。
(3)AP用システムの/etc/hostsにて、${hostname}-${APNAME}でホスト名を設定してやる。
(4)/etc/default/console-setup 中のACTIVE_CONSOLESをコメントアウトする。
(5)仮想シリアル端末からのログインを可能にする。
# cd /etc/init
# sed s/tty1/ttyBSP0/ tty1.conf > ttyBSP0.conf
# rm tty?.conf
# cd ..
# sed -i s/ttyS0/ttyBSP0/ securetty
(6)ureadaheadを停止する。
# cd /etc/init
# mv ureadahead.conf ureadahead.conf.bak
# mv ureadahead-other.conf ureadahead-other.conf.bak
(注:ureadaheadはlinux起動を早めるための先読みモジュールです。リアルタイム動作しようとしているので、こういうタイミングに影響が出そうなのは止めといた方が無難でしょう。起動してしまえば関係ないとは思うんですが、なくてもリアルタイム動作には影響しないし、悪さしかしないでしょうから。)
10.AP用のメモリの設定
さて、またBSP側の設定に戻ります。BSPのブート時にカーネルに起動オプションを設定して、AP用のメモリを確保してやらないといけません。
apmem:APに割り当てる低位メモリの領域(複数のAPがある場合はカンマで区切って)
aphighmem:APに割り当てる高位メモリの領域
ampshm:共有メモリに割り当てる低位メモリの領域(APが複数あろうと領域は一つだけです)
maxcpus:BSPカーネルが占有するコア数
どのくらいが適当なのかわからないので、とりあえず以下の設定で動かしてみました。
apmem=300M aphighmem=400M ampshm=100M
ここで「低位メモリ」って何?という意味がわからないと、どれくらいの領域を割り当てたらいいのか見当もつきません。「低位メモリ」とは、Linuxでは物理アドレスの0x00000000を仮想メモリの0xc0000000に割り当てることがほとんどです。つまり仮想アドレスの0xc0000000~0xffffffffの1GBは、物理メモリの最初の場所に配置されることになり、ここを「低位メモリ」と呼びます。
それでここが重要なんですが、Linuxでは複数のプロセスが独自の仮想メモリをもらい動作しますが、この「低位メモリ」は各プロセス共通に割り当てられます。つまり各プロセスがOSのサービスとデータをやりとりしようとしたり、OSのプロセスなんかはこの「低位メモリ」内で動くことになります。
つまり、BSPカーネルとAPカーネルは独自にこの「低位メモリ」領域がないと動けないため、それぞれに動作に必要なだけのメモリを割り当てておかないといけません。とはいっても、どれくらいあれば必要なだけあるかなんて、当該カーネルが動くときにロードするモジュールにもよるので一概に言えません。(特にリアルタイム制御したい、なんて目的なんで外部との専用通信モジュールが必要になることもあるでしょうし)なので適当にとしか言えないのが、つらいところです。
なおうまくメモリ領域が設定できたかは、BSP起動後に/proc/iomemを見てやれば確認できます。
11.APのブート
ここまできてやっとAPの起動ができます。以下のコマンドでインストールしたAP用カーネルが起動し、9(5)で設定した仮想シリアル端末からログインメッセージがでます。
# ifup ap0
# apboot ${APROOT}/boot/vmlinuz-2.6.32-art-generic rw \
ip=${APIP}:${BSPIP}:${BSPIP}:::bsp:p2p \
nfsroot=${BSPIP}:${APROOT},nolock
APが複数ある場合は、apbootのオプションで番号を指定できます。デフォルトは0から始まる番号です。
と、ここまでAPのブートまではできるようになりましたが(できたと思います・・・)、仮想シリアル端末が接続できない状態です。そのうち動くようになったら、また書きます。
追記:
11項でapbootする前に、以下のコマンドでシリアル端末を開いておきます。
sudo screen /dev/ttyAP0
そうするとapbootでAPが起動するときのログが表示されてきます。そこでわかりましたが、起動に失敗してました!ログを見てると、どうもNFSマウントのところで失敗しているようなんですが、なんかap0とap1が混在してる?そういやapbootでAP0として起動してるのに、NFSの設定やらhostsファイルやらAP1で定義してちゃあかんでしょ!
ということでそこを修正、だいぶ起動シーケンスが進むようになりましたが、今度はAP0からBSPへのネットワークが届かないとのこと。どこかルータの設定に問題があるようです。先は長いです。(しかしAPの起動って、数十秒単位で結構時間かかるのね・・・)
結果:
やっと動きました。ルータの設定で最初APIPとBSPIPを同じネットワークアドレスにしたのがまずかったのかと思ったんですが、それでも状況は変わりません。(でもこれはまずいと思います)
APの起動ログをよく見ると、どうもNFSのマウントでBSP側からの応答がないということらしいということで、BSPのNFSサーバ周りの設定を見直しました。デフォルトだとUbuntuのデスクトップ版ではサーバ関係のパッケージ何も入っていないので、後からnfs-kernel-server, nfs-commonを追加インストールしましたが、どこか問題があったようです。手動でnfsdを動かしてやろうと、
sudo /etc/init.d/nfs-kernel-server restart
とやると処理が固まってしまい、戻ってきません。いやこれは明らかにおかしいだろうとネットをググってみると、どうもportmapが動いていないとこうなるようです。psコマンドで見ると、確かに動いてません。設定のどこに問題があるのかわかりませんが、ブート時にportmapが起動してくれなくて、そのためnfsdも動いてなかったようです。そこでとりあえず手動でこのあたりを起動して、再度apbootしたら、あっさり動いてくれました。先に起動に時間がかかるといってたのは、NFSのマウントでtime-outを待っていたせいでした。
ART-Linuxの実験 インストール(その1)
ART-Linuxとは産総研で研究されている、Linuxのリアルタイム版です。(昔、RT-Linuxというのがあったけど、公開の仕方に問題がありかなり揉めたよね~ 知ってる人はかなり年季の入った人だと思うけどw)
そんで以前から考えてたんですが、ここ数年マルチコアなCPUが増えました。基本Linuxは複数のCPUがあってもそれらは平等に扱いますが、「リアルタイム制御用のコアを設定できたら便利じゃないか?」と思ってたら、ART-Linuxがそれをつい最近(2013年3月)に発表してくれました。これはぜひとも試してみようと思い、記録をメモしておきます。
1.ART-LinuxのインストールするLinuxの準備
ART-LinuxはUbuntu-10.04(Lucid)のKernelを改造したもののようです。まずLucidをDLしてきて、それをマルチコアなマシンにインストールします。(手元で実験に使えそうなのがCore2Duoのマシンしかなかったので、これで。)32bit版をインストールしてください。
2.ART-Linuxのインストール(BSP)
1項でインストールしたUbuntuのkernelを産総研のART-LinuxのHPからDLしてきます。
linux-image-2.6.32-art-generic_20130227_i386.deb
linux-headers-2.6.32-art-generic_20130227_i386.deb
linux-source-2.6.32-art_20130227_all.deb
PAE(メモリ拡張用)とかありますが、今回はベーシックなものを。(ちなみにART-Linuxには32bitしかありません。とりあえずリアルタイムで動かす制御用アプリで64bitが必要な類のものは思いつかないのでいいと思いますが。)
これらをインストールします。
sudo dpkg -i linux-image-2.6.32-art_20130227_i386.deb linux-headers-2.6.32-art_20130227_i386.deb linux-source-2.6.32-art_20130227_all.deb
これでART-Linux(BSP用)のkernelがインストールされ、それ起動用にgrubの設定も追加してくれます。(つまり、元々のUbuntuも起動できます)
注:BSPというのはLinuxの通常業務を行うプロセスのことで、最低1コアは割り当てる必要があります。インストール直後はBSPに何コア割り当てるとかのkernel起動パラメータを設定してありませんので、この場合は2コアで動いてしまいますが、後々AP(リアルタイム用コア)を動かすまではそれで構いません。
3.サンプルプログラムの実行
さてインストールが成功したか確認してみます。BSPでもとりあえずこれまでのART-Linuxの機能はあるようです。(基本は厳密なタイマ管理ができるか、ということになると思いますが。BSPがアプリで占有できないので、ちょうどアプリが動きたいときにシステム作業が発生してしまうと止めようがないでしょうが、システムコールに影響されない厳密なタイマがあるだけでリアルタイムのアプリを書くのは楽になります)
#include <stdio.h>
#include <linux/art_task.h>
#include <time.h>
#include <sys/time.h>
double gettimeofday_sec()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec + (double)tv.tv_usec*1e-6);
}
void process(void)
{
register int i;
double start_t1;
double now_t1;
start_t1 = gettimeofday_sec();
art_enter( ART_PRIO_MAX, ART_TASK_PERIODIC, 1000000 );
/* Real Time Task Start */
for (i=0; i<100; i++) {
art_wait();
now_t1 = gettimeofday_sec();
printf("[%d] %10.30f\n", i, (now_t1 - start_t1));
}
putchar('\n');
art_exit();
/* Real Time Task exit */
}
int main(void)
{
process();
return 0;
}
以下のようにビルドします。
$ gcc -Wall -O sample1.c /usr/lib/art_syscalls.o
オリジナルのサンプルに少し追加しました。art_wait()で1秒間を正確にwaitしてますが、そこからほんの少しですがコードが動きます。その処理時間が累積するのかどうか、それを見るために実時間を表示しました。
大体、100回loopすると以下のような感じになります。
[99] 99.9835
あれ?なんか少しだけ早く回ってる?ちょっと予想とずれてしまいましたが、art_wait()の精度の問題なのか、gettimeofday()の問題なのか、長時間(1時間くらい)のサンプルを書いてみるか、外部に信号を出して計測してみないとわかりません。
追記:
その後、さらに設定をいろいろと変えて実験してみました。結論から言うと、
①上記の結果はインストール途中の結果であり、BSPは2コアの設定になっていた。またAP用のメモリ設定(今後、書きます)もしていなかった。ただし、gnomeのdesktopは動いていた。
②BSP=1にして実験すると、[99] 100.052等安定して処理が遅れるようになっていった。現在のLinuxのタスクスイッチが1ms、しかもデフォルトのART-Linuxの割り込み最短時間が1msなのを合わせて考えると、それが一番なっとくのいく結果と思われる。
③さらにART-Linuxの割り込み最短時間=500usにしてみたが、さらに安定して毎回1ms程度遅れるようになった。(予測しやすくなった)
サンプルが1秒ごとに1行出力するよ、という意味ではないような気がします。もっともこちらもART-Linuxのタイマ管理をよく勉強せずにサンプルを使ってしまいましたが、正確なタイマがあってもこうなるでしょう。本当に1秒周期で1行出力したいなら、タイマで0.99秒ほどまち、それからは1秒たったかloopでチェックするようにしないとだめでしょう。逆に最初の結果(早く動いてしまう)ほうが、リアルタイムのプログラムを作るうえでは、動作予測がしづらく使いづらいです。デフォルトのままだと、gnomeの割り込み処理や、Core2DuoやNvidia(グラフィックボードがこれ使ってます)のドライバ周りの割り込み等、リアルタイムを乱す要因がたくさんあり、変な結果になったと思います。(ゲーム程度の60Hz程度の周期でリアルタイム性が確保できればいいというならこれでもいいですが、本気で1ms周期の制御したいならCLIベースで動作させないといけないでしょう。)
そんで以前から考えてたんですが、ここ数年マルチコアなCPUが増えました。基本Linuxは複数のCPUがあってもそれらは平等に扱いますが、「リアルタイム制御用のコアを設定できたら便利じゃないか?」と思ってたら、ART-Linuxがそれをつい最近(2013年3月)に発表してくれました。これはぜひとも試してみようと思い、記録をメモしておきます。
1.ART-LinuxのインストールするLinuxの準備
ART-LinuxはUbuntu-10.04(Lucid)のKernelを改造したもののようです。まずLucidをDLしてきて、それをマルチコアなマシンにインストールします。(手元で実験に使えそうなのがCore2Duoのマシンしかなかったので、これで。)32bit版をインストールしてください。
2.ART-Linuxのインストール(BSP)
1項でインストールしたUbuntuのkernelを産総研のART-LinuxのHPからDLしてきます。
linux-image-2.6.32-art-generic_20130227_i386.deb
linux-headers-2.6.32-art-generic_20130227_i386.deb
linux-source-2.6.32-art_20130227_all.deb
PAE(メモリ拡張用)とかありますが、今回はベーシックなものを。(ちなみにART-Linuxには32bitしかありません。とりあえずリアルタイムで動かす制御用アプリで64bitが必要な類のものは思いつかないのでいいと思いますが。)
これらをインストールします。
sudo dpkg -i linux-image-2.6.32-art_20130227_i386.deb linux-headers-2.6.32-art_20130227_i386.deb linux-source-2.6.32-art_20130227_all.deb
これでART-Linux(BSP用)のkernelがインストールされ、それ起動用にgrubの設定も追加してくれます。(つまり、元々のUbuntuも起動できます)
注:BSPというのはLinuxの通常業務を行うプロセスのことで、最低1コアは割り当てる必要があります。インストール直後はBSPに何コア割り当てるとかのkernel起動パラメータを設定してありませんので、この場合は2コアで動いてしまいますが、後々AP(リアルタイム用コア)を動かすまではそれで構いません。
3.サンプルプログラムの実行
さてインストールが成功したか確認してみます。BSPでもとりあえずこれまでのART-Linuxの機能はあるようです。(基本は厳密なタイマ管理ができるか、ということになると思いますが。BSPがアプリで占有できないので、ちょうどアプリが動きたいときにシステム作業が発生してしまうと止めようがないでしょうが、システムコールに影響されない厳密なタイマがあるだけでリアルタイムのアプリを書くのは楽になります)
#include <stdio.h>
#include <linux/art_task.h>
#include <time.h>
#include <sys/time.h>
double gettimeofday_sec()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec + (double)tv.tv_usec*1e-6);
}
void process(void)
{
register int i;
double start_t1;
double now_t1;
start_t1 = gettimeofday_sec();
art_enter( ART_PRIO_MAX, ART_TASK_PERIODIC, 1000000 );
/* Real Time Task Start */
for (i=0; i<100; i++) {
art_wait();
now_t1 = gettimeofday_sec();
printf("[%d] %10.30f\n", i, (now_t1 - start_t1));
}
putchar('\n');
art_exit();
/* Real Time Task exit */
}
int main(void)
{
process();
return 0;
}
以下のようにビルドします。
$ gcc -Wall -O sample1.c /usr/lib/art_syscalls.o
大体、100回loopすると以下のような感じになります。
[99] 99.9835
あれ?なんか少しだけ早く回ってる?ちょっと予想とずれてしまいましたが、art_wait()の精度の問題なのか、gettimeofday()の問題なのか、長時間(1時間くらい)のサンプルを書いてみるか、外部に信号を出して計測してみないとわかりません。
追記:
その後、さらに設定をいろいろと変えて実験してみました。結論から言うと、
①上記の結果はインストール途中の結果であり、BSPは2コアの設定になっていた。またAP用のメモリ設定(今後、書きます)もしていなかった。ただし、gnomeのdesktopは動いていた。
②BSP=1にして実験すると、[99] 100.052等安定して処理が遅れるようになっていった。現在のLinuxのタスクスイッチが1ms、しかもデフォルトのART-Linuxの割り込み最短時間が1msなのを合わせて考えると、それが一番なっとくのいく結果と思われる。
③さらにART-Linuxの割り込み最短時間=500usにしてみたが、さらに安定して毎回1ms程度遅れるようになった。(予測しやすくなった)
サンプルが1秒ごとに1行出力するよ、という意味ではないような気がします。もっともこちらもART-Linuxのタイマ管理をよく勉強せずにサンプルを使ってしまいましたが、正確なタイマがあってもこうなるでしょう。本当に1秒周期で1行出力したいなら、タイマで0.99秒ほどまち、それからは1秒たったかloopでチェックするようにしないとだめでしょう。逆に最初の結果(早く動いてしまう)ほうが、リアルタイムのプログラムを作るうえでは、動作予測がしづらく使いづらいです。デフォルトのままだと、gnomeの割り込み処理や、Core2DuoやNvidia(グラフィックボードがこれ使ってます)のドライバ周りの割り込み等、リアルタイムを乱す要因がたくさんあり、変な結果になったと思います。(ゲーム程度の60Hz程度の周期でリアルタイム性が確保できればいいというならこれでもいいですが、本気で1ms周期の制御したいならCLIベースで動作させないといけないでしょう。)
2013年4月30日火曜日
Android開発環境:ADTの更新にまた苦しみました(>_<)
4月くらいからEclipseで「ADTが21.1になりました」と言ってくるんですが、どうしてもEclipse本体は21.0のままで、21.1を認識してくれません。
毎度のことですが、もう諦めました。GoogleからADT-bundleの最新版DLしてきて入れなおします。(Eclipse自体は特にインストーラも必要なく、フォルダごと変えるだけなので楽です。)しかしこの不安定な更新状況、なんとかならんかね。全然、状態が変わりません。いくら簡単にまるごと入れ替えできるといっても。。。
どうも調べてみると、ADTのSDK-toolsはこういうときEclipseから起動するんじゃなくて単体でSDK-Managerを起動して更新し、その後Eclipseを起動し、SDKの更新を認識させるといいようです。
しかしGoogleもAndroidアプリの開発者増やしたいなら、もう少しtoolの使い勝手を改善してほしい!
毎度のことですが、もう諦めました。GoogleからADT-bundleの最新版DLしてきて入れなおします。(Eclipse自体は特にインストーラも必要なく、フォルダごと変えるだけなので楽です。)しかしこの不安定な更新状況、なんとかならんかね。全然、状態が変わりません。いくら簡単にまるごと入れ替えできるといっても。。。
どうも調べてみると、ADTのSDK-toolsはこういうときEclipseから起動するんじゃなくて単体でSDK-Managerを起動して更新し、その後Eclipseを起動し、SDKの更新を認識させるといいようです。
しかしGoogleもAndroidアプリの開発者増やしたいなら、もう少しtoolの使い勝手を改善してほしい!
2013年3月31日日曜日
DLNA Playerについて
自宅ではバッファローのNASを使ってますが、こいつがDLNAサーバーの機能を持っています。(Fullスペックかは怪しいが)それで、PC部屋(2階)ではそれで見てたんですが、1階居間のTVをRegzaに買い替え、それ用のDVDプレーヤー代わりにPS3買いました。こいつがDLNAプレーヤーの機能を持っており、NASを見ることができるのに気づきました。「もしや!?」と思って試してみると、1階のTVでNASの中身を見ることができるじゃありませんか!こいつはいいやと思ったんですが、どうもファイルによってコマ落ちがひどいことがあることに気づきました。最初はLANの問題(2階と1階はACライン上にEthernet信号通す変換器使ってます。そのため10Mbps台しか望めません。)かと思ったんですが、同じファイルを1階のPCで見てみると、普通に見れます。
ちなみに、問題のファイルのコーデックは"avi"で古いデータです。ほとんどのファイルは"mp4"なんですが、どうもPS3の"avi"に対するエンコーディング能力がダメダメなようです。(おそらくSPE全然使わない、CPUだけのプログラムなんだろな)ちなみに1階でNexus7にDLNAプレーヤー機能のアプリを入れてみると、普通に見れました。
PS3ってCPUは面白い(Regzaも同じCPU使ってますね)んですが、もうソニーもあんまり力入れてくれないだろうな~。まあ"avi"ではもうファイル作らないから、ほとんど問題はないんですが。
ちなみに、問題のファイルのコーデックは"avi"で古いデータです。ほとんどのファイルは"mp4"なんですが、どうもPS3の"avi"に対するエンコーディング能力がダメダメなようです。(おそらくSPE全然使わない、CPUだけのプログラムなんだろな)ちなみに1階でNexus7にDLNAプレーヤー機能のアプリを入れてみると、普通に見れました。
PS3ってCPUは面白い(Regzaも同じCPU使ってますね)んですが、もうソニーもあんまり力入れてくれないだろうな~。まあ"avi"ではもうファイル作らないから、ほとんど問題はないんですが。
2013年3月16日土曜日
Raspberry Pi Webサーバー設定(WordPress)
Raspberry Piで少し遊んでみて、さて次にどうするかと考えました。やはり計算とかするには遅いし、でも消費電力は非常に少ないのでWebサーバーにしてみるか。(普通のPCで、24時間電源入れっぱなしは、やはり怖い)
1.まずシステムを最新に
$ sudo apt-get update
$ sudo apt-get upgrade
2.次に以下を順番に
$ sudo apt-get install apache2
$ sudo apt-get install php5
$ sudo apt-get install mysql-server
(mysqlのrootパスワード設定を聞かれます)
PHP関連追加インストール
$ sudo apt-get install php5-mysql php5-curl
$ sudo apt-get install php5-gd
PHPの中間コードキャッシュモジュール 処理が速くなるらしい
$ sudo apt-get install php-apc
3.Apache起動
apache2のパッケージをインストールした時点で起動はしている。
デフォルトは、/var/www/index.htmlを表示している。
設定ファイルがhttpd.conf→apache2.confに名前が変わったらしい。
/etc/apache2/以下にある。
4.Apache設定
httpdをどのユーザーアカウントで動かすかだけは設定する。色々設定箇所が変わるようだが(たとえば今回は設定ファイル名がapache2.confだけど、たいていはhttpd.confだし)、まずアカウントを作成する。
$ sudo useradd apache
ID番号等、すべてデフォルトにおまかせなので、グループも自動的に同じ名称で作成してくれます。これをApacheの動作アカウントとします。
apache2.confでは以下の箇所でhttpd(今回のパッケージではapache2という名前で動いてた)を設定します。
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
envvarsというファイル中で設定する環境変数を使ってるとのことなので、そこで環境変数を先ほど作成したapacheに変更します。これで後はapache2を再起動してやればOK。
$ sudo /etc/init.d/apache2 restart
5.MySQL データベースの準備
WordPressが使っているデータベース、ユーザーを準備してやらないといけません。
$ mysql -u root -p
Enter password: ←ここでmysqlをインストールした時、設定したパスワードを入力
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.5.28-1 (Debian)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database wpdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on wpdb.* to 'wpadmin'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql>
データベース名:wpdb
データベースユーザー名:wpadmin
パスワード:password
ホスト名:localhost
でデータベースの準備をしました。(パスワードがちょっとという気はしますが、説明用ですから。)
6.WordPressの初期設定
wordpressをDLして、/var/www以下に解凍します。(apacheのデフォルトページ)一応、ファイルのオーナーは先ほど作成しておいたapacheにしておきます。(同じ名前にしてしまってわかりづらいな)
wordpressのTopをブラウザで開くと設定ファイル(wp-config.php)がないから作成するか?と聞かれます。
作成するを押すと、データベース設定画面になります。
さきほど準備したデータベースをここで入力します。
無事設定に問題がなければデータベースの生成にかかります。
次にブログのタイトルや管理アカウントの設定画面になります。
これでブログの設定ができました。こんな感じで表示されるようになります。
テーマとか設定してませんから、真っ白けですね。管理用にはログインしてダッシュボードから行います。
これで準備はできました。さて実際に公開するかはもう少し考えます。(セキュリティの問題とか考えとかないといけないし、別途ブログ立ち上げてどうすんだ?という重大な問題があります。目的を整理しないと。)
1.まずシステムを最新に
$ sudo apt-get update
$ sudo apt-get upgrade
2.次に以下を順番に
$ sudo apt-get install apache2
$ sudo apt-get install php5
$ sudo apt-get install mysql-server
(mysqlのrootパスワード設定を聞かれます)
PHP関連追加インストール
$ sudo apt-get install php5-mysql php5-curl
$ sudo apt-get install php5-gd
PHPの中間コードキャッシュモジュール 処理が速くなるらしい
$ sudo apt-get install php-apc
3.Apache起動
apache2のパッケージをインストールした時点で起動はしている。
デフォルトは、/var/www/index.htmlを表示している。
設定ファイルがhttpd.conf→apache2.confに名前が変わったらしい。
/etc/apache2/以下にある。
4.Apache設定
httpdをどのユーザーアカウントで動かすかだけは設定する。色々設定箇所が変わるようだが(たとえば今回は設定ファイル名がapache2.confだけど、たいていはhttpd.confだし)、まずアカウントを作成する。
$ sudo useradd apache
ID番号等、すべてデフォルトにおまかせなので、グループも自動的に同じ名称で作成してくれます。これをApacheの動作アカウントとします。
apache2.confでは以下の箇所でhttpd(今回のパッケージではapache2という名前で動いてた)を設定します。
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
envvarsというファイル中で設定する環境変数を使ってるとのことなので、そこで環境変数を先ほど作成したapacheに変更します。これで後はapache2を再起動してやればOK。
$ sudo /etc/init.d/apache2 restart
5.MySQL データベースの準備
WordPressが使っているデータベース、ユーザーを準備してやらないといけません。
$ mysql -u root -p
Enter password: ←ここでmysqlをインストールした時、設定したパスワードを入力
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.5.28-1 (Debian)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database wpdb;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on wpdb.* to 'wpadmin'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
mysql>
データベース名:wpdb
データベースユーザー名:wpadmin
パスワード:password
ホスト名:localhost
でデータベースの準備をしました。(パスワードがちょっとという気はしますが、説明用ですから。)
6.WordPressの初期設定
wordpressをDLして、/var/www以下に解凍します。(apacheのデフォルトページ)一応、ファイルのオーナーは先ほど作成しておいたapacheにしておきます。(同じ名前にしてしまってわかりづらいな)
wordpressのTopをブラウザで開くと設定ファイル(wp-config.php)がないから作成するか?と聞かれます。
作成するを押すと、データベース設定画面になります。
さきほど準備したデータベースをここで入力します。
無事設定に問題がなければデータベースの生成にかかります。
これでブログの設定ができました。こんな感じで表示されるようになります。
テーマとか設定してませんから、真っ白けですね。管理用にはログインしてダッシュボードから行います。
これで準備はできました。さて実際に公開するかはもう少し考えます。(セキュリティの問題とか考えとかないといけないし、別途ブログ立ち上げてどうすんだ?という重大な問題があります。目的を整理しないと。)
2013年3月9日土曜日
CentOS sudoの設定
CentOS6を使ってみてたら、コンソールでsudoコマンドで特権コマンド使おうとしたら怒られました。(もちろんパスワード入力は成功しています)
hogehoge is not in the sudoers file. This incident will be reported.
なんかsudoやるにも設定が必要なようです。/etcにsudoersというそれらしきファイルがありましたが、viで開いてみても一杯書いてあって意味が分かりません。
こんなときはググって調べます。すぐに見つかりました。
# visudo
いったんrootになって、専用のviコマンド使います。これで/etc/sudoersがviで開かれます。最下段に以下を追加。
%hogehoge ALL=(ALL) ALL
ちょっと乱暴ですが、hogehogeにsudoですべての特権コマンドを実行できるようにしました。編集と保存はviと同じです。これでsudoが使えるようになりました。
PS
その他やってたら、CentOS6って日本語入力がまだデフォルトでできない。(デスクトップ等、日本語が出てたので気づかなかった。)日本語入力しようとしてもどうしても動かない。しかたないのでまず、groupinstallで"Japanese Support"をインストールして、LANGをja_JP.UTF-8に変更。
あと日本語入力メソッドだけど、本来はscim-anthyを使うらしいんだが、まだCentOS6用にはできてないので、プロトタイプ版?ibus-anthyをインストール。しかもこれだけではだめで、ibus-setupして設定したり、/usr/bin/ibus-daemonが自動起動するようにと色々設定しないとだめでした。
hogehoge is not in the sudoers file. This incident will be reported.
なんかsudoやるにも設定が必要なようです。/etcにsudoersというそれらしきファイルがありましたが、viで開いてみても一杯書いてあって意味が分かりません。
こんなときはググって調べます。すぐに見つかりました。
# visudo
いったんrootになって、専用のviコマンド使います。これで/etc/sudoersがviで開かれます。最下段に以下を追加。
%hogehoge ALL=(ALL) ALL
ちょっと乱暴ですが、hogehogeにsudoですべての特権コマンドを実行できるようにしました。編集と保存はviと同じです。これでsudoが使えるようになりました。
PS
その他やってたら、CentOS6って日本語入力がまだデフォルトでできない。(デスクトップ等、日本語が出てたので気づかなかった。)日本語入力しようとしてもどうしても動かない。しかたないのでまず、groupinstallで"Japanese Support"をインストールして、LANGをja_JP.UTF-8に変更。
あと日本語入力メソッドだけど、本来はscim-anthyを使うらしいんだが、まだCentOS6用にはできてないので、プロトタイプ版?ibus-anthyをインストール。しかもこれだけではだめで、ibus-setupして設定したり、/usr/bin/ibus-daemonが自動起動するようにと色々設定しないとだめでした。
登録:
投稿 (Atom)






