2016年12月29日木曜日

Intel HD Graphics のマシンで,Wine の DirectX をいいかんじにやってもらいたい(ArchLinux)

実は,数年前より,フリーのグラフィックスライブラリである Mesa において,DirectX 9 がネイティブに扱えるようになっています.と,言うのも,Mesa が導入した Gallium 3D というもののおかげです.

これは,OpenGL や DirectX のバックエンドとなる,3D 描画一般の標準的な API を提供するレイヤです.そこで,Wine についても,この Gallium を使って DirectX 9 をネイティブに描画する,Gallium nine patch というものが存在しています.
# pacman -S wine-staging-nine
このパッチが当たった wine では,winecfg の staging タブで Gallium Nine を有効化するだけで使えるようになります.しかし,Intel HD Graphics のマシンでは,
ilo: driver missing
と出てしまい,DirectX を使うアプリケーションの起動が失敗するようになってしまいます.
そこで,解決方法は,次の通りです.

  1. # pacman -S abs && abs /var/abs/ にパッケージビルドレシピをダウンロード
  2. $ cp -r /var/abs/extra/mesa $HOME/
  3. PKGBUILD を編集し,--with-gallium-drivers= へ,ilo を追加
  4. $ makepkg -i によりパッケージビルド,インストール
これで,Wine で DirectX をいいかんじにやってもらえるようになります.ただし,已然として不具合や欠けている機能の多いものなので,正しく動作しない可能性も高いです.その場合は,Gallium Nine を無効化して,諦めて従来の描画方法に頼りましょう.

2016年12月26日月曜日

インドのふたつのカレー

カレー Advent Calender 2016 22 日目の記事です.

カレー†1の本場と言えば,言わずもがな,インドです. インドカレー屋は,案外街のあちこちにあったりして,馴染み深い人も多くなったんではないでしょうか.ところで,インドカレーと一口にいっても色々あります.大きく,北インド南インドでそれぞれ分けられます.北インドでもパンジャブ地方のパンジャブ料理と,ムガル帝国†2の宮廷料理であるムガル料理など,いくつか種類がありますが,タンドールを使った料理,ナンや,バターチキンカリーといったものを生み出したパンジャブ料理は日本でよく知られています.
この,南北ふたつのカレーについて,特徴を紹介しようと思います.

スパイス

北インドカレー

インドカレーの南北をそれぞれ象徴付けるのは,やはりスパイスです.北インドカレーでは,カルダモンクローブシナモンローリエといったものが,よく使われるようです.カルダモンは,スパイスの女王と呼ばれる,さわやかな香りが特徴的です.
カルダモン - 画像は Wikimedia commons より
クローブは,肉料理によく使われ,臭み消しだったりします.中国だと丁子
クローブ - 画像は Wikimedia commons より
ローリエはあの冠とかに使われる月桂樹の葉っぱ,と言えば通りが良いかと思います.この画像のような大きめの葉っぱが煮こまれて入ってるカレーとか,インド料理レストランで食べたことないですか?
ローリエ - 画像は Wikimedia Commons より
シナモンはみなさんご存知ですね.エジプトでミイラ保存料として使われたり,聖書に出てきたり,歴史の古いスパイスです.甘い香りがして,おかし作りなどに出てきますね.
シナモン - 画像は Wikimedia Commons より

こういったスパイスを,ホール(粉にしない,実や葉,樹皮のようなスパイスのそのままの形)で使うのが北インドカレーです.それも,最初に油でこれらを炒めて,作った香油を,鶏肉など材料に絡めて,調理していくというのが,大きな特徴となります.ちなみに,ここで書いた中でも,カルダモンやクローブ,シナモンは,ハウス食品や S&B が瓶詰めのスパイス粉として発売している「ガラムマサラ†3」の中によく入ってます.
東京都,神田神保町のインド料理屋,マンダラ.筆者撮影.

南インドカレー

対して,南インドではどのようなスパイスを使うのでしょうか.ホールスパイスとして使うものとして代表的なのは,マスタードシード赤唐辛子カレーリーフ
マスタードシードは,白芥子の種子です.あのマスタードの原料そのもの.場合によっては,粒入りマスタードなどにも使われる表皮の黒い黒芥子の種子も使われるようです.
マスタードシード - 画像は Wikimedia Commons より
唐辛子は言わずもがなですね.原産は中南米,現在のメキシコあたりなので,実は大航海時代の新大陸発見まで存在は知られてなかった,比較的新しいスパイスです.
赤唐辛子 - 画像は Wikimedia Commons より
カレーリーフは大葉月橘という木の葉っぱ.これはインド原産だそうです.橘という字が入っている通り,柑橘系のような香りが特徴だそうです.
カレーリーフ - 画像は Wikimedia Commons より
南インドカレーでは,これらのホールスパイスを使い作った香油は,料理の最後に入れることで使います.この,ホールスパイスを使うタイミングも大きな違いのひとつですね.
神戸三宮にある南インド料理屋,マドラスキッチン.筆者撮影.

パウダースパイス

色付けのターメリック(ウコン),肉料理の臭み消しでも有名なクミン,そしてコリアンダー胡椒.こういったスパイスを粉にしたパウダースパイスや,カルダモン・クローブ・シナモンなどをあらかじめ粉にしたパウダーのガラムマサラなんかは,北インドカレーでも南インドカレーでも,調理に使います.ホールスパイスと違って,玉葱のような香味野菜やトマトと一緒に炒めまくって使います.ちなみに,実はコリアンダーって中国だと香菜(シャンツァイ)と呼ばれたり,タイ料理だとその葉がパクチーと呼ばれたりします.ご存知でしたか?また,南北ともに,香味野菜やトマト,パウダースパイスを炒めた塊を,マサラといって,これに水を足して煮込めばカレーになります.ここで,香味野菜や具材を炒める段階でホールスパイスの香油を入れるか,最後に煮込んだあとにホールスパイスの香油で香り付けするかが,北と南を分けることとなります.

具材

北インドカレーは,鶏肉やマトン(羊)が中心.カシミヤで有名なカシミール地方も元はムガール帝国の版図ですし,パンジャブ料理のタンドールなどは現在のパキスタンとインド両方で使われましたからね.今は,立派な紛争地帯ですが…….対して南インドは,魚介類や野菜がメインです.とはいえ,サグ(ほうれん草)を使う,チキン・サグのように,北インドカレーだから野菜を使わない,というわけでは全くありません.ただ,メインの食材が違うということになりますね.

主食

北インドでは前述の通りタンドールの発祥でもありますし,ナンのようなものをカレーと共に食べますが,実は南インドカレーではご飯と一緒に食べます.とはいっても,勿論米はインディカ米ですね!スパイスの節で掲載した画像も,それぞれナンの付いたカリーと,ごはんの付いたカリーになってますね?

インドカレーのススメ

さて,スパイスや具材,調理手順から,北と南,ふたつのインドカレーを紹介しました.ところで,インドカレーって基本的にレストランで食べて,おうちカレーは日本カレー,という方が多いと思います.しかし,実は試してみるとそれっぽいカレーは案外おうちでも作れたりします.パウダースパイスの節でも書きましたが,炒める,煮込む,これだけなので,あとはスパイスを揃えるだけですね(これが大変なのですが).とはいっても,これまで書いたように,インドカレーは多様です.そこで,次の本は,自宅でインドカレーを作るのにとっても役立ちます.

これは,銀座のカレーレストラン,「ナイルレストラン」のシェフによるレシピ本で,北インドカレーと南インドカレーの違いも含めて,様々なレシピが紹介してあります.カレーだけでなく,カレーとあともう一品,というときのインド料理の一品や,インド料理の主食などのレシピも紹介されており,とても素晴しいです.

ちなみに,芸能界屈指のカレー通として有名なタモリさんは独自のレシピを考案したりしていますが,カレー粉はナイル商会のインデラ・カレー粉とこだわっているそうです.このナイル商会のカレー粉は,「ナイルレストラン」初代オーナー G. M. ナイル氏との出会いによって生まれたそうで,公式サイトにナイル氏のコメントが寄せられています.
筆者が作ったタモリさんレシピのカレー.インデラ・カレー粉を通販で買いました.
筆者がタモリさんのレシピのカレーを作ったときの様子はこの記事です.

おまけ

私は最近,カレー粉(パウダースパイス)に,RAJ というメーカーのスパイスを使ってます.
というのも,JR 秋葉原駅の南側の高架下,ニュー秋葉原センターの奥に,ヒンドゥー系っぽい人が営業している食料品店があったので,つい買ってしまったのです.これが,なかなか本格的な薫りがして,結構気にいっています. これはカレー粉ですが,他にもいろいろ日本のスーパー等でみかけないパッケージのパウダースパイスが置いてあったので,一度足を運んでみると楽しいかもしれないです. 最後に,最近作ったバターチキンカレーの画像でお別れです.

脚注

†1:元々はタミル語.タミル語はドラヴィダ語族に属する.インドの言葉について,主たる公用語であるヒンドゥー語や,仏教で真言を表わすのに使われる悉曇文字の悉曇が指す,古典語のサンスクリット語などといったものは,インド・ヨーロッパ語族に属しているが,これはヨーロッパの人種とも祖を同じにするアーリア人がインド北部に攻め込んだため.タミル語のようなドラヴィダ語族を操る人達は,このアーリア人に追われて南インドまで逃げ込んだ.ここではアーリア人とはインド・ヨーロッパ祖語を話していた人々のことを指す.
†2:16 世紀のパンジャブ含む北インドから始まり 19 世紀まで続いた,最盛期に南インドの一部を除くインド亜大陸と現在のパキスタンあたりをほぼ版図に収めた帝国
†3:熱い(ガラム)+ミックススパイス(マサラ)の意.ちなみにここで紹介したホールのスパイスをまとめてホール・ガラムマサラと言うことも.

参考文献

[1] ナイル善己(2014)「「ナイルレストラン」ナイル善己のやさしいインド料理」世界文化社.ISBN: 978-4418143030

2016年12月20日火曜日

Rust で nostd(と UEFI)

Rust Advent Calender 2016,19 日目の記事です.

Rust で OS 作ったりなんだり,簡単にできるといいなあってことで.

まず,Rust で nostd な環境でどのようにすれば良いのか,なのですが,単純にこれだけならば,Rust の公式ドキュメントに載っています.
https://doc.rust-lang.org/book/no-stdlib.html
基本的には,nostd をコンパイラに指示して,lang_item を使っていくつかの不足のシンボルを定義してあげます. また,ここで panic_fmt をいい具合に定義するときっと panic!() とか使うのに役立つ(と思います).

ここからが,ちょっとした TIPS になります.
実際に本当に使える何かを作ろうとしたとき,何もないと不便で,作りづらいです.そこで,Rust の libcore,つまり core ライブラリを使って, core::fmt::Display でフォーマット文字列使ったり,core::mem::size_of で特定の型のメモリサイズを取得したり, core::ptr::null で null pointer 作ったり core::ptr::swap でポインタの中身を取り替えたり,そういう unsafe な部分も 組込みっぽい場所で必要になるでしょう.しかし,これらを使うにも,クロスコンパイルの時には,Rust のソースを全部もってきたりして,手動で core ライブラリを ビルドしてリンクさせないと使えなかったりするのです.

そこで便利なのが,xargo です.次のように使えます.
$ cargo install xargo
$ export PATH=$HOME/.cargo/bin:$PATH
$ xargo build
普段のcargoの代わりに,ビルドなどにこのコマンドを使うと,cargoのラッパーとして動作し,しかも core ライブラリ等を自動でビルド,リンクしてくれます. 結構地味に便利なので,ぜひ.

最後に,宣伝というか.
UEFI で動かせるナニカを Rust で作りたいなーと思いつつ,放置してたのですが,crates.io に uefi というライブラリがあったので,手を出しはじめました. しかし,実装が全然足りてなかったので,少しづつ足したり直したりしながら使ってます.
https://github.com/orumin/rust-uefi
コントリビューションだとかツッコミだとか,色々手を貸して下さる方がおられるのならとても嬉しいです.

2016年12月8日木曜日

HIL: Designing an Exokernel for the Data Center

遅刻しました.ごめんなさい.
本稿はシステム系論文紹介 Advent Calener 2016,2 日目の記事になります(大遅刻).
今回はHIL: Designing an Exokernel for the Data Center を紹介します.

原論文

J. Hennessey, S. Tikale, A. Turk, E. U. Kaynar, C. Hill, P. Desnoyers and O. Krieger, “HIL: Designing an Exokernel for the Data Center″, in 7th ACM Symposium on Cloud Computing, ser SoCC '16, Santa Clara, CA, USA: ACM, Oct. 2016, pp. 155―168, ISBN: 978-1-4503-4525-5. DOI: 10.1145/2987550.2987588. [Online]. Avaliable: http://doi.acm.org/10.1145/2987550.2987588.

前提

1. Exokernel
まず始めに,表題にもある,Exokernel について説明しなければなりません.Exokernel とは,1995 年に生まれた技術です[1]. 図1を見てください. これは,マイクロカーネルよりさらに一歩進めて,security bindings 以外を全てカーネルから追い出してしまい,従来のカーネルのサブシステムは,全てアプリケーションとリンクするライブラリとしてしまうアーキテクチャです.この,従来の OS の機能を持つライブラリを,libraryOS と言います.リソース管理などの機構をアプリケーション毎に特化させる事を容易にし,また,複数のアプリケーションの,デバイスや計算資源へのアクセスの分離(isolation)とその管理(management)をそれぞれ Exokernel と libraryOS で全く分けてしまえる事が特徴のアーキテクチャでした.

TL;DR

さて,今回紹介する論文は,この Exokernel のような抽象層を,ベアメタルクラウドのデータセンタに導入する試みです.
  • 双方向に信頼されないベアメタルのデプロイメントサービス(OpenStack Ironic, MaaS, xCAT ..)
  • これらサービスでデータセンタの計算資源を効率的に共有
  • 効率化のみならず新しい経済モデル,新しいアプリケーション,新しいセキュリティ特化型の利用,を可能にする(と論文の筆者は信じている)

背景と問題点

現在様々な物理サーバー向けのデプロイ/プロビジョニングのツールがありますが,これらは全て,低レイヤを覆い隠し, また,イメージデプロイツールを通して抽象化することでアプリケーションやサービスを物理システムの上に展開する事を簡単にするという共通の目的があります.
しかし,OpenStack Ironic は勿論 OpenStack ユーザ向けですし,xCAT は HPC 分野でのデプロイのためのツールで,用途によって様々です. 抽象化の実現の仕方も様々ですので,すると例えばクラスタの管理者はソフトウェアのデプロイに Ironic を使うのか MaaS を使うのか決断する必要がありますし,データセンタの管理者達は,それぞれのツールをユーザが使えるように,サーバ群を静的にパーティションして備えるといったことが起こります.
ユーザが新しいツールを使いたかったとしても,さらにサーバ群をいくつか新しいツールのために使えるよう準備しておかなければならないため,結果としてデータセンタ管理者はそれを避けようとします.つまり,新しいツールが出ても中々使えない状況が起こります.
そこでこの論文では,Hardware Isolation Layer(HIL)というレイヤを導入することで,複数のベアメタルデプロイツール間で計算資源の共有を可能とし,データセンタの効率化を果たすというのが目的になります.

概要

2. HIL の概要図
HIL の役割は主に,物理サーバやネットワークの確保と,これら確保したものを複数のデプロイサービス間で分離することです.しかも,その構成について,手動の管理なく再構成が可能になります.具体的には,1) 物理サーバの確保 2) ネットワークの確保 3) サーバとネットワークの接続,が HIL が提供する基本的な機能です.また,追加的な機能としては,1) HIL のマネージドネットワークへの VPN 接続 2) パワーサイクルやブートデバイス選択のようなものを安全に行なうノード管理機能 3) 確保されたリソースの追跡,などがあります.また,サーバープールごとに 1 つの HIL インスタンスを置き,管理することで,巨大なデータセンタを複数の会社や研究グループが管理する状況にも対応します.

構造

3. HIL のデプロイのコンポーネント
HIL の構造について,図3. を見て下さい.HIL のコンポーネントは, 3 つに分類され,コアコンポーネント,システムドライバ,オプショナルサービスとなります.本稿ではオプショナルコンポーネントについては割愛します.原論文を参照ください.

HIL API

HIL の資源は,ユーザの集合に管理される project が基本になっており,この projectnodesnetworks という要素を持っており,nodes,つまりサーバは networks へ接続される NICs を持ちます.REST API を通じて操作され,ユーザは次の操作が可能です.
  • プロジェクト作成・空のプロジェクト削除
  • ネットワーク作成・削除,パブリックネットワークのプロジェクトへの取り込み
  • プロジェクトへのノード確保・プロジェクトからノードの解放
  • ネットワークへの NICs 接続・ネットワークからの NICs 切断
  • パワーサイクルやシリアルコンソールへのアクセスのようなノードの管理
  • 空いてるノードの一覧表示,プロジェクトへのノードとネットワーク割り付け,ノードやネットワークの詳細取得,などのクエリ

コアコンポーネントとドライバ

HIL Server
HIL のロジックの実装の大半と HIL の REST API,データベースのインターフェース,操作エンジン,アウトオブバンド管理1 のドライバを持ちます.
OBM and Auth drivers
HIL は,OBM(=アウト・オブ・バンド管理)ドライバを通してベアメタルのノードを制御します(パワーサイクルや,ネットワークブート,シリアルコンソールのログへのアクセス).OBM ドライバは,IPMI を使って実装され,プログラムインターフェースを提供します.また,認証と認可の決定は,auth driver へ転送されます.リクエストの説明,受け取った決定(認可の可否),オプションで認可トークンをドライバに渡すことで,認可が実行されます.
Operation Engine
ネットワーク構成の変更のような,調整操作のシーケンスへ責任を持つエンジンです.API サーバからキューを通してリクエストを受け取り,リクエスト順に処理を実行し,最終的に完了したらデータベースを更新します.
Switch drivers
operation engine がネットワーク接続の操作を行なう際に実際にその操作を受け持つ実装になります.VLAN などを用いて,他のプロジェクトや外部システムから,プロジェクトへのアクセスを拒否し保護するといった事を実現します.

評価

1. 13 ヶ月間のクラスタで実行された操作の統計
2. 秒当たりの中央値と標準偏差
プロトタイプ実装は 3000 行以下(ただし PoC).48 の Cisco UCS C220 M32 ノードで日々基本的な production に使用されています.表1. は,このクラスタで,HIL を 13 ヶ月間稼動させ取った操作の数の統計で,表2. はこれらのコアの操作について,かかった時間の中央値と標準偏差を取ったものです.これは各操作を 250 回繰り返した場合の統計値です.スイッチと対話しない,データベースの操作のみで完結する操作の場合,数十ミリ秒で操作が終了しており,ネットワークの接続を要する操作も数秒で終わっています.
4. 同期的な API の並列性
5. 非同期的な API の並列性
4. は同期的な API の実行を,クライアント数を増加させた場合の処理にかかる時間を見たものです.基本的に,クライアント数が増えても実行時間は増えておらず,alloc_net と free_net は多少実行時間が増えていますが,スケーリングしていると言えます.ノードの解放だけ異様に実行時間が長いのは,ノードの解放の前に ipmitool を実行してコンソールを接続する必要があるため, 他の操作に比較して 5 倍という実行時間になっているようです.図5. は非同期な API の実行における並列性です.この操作は,ネットワークスイッチへの対話が必要であり,この計測では全てのリクエストが同一のスイッチに向けられていることがボトルネックになってします.スイッチがスケールするより巨大な環境で,HIL に最適化されているのであれば,並列性はさらに向上するのではないかと原論文の著者は推測しています.
6. HIL で区画された環境へ,Hadoop 環境をベアメタルと仮想環境(OpenStack)それぞれ用いてデプロイした時のパフォーマンス
次に,HIL をベアメタルサービスで用いた場合のデモンストレーションについてです(図6.).1) HIL で 8 ノード確保し,2) Foreman を用いて Red Hat Enterprise Linux をプロビジョニングし,3) Apache BigTop でビッグデータ処理環境をベアメタルにデプロイし,4) CloudRank-D ベンチマークを用いた結果となります.比較対象となる仮想化環境は,MOC(Massachusetts Open Cloud)の OpenStack (Kilo リリース版)を同一のクラスタの idle のノードで実行し,同一テストを走らせたものです.仮想の Hadoop 環境は 1 ノード 1 VM で動作され,各 VM はホストの 90 % の資源が与えられています(残りの 10 % はハイパーバイザに予約されている).仮想化によるオーバーヘッドの分,ベアメタルのほうが性能が勝っています.
ところで,HIL そのものは,例えばリクエストに対しどのノードを確保するべきか選択する,といったようなスケジューリングはしません.そこで,HPC クラスタで広く使われている SLURM スケジューラを導入し,HIL リクエストに特別の名前空間を設けることで,HIL と SLURM を共存させることにも成功しています.

経済効果

7. 1 週間での リアルタイムワークロードと HPC ワークロードが必要とした c4.xlarge インスタンスの数
8. 1 週間でのシステムの利益(5000 の Linux がホスト可能な,US-East-1a にある c4.xlarge の EC2 インスタンス)
実際のデータセンタで HIL が使われると仮定します.たとえば,Amazon EC2.現在オンデマンドにインスタンスが借りれますが,HIL によってオンデマンドにクラスタ単位での貸し出しが可能となり,これは大規模ゲームサーバや HPC のようなリアルタイムアプリケーションで有利になります.MMO ゲームは,それぞれ使い方が異なる,極度に特化したソフトウェアを分散サーバファームを通して配信しますし,多くの HPC ライブラリやアプリケーションも同様にとてもハードウェアに寄りの動作をする設計になっているので,OS のドライバやハードウェアのサポートを必須としています.HIL ならば,仮想化されているサービスとそうでないサービスの間で,物理ノードの数を動的に調整できます.つまり,HPC に使われていたノードを,クラウドサービスで使うノードに転用する,ということを,オーバーヘッドをかなり少なく(一時間以内で)行なえるのです(サーバの再起動と再プロビジョニングの分の時間はかかっていますが).
7. はログデータによる,HPC ワークロード(SunGrid Engine)とリアルタイムワークロード(ゲーム,MineCraft)の必要とする c4.xlarge インスタンス数の一週間でのプロットです.
8. は,5000 の Linux を c4.xlarge EC2 インスタンスで貸し出せると仮定した架空の AWS のようなベンダの,一週間での利益を図示したものです(ただし,オンデマンドで貸し出せず,スポット市場3を通して貸し出すものとする).このインスタンスは 5000 を超える物理ノードで提供されると仮定します.さて,図8. の緑の線は,スポット市場で全部のノードが貸し出された場合の利益です.しかし,もし図7. の HPC ワークロードに全て貸し出し,残ったノードを仮想化してスポット市場に貸し出すのなら,赤の線がその利益となり,単純にスポット市場に全部貸し出すよりも 30 % も高い利益が得られます.同様にリアルタイムワークロードで考えると,青い線,50 % の利益向上が見込めるそうです4

まとめ

本稿で紹介した論文では,HIL をデータセンタの基本的な抽象層として導入しました.HIL は異なるハードウェアと仮想プロビジョニングシステムの下のレイヤとなるため設計され,サービス間の強力な isolation を提供することで,新しいデプロイサービスの導入をラクにし,また,異なるデプロイサービス間での資源の移動を効率的に可能にしました.また,HIL によって Hadoop 環境のベアメタルなデプロイサービスとしても動作可能であること,SLURM スケジューラを MaaS や Ironic,Emulab といったベアメタルプロビジョニングツール同様に導入可能であることを実証・議論しました.さらに,異なるサービス間で,サービスのキャパシティを移動させる事についての経済効果も明かにされました.現在(論文の提出された 2016 年 10 月現在)MOC で HIL が 2016 年 1 月より使われ,100 以上のユーザが日常的に使用しているようです.

本稿のまとめ

本稿では,HIL: Designing an Exokernel for the Data Center について紹介しました.実のところ Exokernel に関連する論文だと思ってとりあえず読みながら記事を書いていたのですが,途中でこれは Exokernel から着想を得ただけで分野違ったなーと若干後悔しています.しかしながら,同じシステム系でも OS アーキテクチャとデータセンタでのプロビジョニングは結構違う分野ですが,こうやって着想を得て活用されるというのはなかなか面白いですね.
Web でたまにマイクロサービスとかの話を聞きますが,システムでも機能単位やコンテナ単位で細分化して取り扱おうという試みが増えている気がします.データセンタでもこうやってクラスタを細分化して配分できるようにし,様々な構成で効率的に活用できる,というのは当然の流れかもしれません.個人的には libraryOS はそういった流れを実現するものとして注目しているので,今後も色々論文読んでいきたいと思います.

脚注:
†1:アウト・オブ・バンド管理:電源オフ,スリープ,休止状態や,何かの理由で OS が応答できない状況などの時,管理者が管理コントローラへ接続できるように何らかの措置を取る.
†2:10 GbE NIC を備え,デュアル 6 コア CPU(+ハイパースレッディング有効),128 GB RAM,ディスクは 1 つないし 2 つという構成.
†3:現物を取引する市場のこと.対義語は先物市場で,これは株や為替のような,将来のある時期に物を受け渡しする契約を結ぶ取引をする市場を指す(契約時点で物が手元になくても良い).
†4:c4.xlarge インスタンスの価格は Amazon EC2 の 2015 年 7 月 13―20 日に準じている.HPC のコストは AWS HPC のオンデマンドのコスト,リアルタイムワークロードのコストは 3.4 GHz Xeon E3-1270,8GB RAM のサーバを IBM SoftLayer で借りる場合のコストをそれぞれ仮定している

参考文献

^1 D. R. Engler, M. F. Kaashoek, and J. O’Toole Jr, “Exokernel: An Operating System Architecture for Application-Level Resource Management,” in 15th ACM SIGOPS Symposium on Operating Systems Principles, ser. SOSP ’95, vol. 1, Copper Mountain, CO, USA: ACM, Dec. 1995, pp. 251―266, ISBN: 0897917154. DOI: 10.1145/224056.224076. [Online]. Available: https://pdos.csail.mit.edu/6.828/2008/ readings/engler95exokernel.pdf.

2016年11月28日月曜日

Ansible 2.2.0 でホストごとに実行するタスクを切り替える

ansibleで実行対象を切り替える方法 http://tdoc.info/blog/2014/05/30/ansible_target_switching.html

このサイトを参考にしようと思ったのですが古くて現在に似わなかったのでメモ.

when: "'foo' in group_names"
inventory_host でグループ分けするところまでは同じ.
when で条件分けをするにあたって,
group_names はタスクを実行しているホストが所属するグループの配列になってるので,目的のグループに所属しているかどうかを in 演算子で確認する感じです.

2016年11月22日火曜日

フォントが埋め込まれていない PDF にフォントを埋め込む

表題通りです.

古い日本語論文を読むと,90 年代終わりから 00 年代初頭ぐらいのもので,
PostScript プリンタのフォントダウンロードを期待して Adobe 基本 35 書体と
Ryumin-Ligtht と GothicBBB-Medium を指定するが埋め込んでいない,
という PDF を見かけることがある.

ふつうは代替フォントが表示されて終わるのでなんでも良いけれども,
Mendeley の内蔵ビューワーであったり,ブラウザ内蔵ビューワーであったり,
そういう環境では埋め込まれていない和文フォントはそのまま表示できずに空白になる.

次のコマンドで GhostScript を使ってこれを解決.

$ gs -o font_embedded.pdf -sDEVICE=pdfwrite -dEmbedAllFonts=true -sFONTPATH="/usr/share/fonts/Type1:/path/to/your/font/dir" font_not_embedded.pdf
-o の後には出力ファイル名,最後の引数にしているのはフォントが埋め込まれていない,今回操作を行ないたいファイルへのパス.
言うまでもないけれども,-sFONTPATH="" には : 区切りでフォントへのパスを書く.

2016年10月31日月曜日

標準エラー出力を pipe で受け取る

たまに標準出力エラーについて加工したくなることがある.
しかし,単純に|を使っても出力は受け取られないので,加工に使うコマンドの標準入力は空のままである.
次のようにすれば良い.
$ mage? 2>&1 >/dev/null | magemge!
これは,一度標準エラー出力をリダイレクトして,標準出力に投げなおしているだけである.つまり以下でも同じことができる.
$ mage? 2> /dev/stdout 1> /dev/null | magemage! 

2016年9月14日水曜日

PS VIta をハックしよう

インロダクション

ずっとまえにこんな記事を書いた私がこのネタを逃すはずがなかった.
そもそも低レイヤに興味をもつ切っ掛けのひとつが PSP のハックシーンだったので,
そのハックシーンの人達がおおきく影響している PS Vita に興味がないわけがなかった.

その PS Vita だが,今年 2016 年の 7 月終わりになりにわかに動きを見せはじめている.

背景と経緯

以前は,PS Vita に内蔵されている PSP エミュレータについて,PSP のファームウェアのバグをつつく形で PSP の Homebrew を起動させることが主流だった.Homebrew はビールの自家醸造を指す単語だが,転じてハックシーンでは自作アプリケーションをコンソールゲーム機で動作させることをいう.PS Vita は PSP の反省からなのかゲームメディアもセーブデータなどを格納するメモリーカードも独自規格かつ暗号化されており,バッテリーを自分で取り外すことも不可能になっていた.
OS には *BSD ベースのものが採用されており(未確認.一部のソフトウェアスタックだけという話も.FreeBSD と NetBSD のふたつについてライセンスされている),ASLR も有効化されてるという.

だが,実はこの PS Vita に搭載されているブラウザのレンダリングエンジン,WebKit の改造版に exploit が存在しており,PS Vita でネイティヴに Homebrew が動作させられるらしい.

そんなこんなで去年登場したのが,Rejuvenate,若返りを意味するハックである.
Yifan Lu 氏によるハックで,PlayStation®Mobile 向けに作った Homebrew が未署名でも動作する.しかし,この PlayStation®Mobile のサービスは去年終了してしまい,Yifan Lu 氏もこの Rejuvenate の開発を停止した.なにより,導入が煩雑であった.

今回の手法

今回登場したのは,またもや Yifan Lu 氏による WebKit exploit で,その名前も
HENkaku(変革)である.
これはとても簡単で,ファームウェアバージョン 3.60 の PS Vita のブラウザで,
上記サイトにアクセスし install ボタンをタップすれば良い.
すると,PS Vita のホーム画面に,molecularShell というバブルが追加され,
VitaShell という PSPFiler を彷彿とさせるファイラーアプリが起動できる.
このファイラーアプリは FTP サーバを兼ねており,FTP を通して自作アプリを送りつければ何でもあそべる.
ちなみに,HEN (Homebrew ENabler) は PSP のハックシーンから使われている用語である.

実装

このハックの詳細は実は開発者が自らブログで詳解しており,PoC も載ってる.
JSArray というコレクションのソートをするメソッド内で toString() が使われており,
これにバグがあって任意コードを配置することが可能だったため,
任意コード実行脆弱性が発生したらしい.
しかも,どうやらカーネル exploit らしいという噂もある.

ちなみにこの穴はファームウェア 3.61 で即座に塞がれた.

バックアップゲーム

また,関連して,案の定というかゲームのバックアップとそれの起動手段が出現した.
これについてはゲームの海賊版を推進し,なおかつ PS Vita のハックシーンをあやうくし,
PSP のときのいたちごっこの再現になるので微妙なところである.
バックアップツールは Vitamin,Vitamin でバックアップしたゲームで使える,PSP のときのようなプラグインのサンプルが Amphetamine,ゲームをバックアップするときに Vitamin がアプリデータベースに注入するデータのコードネームが Morphine とまあ,
ネーミングセンスはあるけどクロい.
試してみた.
我が故郷島根を舞台にした角川ミステリーゲームのゲーム,「√Letter ルートレター」である.というかゲームこれしかまだもってない.
ちなみに,結果は起動に失敗.何かのモジュールが足りないようだ.libc.suprx など差し替えたりしてみると動くかもしれないらしいけどすくなくとも手元では失敗している.

なお,このツールは eboot.bin を復号する処理があるっぽいので少なくとも日本では限りなくクロである.試したものが動かなくてよかった.きっともう使わない気がする,使わないほうが良さそうだ.

開発ツール

Rejuvenate は PlayStation®Mobile を利用するため,Unity とか用意したりちょっと面倒だったらしい(試してない)べつに VitaShell なども動作してた模様. いまは開発停止してるが,https://github.com/psp2sdk といった SDK が当時からあったようだ.
が,今回については PSPSDK のときみたく VITASDK が出てきた.
https://github.com/vitasdk
GNU Toolchain でサクサクっと使えるようだ.
https://vitadev.github.io/
こちらの成果をつかえば,上記 SDK がビルド済みバイナリで簡単に入るみたい.
追加情報:

関連項目

PSP のハックシーンでは有名で,氏のサイトは重要な情報の集積地と議論の場になっている,wololo 氏によって PS Vita の Homebrew コンテストが今日から開催される模様.
コンテスト名,GekiHEN(激変).合計 $800 の賞金が準備されているそうです.
http://wololo.net/2016/09/13/announcing-gekihen-homebrew-contest-ps-vita/
コンテストのレギュレーションや詳細はこちら

本記事執筆時点では早速最初のエントリーがあらわれていた.名前は luaIrc で,
PS Vita が IRC クライアントになるものだ.Lua Player により実装されている.
PSP の Homebrew の初期も Lua Player でいろいろ実装がされていた.

まとめ

色々手を尽くしセキュリティを強化したコンソールゲーム機であっても,バグは無くならないので思いもよらないところから突破される.これはなかなか教訓的だなあと感じるとともに,しかしこういった盛り上がりに興奮を隠せない悪い自分がいるのも見つけてしまうのでした.いやしかし,またなんでもありな感じになってきてしまいましたね……
既に ゲームボーイアドバンスやニンテンドー DS のエミュレータ,DOOM などが移植されています.

VAIO Z(フリップモデル)に Arch Linux をいれる

自分のメインマシンである VAIO Pro 13 | mk2 が不慮の事故で一部破損したので,
実用上一切問題ない箇所だったが修理送りにした.

そこで,今研究室で貸与されている VAIO Z(フリップモデル)にVAIO Pro 13 | mk2 の環境を全部転送することにした.
ちなみに,もちろんデュアルブートにしてる.Windows 消すの勿体なく感じるんですよねぇ.びんぼーしょー.

以下,覚書


  • initramfs には nvme モジュールを含める.
  • btrfs の subvolume にしていた /home は,read-only で snapshot を作成して,btrfs-send で全部送ってやることで /home をそのまま新環境にそっくり移した.
  • その際に,mbuffer を使って転送した
  • 受け側は mbuffer の stdout を btrfs-receive が受ける
また,VAIO Z(フリップフロップモデル)は N-Trig の筆圧感知のタッチスクリーンとペンが付いている.しかし,Linux の X や Wayland はデフォルトではこれを使えない.
次のようにする.
これを /etc/X11/xorg.conf.d に配置しておくことで,ペンを認識するようになる.

最後に,自動回転についてだが,現状これに対応していない.
iio-sensor-proxy というツールを使えば自動回転に対応できるのだが,
そのためのセンサーのドライバがそもそも存在していないためである.
これは Intel Integrated Sensor Hub (Intel ISH) というデバイスのドライバが必要である.
このドライバは先頃 LKML にパッチが投稿,議論されており,ついには
https://lkml.org/lkml/2016/9/7/98
のとおりに hid/for-next のツリーにマージされた.
おそらく Linux 4.9 から使えるようになるだろう.

2016年8月18日木曜日

ビルドしたx86_64なPC向けの「lk」カーネルをQEMUで動かす

前回の記事の続き.

ビルドしたものはscripts/do-qemux86-6を付けると動かせる.
が,このスクリプトを走らせるとmakeでlkのビルドをしなおそうとする.

正直単にQEMUを起動するだけなので,次のコマンドをlkのプロジェクトディレクトリのルートで行なえば良い.
$ qemu-system-x86_64 -m 512 -smp 1 -machine q35 -kernel build-pc-x86-64-test/lk.elf -nographic
-enable-kvm -cpu hostを付けるとか-nographic外して-serial stdio付けるとか,-m-smpの後ろの数字変えてメモリ割り当てやVCPU数変えるとか,
scripts/do-qemux86で指定できるオプションでの引数の変更とかは勝手にすれば良いと思う.

Googleの新OS,Fuchsiaに使われてるらしいカーネル「lk」をx86_64なPCをターゲットにビルドしてみる.

表題の通りです.
レポジトリはここ
https://github.com/littlekernel/lk.git

まずは,
$ git clone https://github.com/littlekernel/lk.git
$ cd lk
ここで次のパッチをあてる.
このパッチは2つの変更から為る.

ひとつめ
arch/x86/toolchain.mkの25行目,FOUNDTOOLが,ifndef ARCH_x86_64_TOOLCHAIN_PREFIX の中にある.
これだとARCH_x86_64_TOOLCHAIN_PREFIXを自分で指定したら必ずビルドに失敗してしまう.
しかも,この変数はもし宣言されてない場合はx86_64-elf-をプレフィクスにしようとする.大半のPCのLinux環境ではx86_64-pc-linux-gnu-だろう.
ふたつめ
engine.mkGLOBAL_DEFINESHAVE_MREMAP=0を追加する. Linuxだとこの環境変数はデフォルトで1にされてしまい,external/lib/heap/dlmalloc/dlmalloc.cmremap(2)を使おうとするが, その実装がこのプロジェクト中に存在しないので,ビルドに失敗する.

加えて,次の修正が必要かもしれない.
binutilsの中でも,nm, c++filt, objdump, objcopy, size, ldのコマンドを使用するが,このlkのビルドシステムはARCH_x86_64_TOOLCHAIN_PREFIXで指定したツールチェインのプレフィクスがこれらコマンドについてる前提でビルドする. しかし,x86_64向けのbinutilsにプレフィクスがついたコマンド名のコマンドが入ってない場合も多い.その場合はlnコマンドとか使ってなんとかするしかない.

以上を修正したところで,次の通りに実行.
(ただしツールチェインのプレフィクスは自分の環境に合わせてください)

$ env ARCH_x86_64_TOOLCHAIN_PREFIX=x86_64-pc-linux-gnu- make pc-x86-64-test
これでビルドは完了

P.S. という指摘を貰う.ARMとかMIPSとかだけじゃなくてi386/x86_64もここのツールチェイン使うが正解っぽい. FOUNDTOOL変数の定義の場所は明かにバグっぽいけど,そもそもここのツールチェインダウンロードしてパス通してってやれば,普通にプレフィクスそのままでビルド通るだろうから気がつかなかったんだろな.

2016年7月12日火曜日

フレッツ回線の収容ビルとか障害情報とか

https://flets.com/customer/const2/

ここで自分の住所や電話番号から障害情報やどこのNTTビルに収容されてるか確認できる。
今知りました。

2016年6月25日土曜日

近年のTeXLiveでAdobe14書体を使う+日本語フォント埋め込み

Adobe書体の埋め込み

ちょっと前の情報だと,dvipdfmx -f dlbase14.map foo.dvi などとすれば良いとある.
しかし,最近は dlbase14.map はない.

また,usr/share/texmf-dist/dvipdfmx/dvipdfmx.cfgには
f pdftex.map
という項目があり,pdftex.mapupdmap-sys の結果の pdftex_dl14.map のコピーだった.
だが,デフォルトで,
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phv}
\renewcommand{\ttdefault}{pcr}
としても,実際に PDF に埋め込まれるのは URW のクローンフォントである.
本当に Times とかを埋め込むには,
# updmap-sys --setoption LW35 ADOBEkb
などとすると,/var/lib/texmf/fonts/map/pdftex/pdftex_dl14.map が書き換えられた.
べつに /usr/share/texmf-dist 以下とか見てなくて,/var/lib/texmf-dist のほうを見てる事にしばらく気がつかず.


日本語フォント埋め込み

デフォルトだと日本語フォントが埋め込まれなくて悲しくなる.というか読み辛い.
次のコマンドでプリセットのフォントマップをつかってくれる.
# kanji-config-updmap-sys auto
大抵の環境で ipa.map を使われると思う.指定できるのは次
hiragino, hiragino-pron, hiragino-elcapitan, hiragino-elcapitan-pron, morisawa, morisawa-pr6n, kozuka, kozuka-pr6n, ipaex, ipa, ms, yu-osx, yu-win, yu-win10
例えば Windows 10 で游書体を使いたいとかなら
C:\Windows\System32> kanji-config-updmap-sys yu-win10
とかすればいい感じにやってくれるはず.試してないけど.

とか書いておきながら,次の TeXLive 2016 ではデフォルトで IPA フォント埋め込みにしてくれるっぽいので知らなくてもいいかもしれない.

P.S.
https://gist.github.com/orumin/235888076da7932cd21e9b1f525d0ff9
 Adobe 14書体をごにょるやつ,ライセンス的にダメっぽいけど.

2016年6月21日火曜日

ちょっとスクレイピングの練習と,narou.rb

ちょっと最近Kindle PaperWhiteを書い直しまして,それと
小説家になろうをちらちらと読むようになった.
私はもともとしたらば掲示板にあるやる夫スレなどを読んでおり,それからすると小説家になろうの小説もまあまあ馴染みやすかったのでつい読んでしまう.

そこで,Kindleで素敵な組版で読めるといいなとおもったところ,
narou.rbの存在を知った.

しかしながら,(当然だが)既に商業化などに付き削除されてしまったものはnarou.rbじゃダウンロードも電子書籍化も不可能である.
だが,Web Archiveに生きている事は多々あり,これをEPUB3にして手元に保持しておきたいなあとか考え,次のスクリプトでnarou.rbで管理できる形に目次と小説本文をyaml形式で保存するスクレイピングスクリプトをつくった.

ぶっちゃけていうとこの素晴らしい世界に祝福を!のWeb版のEPUBをコレクションしておきたかったというわけです.

以下,成果.
RubyもNokogiriもあまりよくわかってないのでイテレーションが非効率な気がするが,まあそんなに問題ないとおもう.


Raspberry PiでH.264エンコード

かつて Raspberry Piでh264動画をハードウェアエンコードする という記事の後に
(録画をWindowsのEPGDataCap_Bonでやって録画マシンと違い常時起きてるRaspberryPiにファイルを貯めていくという構成だったので)Raspberry PiでMPEG2-TSをH.264にしようとしてた事があった.その記事の主に,いくつかこちらでわかった事をブログにまとめるといいながら1年半ブログに書いていない事に今気がついてしまった.
忘れないうちに書きます.いまさらこの情報役に立つかなあ…….

2,3日試行錯誤してたと思うのだけどその結果がこちら.
このスクリプトです.MPEG2のハードウェアデコードのライセンスを買う必要あり.
最初に紹介した記事最後で,エンコードした動画がカクつくという記述があったが,
あれは彼のパラメータ指定がわるくって,H.264のGOPがやたら小さいとどんなマシンでも
デコードの負荷が異常になって再生がおっつかなくなるという話だった.
RaspberryPiのハードウェアエンコーダ(OpenMax)向けのgstreamerプラグイン(gst-omx)では,
periodicty-idrでIDRフレームの間隔を指定できるので,元動画のフレーム数の10倍ぐらいに指定しておけばいいとおもう.アニメなら240ぐらい?
GOPが大きすぎるとシーク位置があまりにも飛び飛びになる上に,動き予測を失敗して本当にひどい動画が出来上がる.

それと,どうやらgst-omxはBフレームとか使えないっぽいので,quant-b-framesとかのパラメータは指定できないようだし,参照フレーム数は1で固定の模様で,さらにデインターレースやリサイズ,平滑化といった処理はどれもCPU処理になるのでこれらをやらせようと絶望的な速度になるようだ.加えて,interval-intraframesでI/IDRフレームの挿入頻度を決定してて,動きの多い部分で増やして,そうじゃない部分では減らすとかないので,ファイルサイズがそんなに小さくならない.
また,音声部分について,aacparse + avdec_aacはなぜか失敗するので,gstreamerのbadプラグインだったかuglyプラグインだったかを追加して,mpegaudioparse + madを用いて再エンコードしている.非効率だしよくないなあ.

追記:
RaspberryPi 3 をh264動画変換サーバにする(ハードウェアエンコーダをgstreamerで使う) - min117の日記
という記事をみつけたのだけどこの人がハマってるエラーはたぶん私が上述のスクリプト作るにあたってハマったエラーど同じ.
録画データがソースなMPEG2-TSはStream IDとか指定しないとエラーになる.
なぜなら,録画データは複数のストリームをもってるからである.
上のスクリプトに付いたコメント(Gistのコメント欄です)にはMenuIDあるならSID指定しなくていいって書かれたけどなんかそれはうまくいかなかった気がするけどいかんせん1年半前の事なのですっかり覚えていない.
だれかつっこみor検証たのみます

