2013年06月02日: gnome-panelが空になる
2013年05月24日: ODROID-U2を使ってみる (その5)
2013年05月21日: ODROID-U2を使ってみる (その4)
2013年05月18日: ODROID-U2を使ってみる (その3)
2013年05月17日: ODROID-U2を使ってみる (その2)
2013年05月16日: ODROID-U2を使ってみる (その1)
2013年05月03日: Raspberry Pi (の後日談)
2013年04月01日: Raspberry Pi (の10)
2013年03月20日: Raspberry Pi (の9)
iMX6のAndroidの電卓アプリにとんでもなく驚かされた [プログラム]
そこに電卓アプリがあったので起動してみると、…
まず驚いたのが、
sin(正弦)、 cos(余弦)、 tan(正接)、 ^(べき乗)、 !(階乗)、 √(平方根)、のボタンがあったのです。これ、理数系用の計算機?
定数として e(自然対数の底) と π(円周率)
で、いくつか試してみました。
sin(π)、 √2、 10!などを。
で、次に驚いたのが、度数法でなく、弧度法(ラジアン)でした。これ、理数系用の計算機!
ただ、桁数は多くなく、むしろ、少ない感じでした。こりゃfloat演算かなと思いましたが、まぁ、電卓としては普通です。
そして、私が一番驚いたのが、
e^(π×√-1)の答えが「ちゃんと」出ることでした。おぉ、オイラーの公式、This is our jewelを知ってるのか、こいつはっ!!!
これには、本当に驚かされました。これ、理数系用の計算機!!!を越えてるのでは?
え?、ということは、この電卓、複素数計算ができるのでしょうか? 試してみましょう。
e^(π÷3×√-1)… エラーでした。手元にあるソーラー電卓なら複素数計算ができるんですが、さすがにそこまではできないか…。
冷静になって考えると、ひょっとすると、この電卓の作者としては、イースター・エッグとして仕込んで置いたものなのかもしれませんね。
でも、センスあるなぁ。さすがFreescale。Coolです。
gnome-panelが空になる [プログラム]
debianのsidで、GNOME 3のfallbackモード(GNOME Classic)を使っています。
gnome-panelが更新されたのだと思います。
起動したら、画面上部にあるパネル(GNOMEメニューとランチャーなど)が空になっています。
ターミナルを含めすべてをそこから起動しているため、Ctrl-Alt-BackSpaceでXを強制終了させて、なにはともあれ .config/, .gconf/, .gconfd/ をバックアップしました。.config/gnome-panel/launchers/*.desktopは、以前のまま、ちゃんと残っています。あれ?
(あとで知ったのですが、ファイルマネージャが動いているなら、ファイルマネージャから/usr/bin/xtermなどを起動すればターミナルが動きます)
で、rootでログインしなおしてみると、パネルは正常です。おや? まぁ、最悪、rootの.config, .gconfなどをコピーして設定しなおせば復旧できそうです、面倒ですが。
まず、gnome-panelをreinstallします。それから、パッケージがないとエラーが出ていた gnome-menu-extended を削除します。
.xsession-errors をみると、
(gnome-panel:4653): Gtk-WARNING **: FIXME: assigning images is not implemented
のようなエラーがでていましたので、アイコンがなくなっているのかもしれないと、アイコンをreinstallしました。
で、再起動してログインしましたが、まだパネルが空です。うーむ。
パネルのところで、Alt-右クリックして、「新しいパネル」を追加(画面右側に追加)して、そこで、Alt-右クリックして「パネルへ追加…」して、ターミナル(端末内で起動する、名前:bash、コマンド:bash)を追加してみます。アイコンが出ません。でも、.config/gnome-panel/launchers/bash.desktopは追加されています。あれ?
試行錯誤の挙句、Alt-右クリックして「プロパティ」の「全般」の「隠すボタンを表示する」にチェックを入れて、さらに「隠すボタンに矢印をつける」にチェックを入れて、「背景」タブで「なし」と「単色」を切り替えて戻すと、表示されました。あれ?
パネルの中身が表示されたので、「隠すボタンを表示する」のチェックをオフにして、再起動してみると… パネルがまた空です。あれ?
「隠すボタンを表示する」のチェックを入れたまま再起動します。今度はちゃんとパネルが表示されます。うーむ。
私のパネルは、ランチャーなどが大量に登録されており、uimが起動してパネルに設定などが並ぶと、画面の幅よりも長くなることがあります。
推測ですが、
- 新しい gnome-panel では、画面幅を越えている場合、「隠すボタンを表示する」や「隠すボタンに矢印をつける」がオフのとき、エラーが起こって表示しないようになっているのではないか?
- 最初に表示するパネルでエラーが起こると、以降のパネルも一切表示しないようになっているのではないか?
という感じです。ユーザとしては、少なくとも、表示できる分は表示してくれないと困りますし、関係のない別のパネルは正常に表示されるべきです。このあたり、ユーザが求めているもの「〜であって当然、〜であるべき」が、開発者には分かっていないのでしょう。開発者自身がgnome-panelを使ってないからかもしれません。開発者=ユーザであれば、ユーザが求めているもの、やろうとすることもわかるはずです。GNOMEのユーザインターフェースが、過去の某GUIで到達し得たレベルにさえ全然到っていないと思うのはそのあたりです。自分で作れ、という批判は甘んじて受けますが、それをGNOME上で作るべきなのか、KDE上で作るべきなのか、xfce上で作るべきなのか、etc.,と考えると、現状での安定性と将来まで見越さなければならないので、二の足を踏んでしまうのです。
なお、新しい gnome-panel では、ツールチップが2重枠で表示されるようになり、その表示位置がアイコンの下に正しく表示されるようになりました。以前の gnome-panel では、ツールチップの表示位置が大きくずれることがたびたびありましたが、それが修正されていました。
ODROID-U2を使ってみる (その5) [プログラム]
ubuntuを捨ててDebianをODROID-U2にインストールします。
(e) Debianのインストール
今回、絶賛推奨のページは
http://odroid.us/
です。多くの情報が得られます。そして、debianのイメージファイルがあります。
イメージファイルをダウンロードして、SDカードに書き込みます。
xz -d <odroidu2_20130205-debian-wheezy-devel.img.xz | dd of=/dev/sdb bs=2048c
が、8GBのSDカードだったのに、「容量が足りない」と言われました。fsck -f /dev/sda2 (SDカードは私のところでは/dev/sdaになっています)で調べてみると、問題ありません。なので、SDカードは8GBで十分です。というか、パーティションサイズをみると約5GBです。どうやら、元のイメージファイルの作成時にサイズの指定をしなかったため5GB以上の部分のゴミが含まれてしまっているようです。ですので、このエラーは気にする必要はありません。
SDカードを挿してODROID-U2を起動します。すんなりとDebianが動き出しました。
あとは、いつもの設定を行ないます。network, sshd, aptのupgradeなどです。
もし、シリアルコンソールを使わずに行なうのであれば、SDカードをPCでマウントして、第2パーティション(rootfs)のetc/ssh/sshd_configを修正して、ネットワークからsshでログインできるようにします。なお、必要なら、etc/network/interfacesも修正します。
(f) unionfs-fuseの設定
Debianの方でも確認しましたが、fsprotectは使えませんでした。aufsモジュールがありません。
代わりに、Raspberry Piと同じくunionfs-fuseの方を使うことにします。
Raspberry Piと同じスクリプトを同じようにインストールしました。
そして、ODROID-U2を再起動したら… なんとそのまま使えました。
そしてunionfs-fuseもすんなりと動きました。
これがdebianのすごいところです。Raspberry PiでもODROID-U2でも同じに使える(バイナリは除く)ところがよいのです。こっちで作ったスクリプトや設定ファイルがそのまま他のCPUで使えるわけですから。手間いらず。私が欲しかったのはこんなディストリビューションだっ!!! なお、スクリプトや設定ファイルは、たとえばsshやopenvpnなどの設定ファイルは、x86でもARMでも全く同じように使えます(使えました)。だから、まずx86で組み上げて、ARMへ移すということもできるのです。作る方としては楽ですよね。
さて、あとはどうするか。
(g) sshfsの設定
まず、リモートファイルシステムとして何を使うかです。NFSクライアントとなるとiptablesが面倒ですし、pNFS(NFS 4.1)はまだ資料が不十分みたいですし、…。sshfsってのがあります。これはどうでしょう?
# apt-get install sshfs
で、/etc/groupで、自分をfuserグループに追加して、shellを再起動します。あれ、リブートしなけりゃならなかったっけか?
まぁ、とにかく
$ sshfs user@remotehost:remotedirectory mountpoint
でマウントできちゃいます!!! すごい。あれ、umountはどうやるのでしょう? rootでumountか、
$ fusermount -u mountpoint
だそうです。ちょっとaliasしておきましょう。
$ alias fuserumount='fusermount -u'
ということで、ネットワークファイルシステムとしてsshfsを使えばsshだけでOKみたいです。当面は、2台8コアで実証システムを作って、あとはODROID-U2を買い増すだけ(笑)。夢は25台100コア。しかも250W+sshサーバーマシン分。これは省エネでしょう。100倍速い…。うわぁい。
で、現実的なところを考えると、台数が増えるとネットワークがネックになってきます。これはサーバに複数枚ネットワークカードを挿して、適当に分散させるしかないでしょうね。ハブも必要です。それに、i7-3770比だと4CPU分=16コア程度の速度なので、消費電力以外ではローコストとは言えないでしょうが。
ともあれ、2台のODROID-U2を設定し、動作開始しました。ODROID-U2の2台の計8コアは、24時間100%で動作しています。今のところ問題なしです。停止・再開も問題ありません。
ODROID-U2の2台の計8コアは、24時間100%で動作しています。
これで、(一応の)目標に達しました。
本来なら、資金に余裕があれば、Google Compute Engineを使って実行するのがよいのでしょう。時間に余裕があるなら、本格的にBOINCシステムを使ってサーバ/クライアントを作成すべきなのでしょう。まぁ、それはいずれ。
ODROID-U2を使ってみる (その4) [プログラム]
aufsモジュールがありませんので、代わりにunionfs-fuseを使います。インストールしましょう。
・upstartとの格闘に負ける
というわけで、unionfs-fuseになります。Raspberry Piで一度やってるからいいけどさ… 面倒なんですよ。ubuntuはinit.dが変わっちゃてるから、スクリプトを書き起こさないといけないし、起動順もわけわかりませんし。あ、そういえば、upstartはinit.dも読むって書いてありましたっけ。どれどれ…
http://askubuntu.com/questions/14810/from-init-d-to-upstart-is-there-a-bridge
このページだと、起動順が制御できない(upstartの後ろの方になる)とあります。簡単なのは、先頭にあるような書き方らしいです。
他にも
http://d.hatena.ne.jp/takuya_1st/20110719/1311042559
などを参考にして、書き換えようとしましたが、下記ページにしたがいました。
http://upstart.ubuntu.com/cookbook/
で、unionfs-fuse-omit-pid.confを書きました。
これは/etc/initに追加しておいても害はないから、先に追加しておきます。というか、本当はスクリプトの中身をscriptに書いちゃえばいいんだよなー。でも、shellの違いとかあったら面倒ですから、やめておきます。
えーと、initの再構成はどうするんでしたっけ?
とりあえず、
# initctl check-config
unionfs-fuse-omit-pid
start on: unknown event unionfs-fuse-live-cd
あ、unionfs-fuse-live-cd.confを追加しとかないといけません。あ、start onのイベントは、emitsで発行(マーク)できるんですね。
で、unionfs-fuse-omit-pid.confを修正しました。
でも、起動時にハングアップしました。テキストコンソールがHDMIに出てないのか、何も表示されないので、何が悪いのかさっぱりわからない(あとでわかったのは、テキストコンソールがどうやら使えないということです。Raspberry Piはテキストコンソールが使えたのですが…)。
とりあえず、
mounted MOUNTPOINT=/dev
は、resolveconf.confで「使われているにもかかわらずハングアップする」ということがわかりました。なんじゃこりゃ。しかたないので、
start on runlevel [2345] and filesystem
で代用してみます。
で、unionfs-fuse-omit-pid.confを再度修正しました。
でもハングアップしました。pingの応答はあるので、やはりこれで止まってしまったのでしょうね。
テキストコンソールがないと何もわかりません。
下記ページを見て
https://lists.ubuntu.com/archives/ubuntu-jp/2011-January/003278.html
framebuffer consoleを使おうとして、ODROID-U2に合わせてやってみましたが、結局、fbconsoleは使えませんでした。
もうこうなると、あきらめてシリアルコンソールを使うしかありません。でも、ODROID-U2用のUSB-シリアル変換器はオーダーしませんでした。だって、Raspberry Piのように、テキストコンソールが当たり前に使えると思っていたものですから。
・シリアル変換器をつなぐ
(d) 秋月のUSBシリアル変換器の接続
手持ちに秋月のUSB-シリアル(CMOS)変換器がありましたので、それを使用します。こいつは、シリアル側のインターフェース電圧が自由なので、そのまま使えるのです。が、そのまえに、ODROID-U2のシリアルポートが、どーなってるのか調べなければなりません。
HardKernel社のFAQあたりでは、回路図を2013年1月に公開するとあったのですけど、Downloadの一覧には見当たりませんでした…
日本語の「回路図」でググっても出てこない(くるわけがない)ので「ODROID U2 schematics」でググります。あ、PDFがありました。が、何が起こっているのか、firefoxだとsafe-modeでないとダウンロードできませんでした。
で、回路図のUARTの部分を見ると…。コネクタに線が引いてあるだけのページでした。いや、まぁそれで十分なんですが。で、注意しなければならないのが、CPUのTxDとRxDが、コネクタのRxDとTxDになってるってことです。だから、気をつけてください。
CPUからみれば、
1pin Vcc出力; 1.8V
2pin TxD(送信データ)出力
3pin RxD(受信データ)入力
4pin グランド
です。で、秋月のUSB-シリアル(CMOS)変換器は、まず、「J1をオープン」にしなければなりません(でないとCPUを壊します)。「J1をオープン」にすることにより、シリアルの電圧がVIOで規定されるようになります。で、使うのは秋月のUSB-シリアル(CMOS)変換器のRXD,VIO,TXD,GNDの4つのピンです。DIPピッチの四角いハウジングに入ったコネクタが使えるかと思ったら、ハウジングが当たって入りません。なので、ハウジングを外してから半田づけし、コネクタ部分(メス)は熱収縮チューブでコネクタからはみ出た端子部分を被いました。
ODROID-U2との接続は次のとおりです。
1pin <-> VIO
2pin <-> RXD
3pin <-> TXD
4pin <-> GND
と接続すればOKです。あとは、適当なターミナルソフト(cuとかminicomとか)で115kbpsで見ればコンソールが使えます。やっとこれでu-bootなど、自由に操作できます。
u-bootの起動スクリプトをprintenvで見てみると、なるほど、SDカードから読むために工夫をしてますね。ま、それはそれとして…
実は、シリアルコンソールの出力をチェックしたのですが、結局、unionfs-fuseはできずじまいでした。私にとってupstartは難しすぎます(私が無能なだけでしょう)。どのタイミングで起動されて、いつまで生きていて、forkするのかしないのか、がさっぱりわかりません。結局、CPUは動いているのに、ハングアップしてしまうという状態以上に進めませんでした。
自分の無能を棚にあげますが、upstartにしろ、grub2にしろ、作る側は改良して良くしているつもりなのでしょうが、使う側にしてみれば設定ファイルが複雑でさらに動きが見えなくなってしまってQuickHackができなくなってしまっています。それは、「改悪」です。もっと単純明快に、シンプルに、直感的にわかるようにしなければ、改良ではありません。今では、メンテナンスが一番コスト高なのですから、簡単に調整できるようにしておかないと、時間と金の無駄です。
というわけで、私にとって使えねーupstartは破棄、というか、ubuntu自体を破棄することにしました。ググると、ODROID-U2のdebianのイメージを作っている人が見つかりまして、それを使うことにしました。
ODROID-U2を使ってみる (その3) [プログラム]
(x) ubuntuを起動 (←すでに起動した)
(a) upstartでの起動設定を一時的に止める
(b) カーネルの起動パラメータを修正する
(c) initramfsを変更する
(d) 秋月のUSBシリアル変換器の接続
(e) Debianのインストール
(f) unionfs-fuseの設定
(g) sshfsの設定
以下、私の作業を書いたものです。実際には、私がやったことの中では(e)以降が必要な作業ですので、以下の(a)〜(d)は飛ばしていただいて構いません。それは私がubuntuをカスタマイズしようとして費やした無駄な作業です。
・サーバなのでubuntuのデスクトップなんかいらないんだけど…
(a) upstartでの起動設定を一時的に止める
cd /etc/init/
echo 'manual' >>xxxxx.override
stop lightdm #など
Debianでは/etc/init.d/の下を止めていきます。/etc/defaults/にenable/disableの設定があるものはそれを使います。そうでない場合は、少々乱暴ですが、/etc/init.d/のスクリプトを「横によける」、つまり、….savなどにリネームしておくとよいのですが、ubuntuではどうなっているのでしょうか?
そもそも何を止めていけばいいのでしょうか?
Debianでgdmにあたるものを止めてみます。これはlightdbらしいです。が、ubuntuの/etc/init.d/ではないようです。ググってみると、upstartなるものが使われており、スクリプトを一時的に止めるのは、次のようにやるらしいです。
今動いているのを止めるには、Debianでは、例えば /etc/init.d/gdm stop のようになりますが、ubuntuのupstartでは、
stop lightdm
です。
これで再起動してみます。テキストのコンソールがでてくるとよいのですが…
コンソールがGUIである必要はないので、テキストのコンソールにしたいのです。
でも、テキストのコンソールになりません。だめじゃん。
とにかくGUIのコンソールは使いませんので、起動後にstop lightdmで止めることにしましょう。
さて、他に/etc/init.d/で起動されるいくつかを削除しようとしたのですが… いったいどこへいったの? そもそも/etc/inittabがないってどういうこと?
ググって調べますと
- /etc/inittabや/etc/init.d/は使わない。upstartという機構に変わった。
- /etc/init/にxxxxx.confで、文法(man 5 init)にしたがって記述する。
echo 'manual' >>xxxxx.override
すれば、手動扱いになって、起動されなくなるよ、とありました。man 5 initの頭に、太字で書いておくべきでしょう。
他に、tty3,4,5,6とbluetoothとwhoopsieを手動にします。特に、whoopsieってクラッシュレポートを勝手に送るもので、デフォルトでenableって、それはまずいでしょ、ubuntuさん。Debianはinstall時にインストールレポートを送るか?って尋ねられて、しかも、デフォルトはdisable側にあるんですよ。
・基本的にディスクレスにしないと
(b) カーネルの起動パラメータを修正する
テキストで記述
→ mkimageでu-bootが読めるバイナリに変換
→ 所定の名前でbootパーティション(bootメディア上)へ置く
rootfsなどはSDカードで、あとはfsprotectかaufsを使って、SDカードには書かないようにします。アプリケーションの出力はNFSなどのネットワークドライブにします。必要ならopenvpnも入れます。
実際には、
- fsprotectはARMでは使えません。aufsのモジュールがないからです。
- 代わりにRaspberry Piと同じように、unionfs-fuseを使います。
- openvpn+NFSなどではなく、sshfsが簡単です。ただし、パフォーマンスがよくないようなので、本格運用には向きません。
で、afusがないのを知らなかったので、ここでも無駄な作業をしました。
まず、fsprotectを使おうとしてカーネルの起動パラメータを変更しようとしました。ググって調べたところ、以下のとおりでした。
bootパラメータは、
- boot*.txtにある記述に追加して、
- それを、ubootが読める形に直して、
- それを/bootパーティションのboot.iniとしてコピーする (boot.iniでなくboot.scrかな)
これは、次のページ
http://docs.kali.org/development/custom-odroid-kernel-image
のココ
mkimage -A arm -T script -C none -n "Boot.scr for odroid-x" -d ~/arm-stuff/images/boot/boot.txt ~/arm-stuff/images/boot/boot.scrの部分です。
また、別のページ
http://com.odroid.com/sigong/prev_forum/t2010-issues-with-first-ubuntu-release-for-x2-workarounds-and-problem-list.html
にも同じこと(↓)が書いてあります。
(3) user modded console args not passed to /proc/cmdlineこれにしたがってカーネルの起動パラメータにfsprotectを追加しました。
edited boot.txt to add 'nohz=off', ran the following:
# mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Boot.scr for odroid-x" -d boot.txt boot.scr
# cp boot.scr boot.ini
reboot and the following are my args at boot:
# cat /proc/cmdline
console=ttySAC1,115200n8 androidboot.console=ttySAC1 mem=2047M console=tty1
console=ttySAC1,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=2047M
再起動して、/proc/cmdlineで、fsportectが追加されていることを確認しました。
fsprotectを使うためには、カーネルの起動パラメータの追加だけでなく、initfamfsも変更する必要があります。x86のDebianでは、fsprotectモジュールをインストールすると自動的にやってくれますが、ODROID-U2では手動でやります。
(c) initramfsを変更するが、なぜか、fsprotectのスクリプトが入ったinitramfsが作れませんでした。調べてみると…
mkinitramfsで作成
→ mkimageでu-bootが読めるバイナリに変換
→ 所定の名前でbootパーティションへ置く
upgradeしたせいか、3.0.63でなく3.7.0のinitramfsを作りやがります。でも、起動は3.0.63なのです。おまえは何を見てinitramfsを作ってるんじゃい。
で、ググって調べますと、/bootにinitramfsを作っても、それじゃダメで、例によって、ubootに読める形にして、所定の場所に置かなければなりません。面倒なことです。
これは、次のページ
http://odroid.us/mediawiki/index.php?title=Step-by-step_Native_Compiling_a_Kernel
のココから流用しました。下で、kernelversionが3.0.63になればよいのです。
kernelversion=`cat ./include/config/kernel.release`では、順に追っていきましょう。
mkinitramfs -c gzip -o ./initramfs-$kernelversion $kernelversion
mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initramfs-$kernelversion ./uInitrd
cp uInitrd /boot
kernelversionは(Debian流なら)/lib/modulesを見て… あ、ありますね。
3.0.60-odroidu2/ 3.0.63-odroidu2/ 3.7.0-1-linaro-lt-origen/
ということは、
# kernelversion=3.0.63-odroidu2
# mkinitramfs -c gzip -o ./initramfs-$kernelversion $kernelversion
# mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n initramfs -d ./initramfs-$kernelversion ./uInitrd
# cp uInitrd /boot
で、大丈夫なはずです。再起動します。
…あれ、だめですねぇ。でも、/proc/cmdlineにはちゃんと渡されています。
そうするとinitramfsの問題です。中身を見てみましょう。lsinitramfsというコマンドがあるようです。
lsinitramfs initramfs-3.0.63-odroidu2
あれ、aufsのモジュールが入ってませんね。
/etc/initramfs-toos/modulesにaufsを追加します。そして、上記のmkinitramfsなどを実行します。
でもダメです。aufsが入りません。変ですねぇ。aufs.koはあるんですよね? /lib/modules/3.0.63-odroidu2/fs/に… ないですね。Rasperry Piと同じで、こいつもaufsがサポートされてねーのか!!!
パワーユーザなら、ここで、kernelをリビルドするのでしょう。が、私はそこまでの手間をかけたくありません。クロス環境、クロスツール、カーネルソースの展開、カーネルのオプション設定、リビルド、u-bootで読めるように変換、起動チェック…。私はODROID-U2を「使いたい」のであって、「整備したい」わけじゃないのです。
ODROID-U2を使ってみる (その2) [プログラム]
続きです。
・ubuntuの起動まで
先のページを見ながら、androidを捨ててubuntuの方を入れます。バイナリの新しいもの(当時)は、
Ubuntu_U2/20130125/odroidu2_20130125-linaro-ubuntu-desktop_SDeMMC.img.xz
Ubuntu_U2/20130213/linux-3.0.63-odroidu2_20130213.tar.gz
これらを使用することになります。
まず、
odroidu2_20130125-linaro-ubuntu-desktop_SDeMMC.img
をSDカードに書き込んで立ち上げます。しばらくすると、ubuntuが立ち上がります。なにはともあれ、アップデートです。
$ sudo bash
$ apt-get update
??? あれ、ホストの名前が引けませんね。/etc/resolv.confにnameserverを追加します。あれ、まだダメです。ubuntuは、私が使っているDebianの派生のはずなのですが、どうもubuntuの流儀がよくわかりません。どうなってんの? 結局、わからなかったので、DHCPサーバ側でDNSサーバを設定して、ODROID-U2は再起動しました。再度続けます。
$ sudo bash
$ apt-get update
$ apt-get dist-upgrade
$ reboot
そして、パッチの
linux-3.0.63-odroidu2_20130213.tar.gz
です。こいつは、SDカードに先にコピーして展開おくとよいでしょう。で、
展開したら、
$ sudo bash
$ ./install.sh
を実行します。そして、おわったら、も一度rebootします。
・とりあえずベンチマーク
coreamakと、自前のベンチマーク(パズル解きプログラム)をコンパイルして実行してみます。
結果は、
ODROID-U2 1.7GHz: CoreMark 1.0 : 3796.026825 / GCC4.6.3 -O2
でした。Raspberry Piがオーバークロックの900MHzで、
Raspberry Pi 900MHz: CoreMark 1.0 : 1693.862571 / GCC4.6.3 -O2
でした。Pen4(Prescott)が
Pen4(Prescott) 2.8GHz:CoreMark 1.0 : 3857.776635 / GCC4.7.2 -O2
ですので、ほぼPen4(Prescott) 2.8GHzと同等とみてよいでしょう。実4コアなだけ、Pen4よりも速いでしょうし、消費電力も低いでしょう。
自前のベンチでは、
ODROID-U2 1.7GHz: 412 sec
Pen4(Prescott) 2.8GHz: 415 sec
i7-3770 3.4GHz: 71 sec
FX8300 3.6GHz: 169 sec
となりました。やはり、Pen4(Prescott) 2.8GHzとほぼ同性能です。
ODROID-U2で4コア並列だと100sec程度なのですが、i7-3770の1コアの71secに及びません。というか、i7-3770が他に比べて極端に速いようです。
よくわからないのが、ODROID-U2では、gcc-4.6のほうがgcc-4.7よりも速いということです。gcc(g++)のバージョンが新しくなると、よりコードが最適化されて、通常は速くなるはずなのですが、ODROID-U2では逆に遅くなるという妙なことが起こっています。また細かい最適化オプションも指定すると逆に遅くなるので、まだARMのgccは安定していないと思った方がよさそうです。
・目的へ向かっての整理
既に(一応の)目標を終えた今、はっきりと申し上げますと、私のような目標には
ubuntuを捨てよ、Debianを使え
ただそれだけです。ubuntuのデスクトップ「だけ」を使いたい人だけがubuntuを使うべきで、ubuntuをカスタマイズして使おう、特にデスクトップを捨てようとしている人は、ubuntuでなくDebianを使うべきです。既製品を求めるならubuntu、キットを求めるならDebian、という感じです。実際のところ、どうにもカスタマイズできなかったubuntuを捨て、Debianをインストールして、Raspberry Piで作ったスクリプトをそのままコピーしたらほぼ(一応の)目標が完了していることに気がつきました。そして、ubuntuをカスタマイズしようとして費やした時間の無駄を後悔しました。最初からDebianを使っていれば、シリアルコンソールも出番がなく、したがって、USBシリアル変換器もいらなかったことも。選択の誤りがどれだけの無駄を生じさせたかの典型だと言えます。
というわけで、やったことを個々の要素別でリストしますと、
(x) ubuntuを起動 (←すでに起動した)
(a) upstartでの起動設定を一時的に止める
(b) カーネルの起動パラメータを修正する
(c) initramfsを変更する
(d) 秋月のUSBシリアル変換器の接続
(e) Debianのインストール
(f) unionfs-fuseの設定
(g) sshfsの設定
となります。このうち、(a)〜(d)が不必要な作業でした。まぁ、今後のため(ARM一般のlinux起動動作)に知ることができたということでよしとしましょう。
ODROID-U2を使ってみる (その1) [プログラム]
なお、ODROID-U2のページはあまり多くはありませんが、本家(http://www.hardkernel.com/)以外に、以下のページが大変参考になりました。
まず、目標として、以下を考えました。
・目標(案)
4コアのCPU能力だけを使うディスクレスクライアントにする。SDカードはブート用。起動時のみ読み込み、書き込みは全く行なわない。NFSをマウントし、chrootして、NFS上で動作する。
NFSサーバは、別に24時間起動しているサーバマシンを使う。NFSは、セキュリティのため、ネットワークを分離するか、openvpnを使用する。
その後、rootfsをNFSには設定できなさそうなこと、また、NFS+セキュリティ設定を使うよりは、sshfsを使うほうが簡単(ただし、パフォーマンスは下がる)だと分かりましたので、目標を以下のように修正しました。
・(一応の)目標
4コアのCPU能力だけを使うディスクレスクライアントにする。SDカードはブートとrootfs用。aufs(unionfs-fuse)を使用してSDカードは読み込みのみとし、書き込みは全く行なわない。sshfsをマウントし、そこを作業ディレクトリとする。
この(一応の)目標を達したあとは、最終的には、以下のような最終目標になるでしょう。が、ここではそこまでやりません。
・最終目標
BOINCの4コアCPUサーバとして動作させる。
では、始めます。
・ODROID-U2の入手まで
13-03-31にオーダーしました。直接、Hardkernel Co., Ltd.のサイトでオーダーです。支払いはPayPalしか受け付けないので、PayPalへ登録(が先)しました。受け取りは会社にしましたが、特に文句は言われず、翌日オーダー受理されました。オーダーしたときには、「出荷は3週間以内」とあったのですが、数日後には「7日以内」に変わっていました。出荷が早まるのかな、と思っていたら、Fedexからトラッキングのメールが届きました。それによると、4/3夕方 韓国→韓国→中国→成田 4/5午前 で、午後には受け取りという、結果的に「海外通販なんて、受取りまで1週間かからない」という、私にとっての「常識的な海外通販」でした。逆に郵便局だけが「かなり遅い」だけということですが。
・本体以外のパーツについて
オーダーしたのは、ODROID-U2を2個だけだったのですが、失敗しました。ACアダプタも購入したほうがよいでしょう。
2.5mm/0.8mmというプラグは特殊で、日本のEIAJ#1(2.35mm/0.7mm)が「辛うじて」使えるのですが、EIAJ#は3V強までが規格です。ですから、EIAJ#1を5Vで使うのは規格外です。ただ、プラグ周りは電圧よりも電流のほうの制限が厳しいので、この程度の電圧オーバーなら実際使えますが、やはり、本来の2.5mm/0.8mmのACアダプタを使ったほうがよいでしょう。で、中華タブレット関連パーツを売っている某所で秋月のACアダプタとEIAJ#1の変換プラグを買いました。一応、使えます。これで1台を動作させました。
もう1台の方は、私の手持ちのACアダプタのうち、以前買ったセルフパワーの小型USBハブのACアダプタが、ちょうどこれにぴったりで、おそらくこれが2.5mm/0.8mmのアダプタだったのでしょう。今は、それを流用しています。
それから、あとになって買っておくべきだったと思ったものがあります。それは、シリアルコンソール用の、ケーブル付USBシリアル変換器(USB-UARTモジュールキット)です。u-bootであれこれしようとしている人には必須です。私はオーダーしなかったので、代わりに秋月のFT232RL USBシリアル変換モジュールを使いました。マニュアルを読んでこのモジュールのJ1の設定を直せてハンダ付けができる人なら、秋月のものでもなんとかなります。が、コネクタがないので、常時接続するには不安定ですから、Hardkernelで一緒にオーダーしたほうがよいです。値段も500円くらいしか違いませんし。なお、通常、シリアルコンソールは使わないので1個あれば十分です。
eMMCは買っていませんが、聞くところによると速いそうなので、多少余裕があってコストパフォーマンス度外視できるならよいかもしれません。私の場合は、アプリケーション起動後にはSDカード/eMMCは一切使わないので、ほぼ意味がないため、買いませんでした。
ディスプレイ出力は、マイクロHDMIです。これは普通に入手可能です。私は、マイクロHDMIオス←→HDMIメスの変換ケーブルを買いました。Raspberry Piを使用したときのHDMIケーブルがあったためです。
・電源投入まで
SDカードへの書き込み、バイナリの入手先(ダウンロードサイト)の情報、動作確認までは、
を参考にさせて頂きました。大変楽をさせて頂きました。感謝いたします。
なお、バイナリは新しいものがリリースされていますので、適宜ダウンロードサイトを漁ってみるとよいでしょう。
まず、動作確認のために、android 1.5をマイクロSDカードに書き込んで、ODROID-U2に装着します。マイクロHDMIの出力をディスプレイに接続し、ネットワークをつなぎ、USBマウスとUSBキーボードをつなぎます。電源を入れると、PWRの赤LEDが付き、しばらくして、ALIVEの青LEDが点滅します。画面のほうは、Linuxのペンギンが4羽(CPUコア4つ!!!)でてきて、androidのロゴが。しばらく待たされますが、androidが立ち上がります。これで、一応の動作確認ができました。
Raspberry Pi (の後日談) [プログラム]
http://plus.google.com/115251132918761933193/posts/3sijaknFLJr
(笑)。ここまで徹底した(いい意味で)おバカなものは、なかなか見られるものじゃありません。
ところで、WatchDogが働いていないのかなーとみてみると、SDカードの中身がWatchDogを入れる前のものでした。そりゃ動きませんよね。
Raspberry Pi (の10) [プログラム]
raspi:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 2061188 1812436 248752 88% /
/dev/root 1812308 1214552 505632 71% /oldroot
devtmpfs 248820 0 248820 0% /oldroot/dev
tmpfs 49780 208 49572 1% /oldroot/run
tmpfs 248880 128 248752 1% /oldroot/unionfs
/dev/root 1812308 1214552 505632 71% /oldroot/unionfs/unionfs/root
unionfs-fuse 2061188 1812436 248752 88% /
devtmpfs 248820 0 248820 0% /dev
tmpfs 49780 208 49572 1% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 99540 0 99540 0% /run/shm
/dev/mmcblk0p1 57288 16872 40416 30% /boot
raspi:~$ while true ; do uptime; ./sensors; sleep 15; done
while true ; do uptime; ./sensors; sleep 15; done
02:05:45 up 53 days, 14:22, 1 user, load average: 0.00, 0.01, 0.05
temp: 42236 mDeg.
freq: 700000 KHz
02:06:01 up 53 days, 14:22, 1 user, load average: 0.00, 0.01, 0.05
temp: 42236 mDeg.
freq: 700000 KHz
…といっても、アイドルでなく動作しているのは平日の夜と休日の間だけですが、いまのところ問題なく動いています。(なお、上記では、ちょうど通信がなかったときで、load averageが0.00になっています)。
無線+openvpnのクライアント側は、節電のため使用している間だけの運転ですので、連続稼動とはなっていません。こちらもSDカードを含め、問題は起こっていません。
Raspberry Pi、おもちゃのようでもちゃんと実用になりますし、1ヶ月以上の連続稼働にも耐えうるくらいの信頼性があります。linux上のソフトで簡単にサーバやコントローラなどを組み上げたいという人にはお薦めです。ただし、組み込みlinux、つまりswapなしでの運用、rootfsがReadOnly(書き込み禁止)で動作させるなどの知識をもっていることが前提です。
黒箱とかBBR-4M●というルータとか、それを改造して何かを作ってきた人たちや、それをやりたいと思っていたけど開発環境一式のセットアップが面倒という人たちには、このRaspberry Piがいいんじゃないでしょうか。いきなりlinuxが動いてaptも使える、USB-HDDやNFSを使えば本格的にセルフコンパイルもできる、GPIOも付いてる、となれば、市販製品を改造するより簡単ですね。
さて、今回で、Raspberry Piについては一区切りです。
作ろうとしていたものは作れましたし、また安定して動作しているので、めでたしめでたしです。
お読み頂いた読者様、ありがとうございました。
なお、今回作った「無線+openvpn」で有線LANを置き代えたものですが、通信路の安全性の確保としてWPA2の無線路をopenvpnで暗号化しただけではなく、実は、無線ルータを乗っ取られても(なにしろ210円の無線ルータなのですから;笑)、openvpnを越えられなければ、LAN/WANへ出ることができないという安全性もあります。無線ルータと直につながっているRaspberryPiとの通信はTCP/UDPではopenvpnのパケットしか許可していませんので、無線ルータからRaspberryPiへ入ることすら非常に難しいでしょう。openvpnのバグか、linuxカーネルのネットワークまわりのバグを利用しないと入れないからです。こういう実用的なものを簡単に安価に作れてしまうところが、linux(Debian)がすぐ利用可能なRaspberry Piの魅力でもあります。
ところで、次ですが、かなりCPUパワーを要する(しかしGPUで処理ができない)タスクを走らせるためのものを考えています。Raspberry PiがCPUとしては想像よりもかなり非力だったため、ARMの4コア品を探しているところです。
Raspberry Pi (の9) [プログラム]
watchdogを入れてみます。
Raspberry PiのCPUであるBCM2835の周辺モジュールのデータシートをみるとWatchDog機能の説明がないのですが、実際には使えるようです。
基本的には、このページ
http://binerry.de/post/28263824530/raspberry-pi-watchdog-timer
です。しかし、watchdogのinit.dなどを見ますと、若干設定の仕方が変わっているようなので、その部分だけ変えてあります。
ではインストールします。
が、新しいRaspbianのイメージも出ましたので、upgradeしておくとよいでしょう。ただし、一部でupgradeしたら、aptが動かなくなったというトラブルもあるようですので、実行前にまずSDカード全体のバックアップを取っておくことをおすすめします。バックアップを取ったら、
sudo apt-get update
sudo apt-get upgrade
をして最新のものに更新します。必要だと思ったら、rebootしましょう。
では順番に。
rootで実行します。
modprobe bcm2708_wdog
apt-get install watchdog
/etc/watchdog.conf を編集します。
以下の行のコメントを外します。
#watchdog-device = /dev/watchdog
モジュール bcm2708_wdog は、元のページのように/etc/modulesに記述するのもよいですが、それは、/etc/defaults/watchdogに記述できます。そこに書けば、watchdogのパッケージだけで変更が閉じることになります。
/etc/defaults/watchdog を編集します。
以下の行のnoneをbcm2708_wdogに変更します。
watchdog_module="none"
つまり、
watchdog_module="bcm2708_wdog"
と変更します。
起動は、
/etc/init.d/watchdog start
です。
試すならswapを止めて下記のfork bombを実行してみよ、とあります。が、syncをした上で、roでremountしなおしてやったほうがいいでしょう。これは、システムをクラッシュを引き起こすコマンドです。
:(){ :|:& };: