ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

mrubyのバイナリコマンドをGitHub Actionでリリースする

あけおめ!

去年やってブログに書き忘れたことをほそぼそ書くシリーズ。


help.github.com

  • mrubyのプロジェクトでCIでビルド・テストを回したい
  • バイナリを作成するツールなので、バイナリのリリースも自動でやりたい

こういう時の設定例です。

続きを読む

CRIUをラップしてより簡単にプロセスのチェックポイント/リストアをするツールを作った話

Linux Advent Calendar 2019 12日目の記事です。

qiita.com

今日はCRIUに関わる自作ツールの話をします。

CRIU って?

Checkpoint and Restore In Userspace の略で、プロセス(や特殊なプロセスであるところのコンテナ)の動いているメモリ状態などをイメージにダンプし、またそのイメージからのリストア起動を実現するLinux向けのツールです。

詳細は、 TenForward さんの記事が詳しいです。

gihyo.jp

任意の状態のプロセスのセーブポイントや、 kvm などでいうライブマイグレーションのような用途での利用を想定しているようです。

で、この技術、やれることはとても魅力的なのですが、使い方がかなり難しいことでも有名です。

雑にプロセスを立ち上げてそのPIDをダンプしようとしてもエラーが出たり、

$ sudo criu dump -t 25010             
Warn  (compel/arch/x86/src/lib/infect.c:280): Will restore 25011 with interrupted system call
Warn  (compel/arch/x86/src/lib/infect.c:280): Will restore 25018 with interrupted system call                              
Error (criu/tty.c:1859): tty: Found dangling tty with sid 5228 pgid 25010 (pts) on peer fd 0.
Task attached to shell terminal. Consider using --shell-job option. More details on http://criu.org/Simple_loop
Error (criu/cr-dump.c:1743): Dumping FAILED.

言われた通り --shell-job をつけてもリストアでまたエラー。

$ sudo criu dump -t 25010 --shell-job
Warn  (compel/arch/x86/src/lib/infect.c:280): Will restore 25011 with interrupted system call
Warn  (compel/arch/x86/src/lib/infect.c:280): Will restore 25018 with interrupted system call
$ sudo criu restore
 25058: Error (criu/tty.c:412): tty: Found slave peer index 1 without correspond master peer
Error (criu/cr-restore.c:1457): 25058 killed by signal 9: Killed
Error (criu/cr-restore.c:2333): Restoring FAILED.
$ sudo criu restore --shell-job
pie: 25058: Error (criu/pie/restorer.c:1811): Unable to create a thread: 25060
pie: 25058: Error (criu/pie/restorer.c:1951): Restorer fail 25058
Error (criu/cr-restore.c:1454): 25058 exited, status=1
Error (criu/cr-restore.c:2333): Restoring FAILED.

エラーも見慣れないもので何もわからん...。ちなみに、ホストのプロセスをダンプする場合、 PID含めて リストアしようとするため、そのPIDがすでに別のプロセスに取られていた場合そもそもリストアができない(回避方法はないようです...)などの問題もあります。

また、 images-dir などの必要な設定など、いろいろな規約を自分で決めたり、ちょっと触りたいだけではなかなか面倒な印象を持つかもしれません。

やりたいことは普通にプロセスの状態のスナップショットをとって、戻したりしたいだけなのに...。

LXD のような場合は実は標準の checkpoint コマンドを経由することもできますが、「普通にVMで立ち上げてるアプリやプロセス」の場合は周辺の準備が面倒そうですよね。CRIUは基本的に非常にレイヤの低いオプションやAPIを提供するので、現実の用途のためには色々とラップする必要が出てきます。

ということで、普通のプロセス向けに、こういうツールを書いています。

github.com

続きを読む

参照先を更新する関数をPython/Rubyのffiで扱うには

諸事情Python の ctypes のコードを Ruby の fiddle に移植しているんですが、どちらもだいたい同じことができる、一方APIなどの設計思想が違う、みたいな感じで興味深いです(興味深い)。

今回ctypesで普通にやるような、「参照先を更新する関数」の呼び出しがfiddleの場合ちょっと癖があったのでメモ。

続きを読む

Rubyアソシエーション 開発助成金2019 の応募内容を公開します

この記事はCfP Advent Calendar 2019の9日目です!

adventar.org

1日勘違いしていました!


カンファレンスではないですが「Rubyアソシエーション 開発助成金2019」への応募内容をここで公開します。って、していいものなのでしょうか...「アウトプットを期待」とのことだったのできっと大丈夫!

www.ruby.or.jp

現在、YARV開発者の笹田耕一さんをメンターに迎えて、RubyLinuxの高機能トレス技術 eBPF のライブラリである BCC を使えるようにすべく移植実装と、+アルファの考え中です。それが RbBCC プロジェクトです。

github.com

将来は iovisor プロジェクトに寄贈したいと考えてもいるんですが、まずは完成度を上げねばという感じです...。

で、このRubyアソシエーション 開発助成、毎年なかなか募集に苦労している印象があり、一つはどういう感じで出せばいいかという情報が少ないのはあるのかな〜と思っております。次回の応募数増に寄与すべく、一番肝であろう「プロジェクトの詳細」の応募時の内容をここに公開します。

続きを読む