2016年5月20日金曜日

Kindle端末のフォントを筑紫明朝から別のフォントに差し替える

初代PaperWhiteなどは自由にフォントを追加できるようですが,
最近のKindle端末はそれが出来なくなってるようです.
しかし,筑紫明朝のファイルの中身を差し替えると好きなフォントにできるようでした.

Kindle端末の/system/fonts/ja.fontはcramfsで作られたファイルシステムイメージのようです.

この差し替え作業,面倒なのでスクリプトにしました.

これを使うためには
  1. Linuxで,かつgvfsが使える
  2. gvfsでKindleをマウントしている
これらを満たしている場合に,引数に差し替えたいフォントへのパスを指定し実行すると,
なんやかんややってフォント差し替えをしてくれます.


ちなみに紹介すると,やってることは,cramfsを展開し,ファイルを差し替え,cramfsを作りなおし,足りないサイズをzero fillで足し,ctimeをオリジナルに合わせる,というだけです.

2016年4月29日金曜日

Rump Kernelをつかってみる

RumpはNetBSD Runnable Userspace Meta Programの略である[1].
BSDCan 2009の論文を読むとRumpはNetBSDのカーネルをユーザランドにもってきて,
例えばネットワークをカーネルスタックをバイパスしてユーザランドにもってきた
スタックで処理してスループットを上げたりするもの,と解釈していた.

しかし,調べるとどうやら,単にユーザランドで使えるLibraryOSとしてだけではなく,
Type1ハイパーバイザ上で直接動作するコンテナとしても使えるLibraryOSのようだ.
Xen PVやVirtioのドライバが実装されているらしい.

そこで,Rump Kernelを使ってみたメモ.

experimentalなものらしいが,rumprunというのを使ってみる.
これをつかうと簡単にRump Kernelを含むイメージファイルの作成・起動ができるらしい.

準備

$ git clone http://github.com/rumpkernel/rumprun
$ cd rumprun
$ git submodule update --init
$ ./build-rr.sh hw
これでrump kernelのツール一式とライブラリがビルドされる.
build-rr.shにhw以外を渡してクロスビルドもできるっぽい.

ここでは,x86_64なLinuxの上で作業したと仮定します.
次に環境設定.
$ export PATH="${PATH}/$(pwd)/rumprun/bin"
$ export RUMPRUN_TOOLCHAIN_TUPLE=x86_64-rumprun-netbsd
これで,x86_64-rumprun-netbsd-gccなどRump kernelをlinkしてビルドしてくれるツールチェインへのPATHが通る.

では次はアプリケーションをビルドしてみよう.

アプリケーションビルド

$ git clone http://github.com/rumpkernel/rumprun-packages
$ cd mysql
$ make
bin/mysqldとしてビルドしたアプリケーションが置かれる.
ただし,images/data.ffsとしてファイルシステムイメージが UFSで作られるので,事前にNetBSD由来のmakefs(8)が必要.
# apt-get install makefs
私はArchLinuxユーザなのでdebtapを用いてmakefsの.debをArchLinuxパッケージに変換した.
次に,これを仮想環境が読めるイメージファイルに変換する.
$ rumprun-bake hw_virtio bin/mysqld.bin bin/mysqld
これで,virtioドライバ付きでRump KernelにリンクされたMySQLのイメージがbin/mysqld.binに焼き込まれた. ちなみに,hw_virtio以外に選べるコンフィグは次の通り
$ rumprun-bake list

!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!

xen_pv : Xen with paravirtualized I/O drivers
xen_pci : Xen with paravirtualized and PCI I/O drivers
hw_virtio : virtio targets (e.g. QEMU/KVM)
hw_virtio_scsi : virtio targets with SCSI (e.g. QEMU/KVM)
hw_generic : generic targets, includes (almost) all drivers
準備は整ったので,使用してみる.

使ってみる

まずtapを生やす.
# ip tuntap add tap0 mode tap
# ip addr add 10.0.0.1/24 dev tap0
# ip link set dev tap0 up
次に,rumprunコマンドで実行する.
$ rumprun kvm -M 128 -i \
-b images/data.ffs,/data \
-I if,vioif,'-net tap,script=no,ifname=tap0' \
-W if,inet,static,10.0.0.10/24 \
-- \
bin/mysqld.bin \
--defaults-file=/data/my.cnf --basedir=/data --user=daemon
これでMySQLデーモンサーバがRump Kernelで起動する. ホストのほうから,
$ mysql -h 10.0.0.10 -u rump
だの
$ mysqladmin -h 10.0.0.10 -u rump status
だのして遊べる.

おわりに

rumprunコマンドのusageは次の通り.
$ rumprun
!!!
!!! NOTE: rumprun-bake is experimental. syntax may change in the future
!!!

usage: rumprun [script args] PLATFORM [guest args] APP [ -- ] [app args]

PLATFORM is the rumprun runtime platform to use
ec2 : create directory with contents necessary for a Amazon EC2 AMI
iso : bake app and config into a bootable iso image
kvm : hw guest via qemu -enable-kvm
qemu : hw guest via qemu -no-kvm
xen : xen guest via xl(1)

APP is the binary to rumprun. app args are processed by APP.

script args are:
[-h] [-DS] [-t tmpdir] [-T tmpdir]

-h display this message

-D dump backend commands instead of running them
-S execute sudo where potentially necessary
-t use tmpdir as dir for temp files (default: /tmp/rumprun.XXXXXXXX)
-T same as -t, except do not remove temporary directory

guest args are:
[-dip] [-b blkspec] [-D port] [-e VAR[=VALUE]] [-g args]
[-I iftag,ifopts] [-M mem] [-N name] [-W iftag,netspec]

-b configures a block device. The format of "blkspec" is:
hostpath[,mountpoint] where:
hostpath = image that is passed to the guest as a block device
mountpoint = if "hostpath" is a file system image, mountpoint on guest
-D attaches a gdb server on port to the guest
-d destroys the guest on poweroff
-e set environment VAR to VALUE
-g specify 'args' to guest. handling, if any, is guest-dependent.
-I create guest network interface and attach the user-specified
iftag to it. the format is:
iftag,ifbasename,[backendopts]
e.g. -I 'qnet0,vioif,-net tap=/dev/tap0'
-i attaches to guest console on startup
-M set the guest's memory to mem megabytes, default is 64
-N set the guest's name to name, default is rumprun-APP
-p creates the guest but leaves it paused
-W configure network interface new style, where "netspec" is
inet,dhcp - IPv4 with DHCP
inet,static,addr/mask[,gateway] - IPv4 with static IP
inet6,auto - IPv6 with stateless autoconfiguration
e.g. -W qnet0,inet,static,1.2.3.4/24

すごい,なんとXenとKVMだけじゃなくてbootableなisoに焼いてみるとか(もしかしたらrumprun-bake hw_genericをつかえばbaremetal起動できる?)
EC2 AMIイメージをサクっと作れてしまう.
それに,rumprun-pacagesレポジトリはMySQLだけじゃなくてnginxやらなんやら結構充実している.memcachedやLevelDBもあるようだ.

ここまでで思ったのは,rumprun-pacagesのアプリの種類だとか,
複数のVMMで起動できたりEC2 AMIがカンタンに作れたり,

とってもこれOSvに近くない?

という感想を抱いた.
なんというか,おもったより実用に近いもののようだ.

これからどういう方向に進んでいくのかもちょっと気になるなあというところ.

P.S.
関連でLKLを使おうとしてるけどビルドがコケて悲しい

