OSSでお勉強

socat便利 && 「ファイル」奥深い…。

OSC2014にお邪魔

twitterを漠然と眺めていて「遠くて明星大学行けない」という文字列を受信。明星大学近くね? 何やってるんだろ?
オープンソースカンファレンス2014 Tokyo/Spring
へええ。展示は登録も不要。休みを無駄にしないためにも、覗いてみようかな。

オープンソースの文化祭

…というサブタイトルが付いているのを今知ったが、土曜日のキャンパスの静けさと空気のおいしさとは対照的に、まさに文化祭の盛り上がりであった。展示には企業とコミュニティがあり、企業はサーバ系、コミュニティは組み込みが多い印象。企業で組み込みやってる自分はコミュニティとの間をとりもつべく反省するように。
学生さんが声をかけてくれた。「パケットアートやってるんです」。パケットの中身に応じてアニメーションさせるアート作品とのこと。TCPのフラグに応じてキャラクタを変えたりしているそうで、パケット擬人化みたいな感じ? 学生さんらしくていいじゃないですか。
「リアルタイムでやってるの?」と聞いたら「ファイル読み込みなんですよ、リアルタイムはやりたいけどやり方がわからない…<小声>raw socket??</小声>」とのこと。わからないとおっしゃりつつraw socketに着眼とは、お目が高い。ずいぶん前にTCPの異常系再現のためにraw socketでTCP書いたけど、それはなかなか面倒であった…。
OSSは真似して勉強するのにも使えるけど、組み合わせて目的を実現するのにも使える。そこで。

tcpdumpで書いたファイルを読む

パケットをキャプチャするtcpdumpには-wオプションがあり、pcap形式でファイルに保存できるので、このファイルを読めばよいじゃん。と思って、tcpdump -w hoge.pcap で書いているファイルをtcpdump -r hoge.pcapで読ませたところ、途中で終了してしまう。読み込みが書き込みに追いついてファイルの終端に達すると、read()が0を返してEOFとなり終了していると思われる。

tail -fの実装ってどうなってるの?

ファイルの終端に達しても終わらない魔法、それがtail -f。ログファイルを表示する時などでおなじみ。tail -f <ファイル名>とすると、ファイルを読み込んで終端まで表示したらじっと待ち、書き込みファイルに更新があると、また読み込んで表示が更新される便利機能。
tail -fってどうやって実現しているのだろう? ググると、こちらのサイトを発見。結構面倒なことしてる。tail -Fに至ってはポーリング&再open()。kqueue()ってBSDにはあるけどLinuxであるUbuntuでman kqueueしても知らんと言われる。
Ubuntuでman tailとすると、GNU coreutilsを使っているとのこと。ソースを持ってきてtail.cを見ると、tail_forever()という関数がある。よくわからんが、ファイルサイズとか日付を見てるっぽい。どちらにせよ面倒。

パイプとソケット

ところが。tcpdump -w – | tcpdump -r – として、標準出力に書いて、標準入力から読み込むと、右側のtcpdumpの読み込みは終わらない。パイプ経由で読み込むと、Broken Pipeにならない限り、read()がブロックして止まっているように見える、と思われる。動画のストリーミングが、通信状態が悪くなって、クルクル止まっているのと同じですな。
TCPのソケットだってそうだ。相手がデータをwrite()してくれないのに自分がread()すると、read()がブロックして止まる。相手がshutdown()とかclose()すると、read()が0を返して、EOF。
パイプでできそうと思ったが、今度は読み込みがリアルタイムに表示されない。バッファリングされていて、左の書き込みデータがある程度溜まらないと、右の読み込み側に渡らない。これは、tcpdumpに-Uオプションを付けて、パケット単位の書き込みで解決。ついでに、sshでログインしているNICをtcpdumpして表示すると、ハウリング(?)を起こすから、パケット取得用別NIC(eth1)を用意し(*1)、tcpdump -i eth1 -U -w – | tcpdump -r – として、pingにもキビキビ反応。

ファイルでブロックさせるには

パケットアートのプログラムはファイル読み込みなので、これは修正したくないだろう。でも、tcpdump -wで書くファイルを読むと確実にEOFに達する。そこで、socat。たまたま別目的で注目していた、便利コマンド。ある入力を、ある出力に転送できる。入出力の形式は、ファイルからソケットまで、何でもありだ。
socatには、実に様々なオプションがある。何ができるか分からないくらい、何でもできる。マニュアルを隅々まで読み込むと、入出力の対象に「名前付きパイプ」なるものがある。これ、聞いたことはあってもなかなか使わないのでは。パイプって、|で使うとファイル名付かないから、ファイル名指定で読み込みできないと思っていたけど、名前付き、ならできそうな気がするじゃないですか。試しにやってみよう。

今日の1行

これで、tcpdumpの出力を名前付きパイプにして、ファイル読み込みの既存の仕組みはそのままに、ファイル終端に来てもEOFで終了せずに、キャプチャファイルをリアルタイムに読み込みできるはず。
この1行を実行しつつ、tcpdump -r /tmp/pipeで祈るように読み込むと…何故かパーミッションエラー(そこかい)。tcpdumpは確かにrootで実行しているけど、/tmp/pipeは644で所有者以外でも読み込めそうなのになぁ。socatには作成するファイルのパーミッションや所有者を設定するオプションもあるが、うまく動かないので、

で所有者を無理矢理変えるか、読み込み側を

としたら、うまく行った。とりあえず、万歳!
(一応特殊性0なfread()で名前付きパイプを読み込んでみたけど、ちゃんとブロックした)

課題

ストリーミング

アート表示が速くて、ファイル読み込みが終端に達すると、read()がブロックするので、表示機能とファイル読み込みが同一スレッドだと、表示が固まる(バッファアンダーフロー)。逆に、表示が遅いのにパケットがどんどん到達すると、表示がリアルタイムでなくなって行き、キャプチャしたパケットのバッファがあふれる(バッファオーバーフロー)。このあたりの動作はプログラム全体の構造や性能に依存する。依存しないようにするには、動画のストリーミングのような同期機構がきっと必要。

スマホ

デモはChrome上で行われていたように見えたが、iOSやAndroidの実装もあったようだ。リアルタイムキャプチャはスマホでは(jailbreakやroot化をしない限り)できないはずなので、どこかのホストでtcpdump→socat→TCPのソケットに渡して、スマホでTCPのソケットを読み込むようにすれば、キャプチャしているホストの様子がどこからでも見られることになる。

などとできそうだが、全世界に丸見えだし、出力先をOPENSSL-LISTENなどとしても、スマホ側のSSLは普通はHTTPとセットだろうし、SSLの証明書管理も必要だし、認証しなければ結局全世界に丸見え…ああ危険、要注意(*2)。

本当の課題

ここまで書いて、パケットアートで検索すると、コンテストが開催されている模様。なになに、キャプチャファイルはプライバシー保護のためMAWIのガイドライン準拠? そうかー教育も含めてここが大事、確かに! …ということはtcpdumpの生キャプチャは使えない…がーん。うすうす気づいていた(*1)や(*2)は、ここへの伏線だったのか…。
tcpdumpの生キャプチャからプライバシーデータを削除するtcpdprivもしばらく更新されていないようで、FreeBSD9やUbuntu12.04ではコンパイルできなかたよ…。別の課題を発見。

長くなったけど、最後に所感

  • オープンソースを見て、触って、勉強する絶好の機会になった。ソースがなきゃ、こんなことわからなかった。
  • UNIXのファイルアクセスによる抽象化は、非常に便利だが、ファイルとストリーミング(的なパイプやソケット)では、扱いが微妙に異なる模様。
  • でも、ファイルにしておけば、socatのような便利なオープンソースで、TCPなどで飛ばして場所を意識しない仮想化なんかも簡単にできる(実際やったらできちゃった)。
  • MAWIって先進的だったんですね…。
  • 現実はきっと若さで乗り切れる! (わるいことはしないでねっ)

そんなことをしなくても

名前付きパイプにはmkfifoコマンドがあるって? おおお、使わなすぎて知らんかった…確かにできた。まぁTCPで飛ばすにはsocatが必要なので、同じ仕組みで名前付きパイプもTCPも使えるsocatが便利、ということで…。

arch linuxでStratum1(インストール編)

GPS18x lvcでNTPのStratum1をやろう、と思って、arch linuxを入れました。

何でarch linuxかって?

  • 不要なdaemonが動いていなさそうだから⇒GPSのPPS信号の処理遅延が最小になりそうだから
  • systemdを経験してみたいから
  • 最終的にはPTPとかAVBをやるのにkernelが最新で便利そうだから(これが後で裏目に…)

Raspberry Piは?

Ethernetが内部的にUSB接続で遅延がありそうだったのと、最終的にハードウェアタイムスタンプでPTPをやってみたいので、E2200のx64にしました、すいません。

手順

基本に忠実にやりました。プラス、左記に詳細が書かれていないところは以下の通り:

  • loadkeys: jp106
  • /etc/locale.gen: en_US ISO-8859-1
  • /etc/locale.conf: LANG=en_US
  • /etc/vconsole.conf: KEYMAP=jp106

ところが

kernelが起動しません。起動時、画面が_だけに…。
arch linux 2013.12.01のgrubの、arch linux改変部分で、問題があったようです。
解決策が何種類かあるようですが、今回は /etc/grub.d/10_linuxの最後の2つの

にして逃げました。

起動後の設定

このへんも参考にしながら。

  • ネットワーク(固定IP): netctlで設定。
  • ネットワーク(IP非設定): 固定IPと一緒だが、設定ファイル内でIP=noに設定。これでIPは振られずにinterfaceがupする。(PTP実験用)
  • ユーザー/グループ追加: useradd/groupadd
  • /etc/sudoers: wheelを対象
  • 更新: pacman -Syu

そんなとこ?

参考

バージョンも近く、とても参考になりました。

 

ESXiのUSB keyインストール

ESXiのUSB key (USBメモリのことをこう呼ぶらしい)でのインストールは、あちこちに情報があるが、結局どうすればいいか謎だったりする。公式はここ。でもsyslinuxのバージョンが古かったりして、うまくいかない。
syslinuxを使ったUSB keyでの起動化は、手動, unetbootin, rufusと3種類試して、rufusでISOをUSB keyに焼いた後、起動がうまくいかないので、

と入れるのが、一番簡単だと思った。
でもこの手順は忘れるので、ここにメモりつつ、FAT32でmountして見えるsyslinux.cfgに、

と書いたら、自動的にESXiのインストーラーが起動する。これで緊急時にも慌てない。
ちなみに確認したのは、1GBのUSB key, ESXi 5.5, ESXi-Customizer 2.7.1, rufus 1.3.4の組み合わせ。

MicroBoard その1 動作確認編

今更ではあるんですが。

きっかけ

「FPGAとHDMIで何かしろ」との神のお告げがありまして、何か買ってやってみようと思いました。…が、何からやっていいかわからない。…ところに、FPGAマガジンが創刊。Vol.1はHDMI特集ということで、良いタイミング。今更ながら勉強です。
HDMIはRGB(以外もあり)+αのdifferencial、XILINXとALTERAでそれぞれいろいろ、ARM内蔵もありと、盛り沢山の内容…。いよいよどうしようというところに、何故か元上司であるところの神から「Spartan-6」という言葉が出まして、それカンフーですかアチョーですか。実際にはXILINXのバランスのとれたFPGAのことでした。
これを使ったAVNETのMicroBoardが7980円(キャンペーン価格)ととにかく安いので、これを(個人で)購入。HDMI端子がありませんが、エム・アイ・エーから拡張ボードに端子ありとFPGAマガジンが教えてくれて、これも7000円と安いので(個人で)購入。

開封

IMG_0935昔のパソコンソフトのようなパッケージに、USBドングル型のちっちゃいボード、ケーブル、DVD-ROM、紙が入っています。拡張ボードでHDMIをやるとチップが熱くなるとのことで、千石電商で買った16x16x7のヒートシンク熱伝導性両面テープであらかじめ貼り付け。ついでにRAMにも10x10x7のヒートシンクを貼ってみた。
それでは動作確認…と、その前に!
IMG_0937-mIMPORTANT! この紙、開発ツール(ISE)を使うのに必要です。捨てないように。

動作確認

資料参照のため、まずはAVNETにてアカウント作成。これで、MicroBoard関係の資料がダウンロード可能に。次に、入っていたQuick Start InstructionsよりダウンロードできるGetting Started Guideのほうが詳細が書かれているので、これを見ながら動作確認。ポイントは、

  • PCのUSBにそのまま刺したくなるけど、そこじゃない! 「Ether端子横の」microUSB端子とPCを添付の黒いケーブルでつなぐんだ!
  • …と聞くとすぐにつなぎたくなるけど、その前にPCにCP210xのドライバを入れるんだ!
  • ついでにTeraTermなどのターミナルもインストール
  • ターミナルのCOMポート設定は115200bpsに設定

いずれもGuideの記載通りだが、上記に気をつけつつ接続すると、D7のLEDが緑に、D1のLEDが青に光り、起動。COMポートとして認識をデバイスマネージャで確認後、ターミナルでCOMポートに接続。SW4スイッチを押して再起動。するとプリセットされているメニュー画面が表示される。
WS000003
blink_offと打ったら、赤のLED点滅が止まった。他にもいろいろできるみたいだけど、まぁいっか。

PC環境

ちなみに、今回のPC環境は、MacOSXのVMware Fusion上のWindowsXPでやってます。開発環境(ISE)のサポート状況を見るとWindows8は非対応、手元のWindowsに7は無く、8以外はXPのみ…。
他のWindowsPCのXPでやったら、電力不足からか、D1/D7のLEDが点灯せずという現象が発生。この場合、USB A(USBメモリみたいなコネクタ)をPCに刺しつつ、microUSB側もケーブルでつなぐと、LEDが点灯して起動。でも、起動後にUSB A側を抜いても動き続けるという謎動作…起動の瞬間に電流が必要なのかな。今度消費電流を測ってみよう。
まずはここまで。Special thanks to Cafe&Bar agosto

sshguardのdovecotのログ解析

動作未確認。
sshguardはいろんなサーバのログを解析してパケットフィルタをかけられるが、パーサが最近のdovecotのログに合っていなかったっぽいのでパッチ。sshguard-1.5とdovecot-2.1あたりを想定。実際にはFreeBSDのportsのfilesに置いて当てたので、環境によってはそのままでは当たらないかも。

くどいですが、動作未確認。

VMwareでdisk shrink

GUIでうまく行かない時に。
VMware Fusion 5で、仮想ディスクのサイズが小さくならない。GUIの仮想マシン->設定->一般->仮想マシンのクリーンアップで、ゲストがWindowsだと再利用可能領域ができるのに、Linuxだといくらゲストでファイルを消してもできないっぽい。
調べると、ゲスト側から小さくできるようだ。ゲスト側のLinuxで、

…で、できた。ext4などはNTFSと違ってVMware側から解析できない仕様なのかな。まずLinuxのファイルシステム上の未使用領域をwipeして、VMwareとして未使用領域として認識できるようにした後、実際にshrinkさせるようだ。最初、shrinkonlyだったらshrinkすると思ってやっていたが、wipeできていないのでshrinkしなかったようだ。
ゲスト側の操作なのに一時的にVMが停止されてまた動き出すのが面白い。ということは、vmware-toolsで連携しているのだろう。
Fusionでなくてもきっと同じ。公式ドキュメントだとvmware-toolbox-cmd disk mount-pointでできるように見えるが、vmware-toolbox-cmd help diskでhelpを見ると、shrinkが必要なように変わったのかな。ちなみに、ESXi 5.1でのdiskのオプションは、こんな感じらしい。

参考

VMware FusionのKB…help見てねってこと?

GPS18x LVC到着

航空便がどこをさまよっていたのか…ついに到着。
Garmin GPS18x LVCがgpscityから到着です。PPS出力有りで夢の(と言っても今やあまりに一般的ですが)Stratum 1です。それでは、ご開帳…。
IMG_0874OEMにふさわしい端整な顔立ち。
IMG_08765mだと結構重いですな。
IMG_0878 ほほう、mountできるのね。磁石にもなってた。
IMG_0882 コネクタで受けることも考えたのですが、受けるコネクタ側も1mmピッチで、半田はかなり厳しそう…動作確認のため、切る! 切っても保証は切れない、と仕様書に書いてあるのはさすが。
IMG_0884 後輩のワイヤストリッパが大活躍。Garminの仕様書Wire Gaugeの26番/28番と書かれていて、これをもとに、きれいにむけました。
IMG_0888 迷った結果とりあえずピンヘッダにそのまま半田。ださー。順番は一応仕様書に合わせてみたりして。
IMG_0890-2電源は一応ACアダプタから、シリアルは旧ArvelのSRC06USBでMacと接続、LEDで様子がわかるのがいい。NMEAの出力で動作確認でもいいんですが、いつも見ているここによると、電源投入後binary modeになっている場合もありそう。NMEAモードに切り替えたり、ファームのアップデートチェックを考えると、専用ソフトで確認したいな…。GarminのGPS18x用ソフトをとりあえずはしから動かしたら、SNSRXCFGというソフトでモード切り替えや受信確認ができそう。こういう時はWindows XPが一番ですねぇ…。
WS000000 あんな半田でもとりあえず動きました。ファームはアップデータを起動したら、現在動作中のバージョンが最新版と同じだったので、そのまま。…って、今見たらSNSRXCFGで見た$PGRMTにもバージョン番号出てた! あはは。
さて次はRaspberry Piにつなぐか、FreeBSDにつなぐか…。

MK908購入

リモコンが欲しい…。
Raspberry Piをもう1つ買おうと思ったのですが、Android Stick(Dongle)も高性能化著しい模様なので、買ってみました。
今回買ったのはTronsmart MK908。5000円強のMK808B、5GHz対応のT428と迷った結果、Quad CoreでSDもUSB-OTGも対応、というところでMK908に決定。PCパーツ屋@Amazonで8888円。…と思って今見たら値下げ…ショック。

開封の義

…のはずなんだけど、ちょっと開けちゃったのを箱詰めしなおしてます…。開封時と微妙に違っていたらすいません。
IMG_0858紙質がApple風。
IMG_0860取っ手がApple風。フォントは微妙?
IMG_0862箱に紐を付ける心遣い。
IMG_0864でも底はチープ。
IMG_0868PSE非対応だけど2A。アダプタ本体、軽い。写真にないけどUSBケーブルも付属。あのケーブル2A確認済みなのかなぁ…謎。
IMG_0869USB-OTGも片側mini, HDMIも片側miniとレアなケーブル付き。
IMG_0866分解するなよシール付き。裏が微妙に剥がれてる。

アプリ/設定

Screenshot_2013-07-24-21-21-58アプリが結構いっぱい。Googleアプリだけでなく、eHomeMediaCenterやWiFiDisplayなど面白そうなアプリも。
Screenshot_2013-07-24-21-22-40eHomeMediaCenterでDLNAサーバ(PMS)が見えた!
Screenshot_2013-07-24-21-31-25Wi-Fi DisplayはSourceなのかSinkなのか…。手持ちのMiracast端末で試してみたが、Source/SinkともにWi-Fi DirectはつながるもののWi-Fi Displayはつながらず。HDCP非対応だからなのか?
Screenshot_2013-07-24-21-31-36Exproler(ファイルマネージャー)はSMBにも対応。でもOSXのSMBサーバにはつながらなかったような。
Screenshot_2013-07-24-21-24-44Bluetoothキーボードもつながります。
Screenshot_2013-07-24-21-41-04AnTuTuは15000強。後日やったら何故か16000越え。開発者向けオプションで2D時GPUをオンにしたから? 画面解像度を1080iにしたから?
Screenshot_2013-07-24-23-53-58 Androidは4.2.2が入ってた。

問題点

  • とりあえずUSB-OTGのマウスで乗り切ったものの、無線化必須…。Google TV Remoteがダウンロードできないのは日本だからか?
  • 発熱するという話だが、放置している分にはぬるい感じ。でも動作させると確かに熱くなる。温度センサーでクロック落とすという話もあるが、PicUntu時は動かない?

今後

  • 何と言ってもリモコンをどうするか。BluetoothのHIDをどうにか買うか、Google TV Remoteをどうにか入れるか。
  • MK808はSD bootができるらしいので、MK908もできるか、焼きかえソフトで遊んでみたい。
  • RK3188で動くkernelもあるらしいので、これもいじってみたい。
  • MK808用Cyanogenmodもある。MK908は?
  • 何をいじるにしても、stock ROMに戻せないとなぁ。このへんを探るか。
  • ファン付けるかな。

色々楽しめそう。

MacOSXの/etc/krb5.keytabの復元

あんまりないと思いますが、OSXの/etc/krb5.keytabを間違って削除してしまったので、/usr/libexec/configureLocalKDC を使って復元。さらに、/usr/libexec/checkLocalKDC でテスト。
ただ、/usr/libexec/configureLocalKDC は、ただkrb5.keytabを消しただけの場合は、うまく検知してくれなかった(10.8.4)ので、perl -d で

の直前まで進めて、

として実行。そしたら

と1946バイトのファイルが復活。
しかし、LKDCなんて仕組みがあったのね。ローカルでafpやcifsにKDC使うって、どんな時?

Ubuntuが起動中画面で止まってしまう

Ubuntu 12.04LTSが、起動中画面で止まってしまうことがある。きっかけは不明だが、VMware上で使っていることと、アップデートが関係しているように思う。VMware vSphere ESXiとVMWare Fusionで経験。
ubuntu-boot
調べたところ、/usr/bin/Xが消えていて、Xが起動できなさそうだ。似た事例もありそう。正しい方法か不明だが、以下でXを入れ直し。

すると今度はVMware上のマウスの挙動がおかしいので、さらに以下も追加。

ログイン時に一瞬白い画面が出るようになった気がするが、気にしないことにする。

追伸

androidのbuild environmentを、Ubuntu 12.04用にここのコピペで整えると、xserver-xorgがuninstallされるっぽいな…(画面で一瞬見えただけなので確証はないけど)。

追伸2

ここによると、libgl1-mesa-glx:i386ではなく、libgl1-mesa-glx-lts-raring:i386を入れると、xserver-xorgがuninstallされないっぽい。すごい。