Software Design 2015年 2月号: BPF, seccomp, tinyconfig

 

 

Software Design 2015年 2月号 に記事を書きました。

「第35回 Linuxカーネル観光ガイド」で、 seccomp フィルタ、 bpfシステムコール、そして Linux カーネルの新しい config 方法である tinyconfig について書きました。

日経Linux 2015年 2月号: Btrfs の機能はどうやって実現されてるの?

 

日経 Linux (リナックス) 2015年 02月号

日経 Linux (リナックス) 2015年 02月号

 

 日経Linux 2015年 2月号 に記事を書きました。

「第6回 カーネルハッカーがやさしくひも解くLinux ファイルシステム」として、Btrfs の実装について解説しました。ちなみに次回最終回です。

org-mode でポスター作成

ふええん、 Office なんて使えないよう Windows インストールするのめんどいよう、なのでポスターも Emacs org-mode で作成する。基本的に beamer, beamerposter を使えばよい。 テンプレートとしてはこんな感じになる。

#+TITLE: ほげふが
#+AUTHOR: ほげもが
#+DATE:
#+OPTIONS: H:1
#+BEAMER_COLOR_THEME:
#+BEAMER_FONT_THEME:
#+BEAMER_HEADER: \usepackage[orientation=portrait,size=a1,scale=1.4]{beamerposter}
#+BEAMER_HEADER: \setbeamertemplate{navigation symbols}{}
#+BEAMER_HEADER: \usepackage{type1cm}
#+BEAMER_HEADER: \usepackage{mathptmx}
#+BEAMER_HEADER: \usepackage{tikz}
#+BEAMER_HEADER: \renewcommand{\kanjifamilydefault}{\gtdefault}
#+BEAMER_HEADER: \usepackage{setspace}
#+BEAMER_INNER_THEME:
#+BEAMER_THEME: RJH
#+BEAMER_COLOR_THEME: 
#+LATEX_CLASS: beamer
#+LATEX_CLASS_OPTIONS: [compress,dvipdfmx,fleqn,serif]
#+LATEX_HEADER:
#+LATEX_HEADER_EXTRA:
#+DESCRIPTION:
#+OPTIONS: toc:nil ^:nil
\setstretch{0.3}
* 
:PROPERTIES:
:BEAMER_OPT: t
:END:
** 
\setstretch{1}
\normalize
:PROPERTIES:
:BEAMER_COL: 0.49
:BEAMER_OPT: t
:END:
*** 左側ひとつめ
なんたらかんたら
*** 左側ふたつめ
なんたらかんたら
** 
:PROPERTIES:
:BEAMER_COL: 0.49
:BEAMER_OPT: t
:END:
\setstretch{1}
\normalize
*** 右側ひとつめ
なんとかかんとか
*** 右側ふたつめ
なんとかかんとか

大事なのは

  • #+BEAMER_HEADER: \usepackage[orientation=portrait,size=a1,scale=1.4]{beamerposter}
    • A1の縦長にする
  • #+BEAMER_HEADER: \setbeamertemplate{navigation symbols}{}
    • 下の navigation とかを消す
  • #+BEAMER_THEME: RJH
    • beamer のテーマ
  • :BEAMER_OPT: t
    • 上に寄せる
  • :BEAMER_COL: 0.49
    • 二段組

RJH テーマはここ
Making a poster in beamer | Hyndsight


あとは適当に setstretch で調整する。

Software Design 2015年 1月号: DRMとrender nodeについて

 

  

Software Design 2015年 1月号 に記事を書きました。

「第34回 Linuxカーネル観光ガイド」で、 Linux で画面描画を行なう DRM の仕組みと最近デフォルトで有効になった render node (/dev/dri/renderD128)について書きました。 libdrm を使って画面に色を出したりなどしています。

 

dockergentoo: Gentoo のバグを再現可能にする

たとえば Bug 532188 – app-i18n/ibus-anthy should depend on dev-python/pygobject といったバグがあるのだけれど、こういうバグはなかなかやっかいで、手元でテストするともともと dev-python/pygobject が他からの依存で入っているためにうまく再現できなかったりする。

しかも、このバグの場合コメントにあるように

Given the deptree, this can only happen if you didn't set gtk3 useflag on ibus

gtk3 の USEフラグ次第で結果が変わってしまいそうだ。

クリーンな環境でテストすると言うとまず VM が思いうかぶ。だが、そのVMもテストによって「クリーン」ではなくなる。初期の stage3 でスナップショットをとっておいて戻すという方法もあるが、 stage3 内のパッケージや Portage ツリーを更新するという必要もでてくる。しかも、 Gentoo だしなにかのパッケージをテストするためにフルスクラッチコンパイルが走ったりして時間がかかってマジかよという状態になる。

まとめるとクリーンにテストして、 Gentoo の依存関係のバグを再現可能にするには、以下の性質を満たしてほしい

  • stage3 は最新 (毎週更新される)
  • Portage ツリーは最新 (毎日更新される)
  • 一度ビルドしたパッケージはなるべくビルドしたくない
  • でも、パッケージにUSEフラグの設定とかはしたい

こんなのを VM でポータブルに作ろうとするとめっちゃ大変そうなのだが、 Docker を使って実現できた。 最近は手元でこれを使って、おおたしかにこのUSEだと通るけど、こっちだと通らんわーとか再現するのに使って捗っている。

naota/dockergentoo · GitHub

たとえば冒頭のバグだと

$ ~/repo/dockergentoo/bin/build-package.sh 'gtk+ +X' ibus-anthy
(ビルドが走って通る)
$ ~/repo/dockergentoo/bin/build-package.sh 'gtk+ +X ibus -gtk3 +deprecated' ibus-anthy
(ビルドがこける)
The result put into result/15014

となって、 ibusのUSEフラグが"-gtk3 +deprecated" だと ibus-anthy がこけるんだなあということがわかる。しかも、 ~/repo/dockergentoo/result/15014 の下に portage.tar.xz というファイルができていて、ここに /var/tmp/portage が圧縮されて入っている。

USE編集する以外にも、自分の書いた ebuild をoverlayとしてつっこめたりべんりな機能があるので活用してほしいところ。詳しくはスライドやGitHubを参考に。

世の中にはいっぱいバグがあるので、将来的にはジョブキューイングとかしてビルド結果が出たらぴょこんと通知が出る -> 新たなUSEでジョブ投入してコーヒーを飲むという感じでバグ処理のいらん手間を省けるやつも作っていきたい。

"Multiple package instances"によるemergeの失敗への対処

emerge -uDN するとこのようなエラーが出てすすまないことがある。

!!! Multiple package instances within a single package slot have been pulled
!!! into the dependency graph, resulting in a slot conflict:

dev-libs/icu:0

  (dev-libs/icu-53.1:0/53::gentoo, ebuild scheduled for merge) pulled in by
    >=dev-libs/icu-51.2-r1:=[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_ppc_32(-)?,abi_ppc_64(-)?,abi_s390_32(-)?,abi_s
390_64(-)?] required by (media-libs/harfbuzz-0.9.35:0/0.9.18::gentoo, ebuild scheduled for merge)



  (dev-libs/icu-52.1:0/52::gentoo, installed) pulled in by
    >=dev-libs/icu-50:0/52= required by (app-text/texlive-core-2014-r1:0/0::gentoo, installed)
                     ^^^^^^

いろいろごちゃごちゃ出てるけど、まず 注目するポイントは"(dev-libs/icu-53.1:0/53::gentoo, ebuild scheduled for merge)" と "(dev-libs/icu-52.1:0/52::gentoo, installed)"の2個所になる。一方が dev-libs/icu-53.1 を要求し、もう一方が dev-libs/icu-52.1.0 が要求しているので emerge を進めることができない、ということになる。

次に重要で問題を解決するために必要なのが、何がそれらの要求を出しているのかということになる。 "required by" に注目しよう。 dev-libs/icu-53.1 は "required by (media-libs/harfbuzz-0.9.35:0/0.9.18::gentoo, ebuild scheduled for merge)" と書かれている。 "ebuild scheduled for merge" から emerge しようとしている media-libs/harfbuzz-0.9.35 によって、 dev-libs/icu-53.1 が要求されていることがわかる。dev-libs/icu-52.1 は "required by (app-text/texlive-core-2014-r1:0/0::gentoo, installed)" とあるから、 インストールされている app-text/texlive-core によって dev-libs/icu-52.1 が要求されていることがわかる。

texlive-core は ">=dev-libs/icu-50:0/52=" という形で、 dev-libs/icu に依存している。 マークが付いている ":0/52=" に注目する。 これは Sub-Slot dependency によるもので、emerge 時に依存するライブラリのバージョンを使ってパッケージの依存関係を書きかえる機能によるもの。すなわち texlive-core が dev-libs/icu-52.1 に対して emerge されたので texlive-core の依存が dev-libs/icu-52.1 に依存するように書き変えられたということになる。

結局、解決手段は texlive-core もビルドすることである。texlive-core がビルド対象になることで、 ">=dev-libs/icu-50:0/52=" の依存が再度書きかえられ、 dev-libs/icu-53.1 に対応したものになる。

texlive-core もビルドするには "--reinstall-atoms" を使う。"emerge -uDN world --reinstall-atoms 'texlive-core'" によって、 "-uDN world" と供に texlive-core がリビルドされる。こういった問題が複数のパッケージで起きる場合には "--reinstall-atoms 'texlive-core ghc'" などのように空白区切りで指定できる。