参考文献:
^[1]: KANTEE, A. Environmental Independence: BSD Kernel TCP/IP in Userspace. In Proc. of AsiaBSD-Con (2009), pp.71–80.

2016年4月22日金曜日

IIJmioのひかりコラボ,「mioひかり」でIPv6 IPoE

そういえば最近関西から関東に引越しました.

で,IIJmioのMVNOサービスを使ってたので,安さに目が眩んで,
回線+ISPにmioひかりを選びました.

これはサービスインの時のてくろぐさんの記事で,
IPoE方式によるIPv6接続、DS-LiteによるIPv4接続への対応を検討しています。対応時期などは未定です。
とあったので, それへの期待も込みでした.

そこで昨日,mioひかりでもIIJmio FiberAccess/NF同様にIPv6 IPoEとDS-Liteが
オプションで使えるというプレスが出たので,早速申し込みました.
IIJmioひかりにおけるIPoEオプション提供開始のお知らせ
料金は月額800円

私の場合,IIJmioの紹介割引x2と春のスタートアップ割引とmio割(MVNOとのセット割引)
があったので,まあ月額800円でもお釣りが来るかな,とおもって迷わず申し込みました.

ちなみに,今ならIPoEオプションの最初2月は無料だそうです.

これが昨日の11時30分,申し込み受け付けのメール.

そして19時間10分後の今朝6時40分のメール.
メールではサービス開始が明日の日付になってますが,
このメールの来た時間に丁度DNSが引けなくてネットワークが不通になりました.

理由は,私がGentooでルータを作ってるため,IPv6 PPPoE(net.ppp1)が切れた時点で
依存サービスのdnsmasqが停止して,家のLAN内のマシンが一斉にDNSが引けなくなったため.

一般的なブロードバンドルータつかってたり,
DNSキャッシュサーバを建てずに直接DNSサーバとしてISPのサーバを指定してたらネットワークが不通になるなんてことはないです.(そのはず)

で,ルータのWAN側のポートにRAされたPrefixでアドレス生やしてとりあえずgoogleとかにping6したら,疎通できました.

ということで自宅もIPoEなv6が使えるようになりました.

しかし,ルータでRA Proxyするまでは良いのですが,
そのアドレスでLANから外に繋がらないので,ip6tablesのルールが間違えてる気がします.

とりあえず,以下ポインタ

OCN IPv6 の非固定prefixを配下のルータで使う
この記事最後にrdiscでRAを受けて,radvdのconfigを生成するスクリプトが紹介.
このスクリプトの後にradvdを起動して,ip6tablesでforwardルールを書けばいけるはず(と思ったんだけどなあ)
(そのスクリプトのレポジトリへのリンクはコレ)

仙石浩明の日記 IPv6(2)
Linuxでブルータ(IPv6 ブリッジルータ)を組むときのノウハウ.
もしかしてip6tablesでeth1からeth0にforwardして〜とかじゃなくてブリッジする必要あるのかなあ.

LinuxでIPv6ルータで/64プレフィックスを無理やり/72などに分割してみた
いままで/56のprefixをDHCPv6-PDで受けてたけど,ひかり電話契約がないので
/64になってしまって,サブネットの扱いどうしようかなあとおもってたら発見.
下位64bitのとこでがんばってサブネット切れるんですね.
後々の参考にしたい.

2016年4月6日水曜日

おるみんマイグレーション - 洗濯機扁

実は居を関西から関東に移しました.

以前は寮(というとちょっと語弊があるかも)に住んでいたので,
生活用品がほぼゼロで越してきたのでちょっと四苦八苦.

実家で昔単身赴任に使われ現在腐らせてる白物家電を送ってもらったのですが,
以前の使用者の片付けが非常に悪く(これは愚痴です),洗濯機の脚スペーサーがひとつ欠けており水栓つぎてと説明書が消失しておりました.

新居の洗濯機用蛇口は通常の蛇口だったので,
この際と思い(というか以前の洗濯機使用者たる父が,「水栓つぎてで既存の蛇口を傷めるより別の蛇口にせよと頑強に主張したのもあるのですが),蛇口を交換してみることに.

過程を書くのは備忘録と,かつて一度だけDIYという記事タグを使ったことを思い出したためです.

使ったもの:



TOTOのTW11Rとシールテープです.

このTW11Rは大変素晴しく,給水ホースが簡単に取り付けられる上に止水弁があります.
ホースが抜けても水がだばだばしません.
それに,バルブは45度回すだけで開栓できる構造です.

取り付け方:

まず元栓を閉めにいきます.だいたい玄関の外の水道メーターの近くだとか,
アパートの1階の基礎部にまとめて並んでるとかです.

次に,既存の蛇口を外します.


このようなレンチを使っても良いかもしれません.私はえいやと筋肉で外しました.
外したところには,以前のゴミや錆びがたくさん付いてるので使い古しの歯ブラシなどでキレイにしましょう.

その次は,とりあえず蛇口を取り付けてみます.
だいたい5回ほど回すと閉まると思うのですが,この時の回す回数を記録して蛇口はまた外します.

そして,実際の取り付けにかかります.

蛇口のネジ部にシールテープを5,6周巻き付けます.
シールテープは粘着性がないので,軽く引っぱりながらしっかり巻き付けます.
巻き付け終わったら指でおさえて更にくっつけます.

そして,取り付けます.(先程記録した回数-1)回ほど回すようにしましょう.
回すとき,回しすぎたとおもって逆方向(緩める方向)に回すといけません.
回しすぎた時は取り外して取り付け部も蛇口のネジもシールテープをキレイに除去し,
シールテープ巻き付けから再開します.
そうしないと水漏れするからです.

以上で,単水栓の取り付けは完了です.


なお,余談ですが私は蛇口を取り付けたとき締めすぎたとおもってやりなおそうとしたとき,
蛇口が締まりすぎた為にザルボ毎外れてしまい蛇口とザルボが外れませんでした.
退去の時は水栓レンチかザルボ買うほうが良さそうですね……

もうひとつ余談.

排水ホース長すぎたので溝部の先端でちょん切って排水エルボとスリーブを取り付けなおしました.これは説明するほどの事でもなく簡単でしたね.

2016年3月30日水曜日

CentOSを複数台のUEFIなホストにインストールするときPXEでうまいことやるやつ

どこかにメモをしようとおもったけどブログの記事をまるで書いてないのを思いだしました.

CentOS 7.2前提

1. CentOSのisoイメージをダウンロード

2. /mnt/centosにisoイメージの中身を全部そのまま配置

3.

次を実行
$ mkdir -p /var/tmp/tftpboot
$ cp /mnt/centos/EFI/BOOT/grubx64.efi /var/tmp/tftpboot/
$ cp /mnt/centos/images/pxeboot/{vmlinuz,initrd.img} /var/tmp/tftpboot
(もしかしたらgrubx64.efiは/mnt/centos/Packages/grub2-efi-なんとか.rpmを解凍してgrubx64.efiを取り出さないといけないかも)

4.
これを/etc/dnsmasq.confにする.
enp8s0は自分の環境のインターフェース名に変える.

5.
/var/tmp/tftpbootに次の中身でgrub.cfgを作成

6. kickstartのコンフィグファイルをks.cfgという名前で/mnt/centos/に配置


7.
# darkhttpd /mnt/centos
# systemctl start dnsmasq


これで自動でPXE Bootして,Kickstartでインストールしてくれるはず.
もしKickstartを使わず手動インストーラをぽちぽちするならば,
2.で/mnt/centosにファイルを配置とかじゃなくてisoを直接マウントして,
grub.cfgのカーネルコマンドラインからks=の部分を削除すれば大丈夫です.