カーネル/VM Advent Calendar 一日目: eventfd, timerfd, signalfd

ひ、日付? な、なんのことです…!?

最初はfutex()とかカーネルの変更でpostgresqlが遅くなったとかの話をからめようかと思ってたんですがfutex()調べてたらどんどん大きくなってしまったので今回はスキップして(そのうちあるであろう)2回目にまわしとくことに。

ということで、今回はfutex()から似たところ?で、 epoll, kqueue, *fdあたりを簡単にまとめてみようと思います。

select

まずはselect()のおさらいを。

こんなふうにサーバにクライアントが5つぶらさがっています。クライアントは常時接続はしていますが、ずっとサーバと通信しているわけではありません。時々サーバにリクエストを投げ、サーバは適宜リクエストに応答します。サーバはsocketを作ってクライアントと通信をしています。

言うまでもないことですが、こんなコードではうまく動きません。

for(;;){
  for(i=0; i < NCLIENTS; i++){
    recv(sock[i], buf, len, 0);
    ...
  }
}

クライアント0 からのリクエストを待ってblockしている間に、他のクライアントからのリクエストが来ても全く応答することができません。

かといって、MSG_DONTWAIT を使ってnon-blockにしてsleepするようにしても効率はよくありません。

for(;;){
  for(i=0; i < NCLIENTS; i++){
    recv(sock[i], buf, len, MSG_DONTWAIT);
    ...
    sleep(1);
  }
}

そこで select() を使います。

fd_set rfds;
FD_ZERO(&rfds);
for(i=0; i < NCLIENTS; i++)
  FD_SET(sock[i], &rfds);
while(select(nfds, &rfds, NULL, NULL, NULL) > 0){
    ...
}

rfdsというファイルデスクリプタの集合にsocketを登録し、select()を呼び出すと(この場合は) 読みこみができる状態になったファイルデスクリプタの数を返してくれます。

すぐに読みこみ可能なファイルデスクリプタが存在しない場合には、どれかが読みこみ可能になるまでblockします。なので、select()が返ってきたところで適宜クライアントのリクエストに応答していけばいいわけです。

epoll

さて、select()ではファイルデスクリプタの集合をユーザランド側で管理しています。これを毎回 select()でカーネルに渡し、カーネル側では呼び出されるごとに、このファイルデスクリプタの集合をスキャンしています。 この実装ではファイルデスクリプタの数が増えていくと、どんどんとselect()の処理は重くなっていきます。

そこでLinuxでは epollというシステムコールを使います。

int epollfd = epoll_create(10);
ev.events = EPOLLIN;
ev.data.fd = sock[i]
epoll_ctl(epollfd, EPOLL_CTL_ADD, sock[i], &ev);
while(epoll_wait(epollfd, events, 10, -1) > 0){
    ...
}

epollでは epoll_createを使ってカーネル側に監視するファイルデスクリプタを管理するためのデータを作らせます。 そして返り値として、後の操作に使うepoll用のファイルデスクリプタを受け取ります。 このepollfdをepoll_ctl()に渡して監視対象とするファイルデスクリプタを登録します。カーネル側が監視すべきファイルデスクリプタを知っているので、select()のようにファイルデスクリプタを全てスキャンしなおす必要はなく、パフォーマンスが改善されています。

timerfd

さてはて、ファイルやソケット以外にも知りたい「外からの通知」というものはあります。 たとえばタイマー・シグナルなどです。これも epollで監視できたら便利ですね。 というわけで、 tiemrfd, signalfd, eventfdといったシステムコールでファイルデスクリプタ経由で「通知」をうけとることができるようになります。

まずはタイマーの通知をうけとるための timerfdです。 timerfd_create()でファイルデスクリプタを作成し、timerfd_settime()で「最初にタイマー通知が行なわれる時刻」と「その後タイマーが次に通知されるまでのインターバル」(もしくは0を設定してタイマーをくりかえさない)が設定できます。 両方ともに0が設定されるとタイマーがオフになります。

このファイルデスクリプタをread()すると前回のread()またはタイマーを設定した時から、タイマーに設定した時間が過ぎた回数が返ってきます。 もしも、まだ設定した時間が経過していない時には、その時刻までread()はblockします。もちろん、これを epollやselectで監視するファイルデスクリプタとして設定できます。

signalfd

signalfd()を使うと指定したシグナルを監視するファイルデスクリプタを作ることができます。これをread()すると、struct signalfd_siginfoの(配列の)形式でシグナルの情報が読みとれます。 これもselect, epollに指定することができます。

ただし、事前にsigprocmask()でデフォルトの動作が起こらないようにしておかないとよくわからない挙動になるかもしれません。詳しくはこのへんを unix のシグナル処理あれこれ - Emacs ひきこもり生活

eventfd

eventfdはシンプルなイベントの通知を行なうことができるファイルデスクリプタです。たとえば、一方がpipeをreadしてblockし、もう一方のプロセスがそのpipeにwriteすることでblockが解除されて、readしていたプロセスが動き出すようなコードを考えます。pipeに書いているデータには特に意味はなく、相手のプロセスを起こすことにしか使われていません。これだけのためにpipeを使うのは効率が悪いのでシンプルなeventfdを使うとよいという感じです。

eventfdには64bitの整数が関連つけられていて、read()した時にこの値が0であるとblockします。write()では同じく64bitの正数を書いて、その値がeventfdに関連つけられている整数に加算されます。この時、read()でblockしていたプロセスは、write()されていた値を受け取り、eventfdの整数は0に戻ります。

eventfdは様々なカーネルからの通知を受け取るのにも使うことができます。たとえば、eventfdを作り、cgroupのmemory.usage_in_bytesを開いて、cgroup.event_controlに" "を書くと、メモリ使用量がこのthresholdをクロスするたびに(thresholdより上から下になったり、その逆になるごとに)eventfdにイベントが通知されます。

ほかにもeventfdへのイベント通知で、KVMのguestにinterruptが起こるような設定をすることもできます。

kqueue

わぁ、いろんな *fdを使うことでいろんなものをepollで効率よく監視できるようになってちょー便利ですね。 でも、epollはLinuxでしかありません。 FreeBSDではどうするの? kqueue() を使います。

kqueue()では単体で以下のイベントが監視できます

  • ファイルデスクリプタがread()できるようになった
  • ファイルデスクリプタがwrite()できるようになった
  • ファイルが(削除された|書かれた|サイズが増えた|属性が変わった|リンクがふえた|名前が変わった|revokeされた)
  • プロセスが(exitした|forkした|execした)
  • シグナルをうけた
  • タイマーイベント
  • その他ユーザレベルのイベント

うわぁ…便利……

REQUIRED_USE

こんな emerge エラーを見たことはあるだろうか

Calculating dependencies \

!!! Problem resolving dependencies for sys-kernel/dracut
... done!

!!! The ebuild selected to satisfy "dracut" has unmet requirements.
- sys-kernel/dracut-024-r2::gentoo USE="(multilib) -debug -device-mapper -net -optimization (-selinux)" DRACUT_MODULES="btrfs lvm ssh-client syslogame -bootchart -caps -cifs -crypt -crypt-gpg -crypt-loop -dmraid -dmsquash-live -gensplash -iscsi -livenet -mdraid -multipath -nbd -nfs -plymouth -

  The following REQUIRED_USE flag constraints are unsatisfied:
    dracut_modules_lvm? ( device-mapper ) dracut_modules_ssh-client? ( net )

  The above constraints are a subset of the following complete expression:
    dracut_modules_crypt-gpg? ( dracut_modules_crypt ) dracut_modules_crypt-loop? ( dracut_modules_crypt ) dracut_modules_livenet? ( dracut_moduleslive ) dracut_modules_crypt? ( device-mapper ) dracut_modules_dmraid? ( device-mapper ) dracut_modules_dmsquash-live? ( device-mapper ) dracut_modut? ( device-mapper ) dracut_modules_lvm? ( device-mapper ) dracut_modules_cifs? ( net ) dracut_modules_iscsi? ( net ) dracut_modules_livenet? ( netmodules_nbd? ( net ) dracut_modules_nfs? ( net ) dracut_modules_ssh-client? ( net )

これには EAPI=4 から使える REQUIRED_USE というものが関係している。

けど、とりあえずどーすれば emerge できるんよ? という話から

注目するのは真ん中の

  The following REQUIRED_USE flag constraints are unsatisfied:
    dracut_modules_lvm? ( device-mapper ) dracut_modules_ssh-client? ( net )

読み方は

  • USE=dracut_modules_lvm がある時は USE=device-mapper も必要だよ。(でも、指定されてないよ)
  • USE=dracut_modules_ssh_client がある時は USE=net も必要だよ。(でも、指定されてないよ)

なので、 USE=device-mapperと USE=netを有効にしてあげるといい。 flaggie でやるならこんな感じ。

# flaggie dracut +device-mapper +net

そして、本題の REQUIRED_USE について

dracutには一番下に書いてあるように

    dracut_modules_crypt-gpg? ( dracut_modules_crypt ) dracut_modules_crypt-loop? ( dracut_modules_crypt ) dracut_modules_livenet? ( dracut_moduleslive ) dracut_modules_crypt? ( device-mapper ) dracut_modules_dmraid? ( device-mapper ) dracut_modules_dmsquash-live? ( device-mapper ) dracut_modut? ( device-mapper ) dracut_modules_lvm? ( device-mapper ) dracut_modules_cifs? ( net ) dracut_modules_iscsi? ( net ) dracut_modules_livenet? ( netmodules_nbd? ( net ) dracut_modules_nfs? ( net ) dracut_modules_ssh-client? ( net )

といった REQUIRED_USE が指定されている。 REQUIRED_USE はようするに、USE関係間の依存関係をしめすもの。

上の例だと全て、 "foo? ( bar )" の形をしていて 「USE=fooなら、 USE=barも必ず必要」という形式になっているが、他にも使えるフォーマットはある。

  • "foo? ( !bar )"
    • USE=foo なら、 USE=barはあってはならない
  • "foo? ( || ( bar baz quux ) )"
    • USE=foo なら bar,baz,quuxの少なくとも一つは有効になっていないといけない
  • "^^ ( foo bar baz )"
    • foo, bar, bazのどれが一つは有効になっていないといけない。 なおかつ、二つ以上有効にすることはできない
  • "|| ( foo bar baz )"
    • 上の 「USE=fooなら」がない版。 foo, bar, bazの少なくとも一つは有効になっていないといけない

さらに EAPI=5 からは "?? ( foo bar baz )" として、foo, bar, bazの中でどれか一つだけが有効・もしくは全て無効にならなければいけない、といった指定ができるようになっている。

結局のところ、ebuildがこれらを使って指定している中で、満たされていないものを Portageが真ん中のところに表示してくれていた、というわけ。

この指定を覚えておいて、適宜USEフラグをいじっていけばよい。

新APIGentoo山盛り

はじめに

一部で人気を博しているというこの記事から二年もたったのでいい加減いろいろと新しくしていこうと思うんですね。新時代Gentooの福音的な感じでね。

やっぱり想定的にはインストールしたけど、これからどうすんべ? とか、なんとなーくわかってきたけどもう少し楽な方法はなかとかね?ってあたり。

ちなみに環境は testingなので紹介する機能の中にはまだstableでは使えないものもあるかもしれないですね。そのへんはご容赦を。

/etc/make.conf

やっぱり基本となるのはこのファイル。だけど /etc/make.confは/etc/portage/make.confに移動されています。知ってましたか? 新規インストールだけなんでとりあえずそんなに気にすることもないでしょう

*FLAGS
CFLAGS="-O2 -pipe -fomit-frame-pointer -march=corei7-avx -mcx16 -msahf -mno-movbe -maes -mpclmul -mpopcnt -mno-abm -mno-lwp -mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx -mavx2 -msse4.2 -msse4.1 -mno-lz-cnt -mrdrnd -mf16c -mfsgsbase --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=3072 -mtune=generic -frecord-gcc-switches"
CXXFLAGS="${CFLAGS}"
FFLAGS=${CFLAGS}
FCFLAGS=${CFLAGS}

昔と大きく変わってはいませんね。あいかわらず、 "-march=native -O2 -pipe -fomit-frame-pointer"を展開したものです。それと最後に "-frecord-gcc-switches"をつけています。これがあると、gccがどんなオプションでビルドされたかを記録してくれるので、portageがそれを見て、ユーザの設定したCFLAGSが反映されていないよ?といったチェックができるようになります。まあ、これは開発者用ですね

USE
USE="mmx sse sse2 X emacs ssse3 -ldap xft fbcon xinerama wifi midi cjk xcomposite -bluetooth policykit cdda m17n-lib hddtemp python perl v4l v4l2 threads nsplugin sse3 llvm vaapi vdpau dga win32codecs bash-completion pulseaudio avahi xattr zsh-completion gtk3 -cups alsa infinality"

昔よりだいぶコンパクトになりました。最近はUSEフラグは手動でいじるのではなく、"flaggie"というツールを使うことにしています。

たとえば、 media-libs/freetypeでUSE='infinality'したいなーと思ったら

# flaggie media-libs/freetype +infinality

と、することで、いちいち/etc/portage/package.useを開かなくてもコマンド一つで編集できます。もし typoしちゃっても

# flaggie media-libs/freetype +infinity
At argv[2]='+infinity': infinity seems to be an incorrect flag for media-libs/freetype

と聞いてくれるので安心です。パッケージごとではなく、グローバルに変えたい時には

# flaggie +cjk
# flaggie -cjk

のようにすればOKです。

FEATURES
FEATURES='-stricter parallel-install parallel-fetch preserve-libs'

portageのさまざまな機能をON/OFFするFEATUESです。開発者用のプロファイルでデフォルトになってる "stricter"を切ってます。これがあるといろんなものがemerge通らなくなるのでね orz

FEATURES='parallel-install'を使うことで、より細かいロックを使うことで、インストールをいままでよりも並列度を上げて実行しています。

そして、 FEATURES='preserved-libs' これはなかなか大事な機能。

まずはこの機能が動いてない時の話をします。

libBを使っているpkgAをemergeします。すると

pkgA-0.1 -> libB-0.1

こんなふうに、AからBへの実行時リンクが"libB-0.1"という名前で行なわれます。ここで、libBがアップデートされます。 emergeはlibB-0.2をインストールし、libB-0.1が削除されます。

pkgA-0.1 -> (libB-0.1)
             libB-0.2

すると、pkgAは実行時リンクするべき"libB-0.1"が見つからないので、実行できなくなります。解決するには、再度pkgAをemergeして、pkgAのリンクをlibB-0.2へと張りかえなければいけません。

こういった、「リンクが壊れたパッケージ」を捜し出してリビルドするツールが "revdep-rebuild"でした。しかし、このプログラムは確かに便利で確実ではあるものの、システムの全バイナリをスキャンするために遅いという問題点がありました。

また、ebuildではpreserve_old_libを呼び出して、残しておくべきライブラリを指定すると、昔のライブラリをコピーして残しておいてくれました。昔のライブラリが残っていれば、コマンドはいままで通りに動きます。あとは適宜revdep-ebuildではりかえるだけです。しかし、残ったライブラリは、リンクをはりかえた後にユーザが手動で削除する必要があり、忘れさられることがありました。

さて、そこでこんな仕事はportageに自動的にやらせればいい、ということになります。 FEATURES='preserved-libs' しておくことで

  • 過去のライブラリを残しておく
  • 新しいライブラリにはりかえるべきパッケージを認識する
  • それらをemerge @preserved-rebuildでリビルドする
  • リビルドが完了した時点で、過去のライブラリを削除する

といったことができるようになります。

この preserved-libsの機能はだいぶ前から portage-2.2系列には入っていたものの、portage-2.1系列には入っていませんでした。しかし、EAPI=5の変更の影響もあって、portage-2.1にもコードが入ることとなりました。とはいえ、デフォルトでは無効になっていますから、 FEATURES='preserved-libs' が必要になる、というわけです。

Rubyのこと
RUBY_TARGETS="ruby19"

rubyのパッケージでターゲットにしたい、rubyのvariantを列挙します。 いまのところ

  • ruby18
  • ruby19
  • ree18
  • jruby
  • rbx

が使えるみたいですね。

ちなみにいまでは ruby-1.9がデフォルトになっています。 Project:Ruby/Ruby 1.9 migration - Gentoo Wiki

起動あたりのこと
DRACUT_MODULES="btrfs syslog ssh"
GRUB_PLATFORMS="efi-64

もうすっかりGRUB2とinitrdを使っています。initrdは/usrが/と別パーティションであれば、必須です。udevが/usrがmountされてないと動かなくなっちゃったんですよねえ。

で、initrd作りには distro-neutralなinitrdを作ってくれるツールのdracutを使っています。上の DRACUT_MODULES はdracutのUSEフラグですね。

そして、下の方はGRUB2のUSEフラグ。 efi bootしています。

dracutの使い方は簡単で

# dracut /boot/initrd-<kernel version> <kernel version> --force

こんな感じ。 dracutは上書きをしてくれないので、--forceをつけていますが、そこはお好みで。

そして、grub2は

# grub2-mkconfig -o /boot/grub2/grub.cfg

とかしていると、インストールされているカーネルを見つけだしてgrub.cfgを勝手に作ってくれますね。便利なもんです。

このへんをカーネルをインストールするごとにやれば、いいわけですがまあめんどいですしうっかり忘れそうですよね。そこで、/root/bin/installkernel というファイルを使います。ここにスクリプトをおいておけば、カーネルでの make instalがこいつを実行してくれます。うちでは

#!/bin/bash

make modules_install # モジュールインストールする

/sbin/installkernel "$@" # カーネルインストールする

# initramfsの作成
[ -f /boot/initramfs-$1.img ] && mv /boot/initramfs-$1.img /boot/initramfs-$1.old.img
dracut /boot/initramfs-$1.img $1
ln -sf initramfs-$1.img /boot/initramfs.img

# Grubのメニュー更新
grub2-mkconfig -o /boot/grub2/grub.cfg       

こんな感じで実行しています。これで、一通りのカーネル更新時の作業が全て実行されます。

EAPI=5

最初に書いた通りこの記事は「新時代Gentooの福音的」ってことで、新しく採択されたEAPI=5についても書いていきます。 EAPIはebuild全体の書式とかを統括してるAPIですね。新しくなるとなにがいいの? 新しい革新的な機能がふえます。

Sub-SLOT

Sub-SLOTがユーザから見ると一番大きな変更となります。これは上でも書いた revdep-rebuild, preserved-libs の進化系です。 preserved-libs は確かにライブラリに起因するリビルドを楽にしてくれます。しかし、

  • emerge @preserved-rebuild が必要である
  • ライブラリに起因する問題しか解決できない

この2つの問題があります。1つ目は解説しなくてもわかるでしょうが、2つ目はどういうことでしょうか。 たとえば、現状、GentooではPerlの本体が更新された時に perl-cleanerコマンドを使って全てのperlのパッケージを新しいバージョンのものへリビルドしています。emergeでperlが更新されてから、perl-cleanerを実行するまでの間はperlのプログラムがうまく動かなかったりしますし、さらにはいっぱい更新した時なんかはうっかりperl-cleanerの実行を忘れているかもしれません。

そこで、Sub-SLOTというものが導入されます。SLOTは「同一パッケージでSLOTが異なるものを共存させる」ための仕組みですが、Sub-SLOTは「同一SLOTでAPIの変更(など)を指定する」ための仕組みです。たとえばdev-lang/perl-5.16.1でこれを使うなら

SLOT="0/${PV}"

のように書きます。一方で、perlのパッケージは

RDEPEND="dev-lang/perl:="
DEPEND="${RDEPEND}"

のように、":="をつけておきます。これをつけると、emergeした時に、その時のdev-lang/perlのSub-SLOTへの依存が記録されます。すなわち、ここでは "dev-lang/perl:0/5.16.1=" というように記録されます。

さて、この後perl本体が更新され、"dev-lang/perl-5.16.2"がemergeされる、とします。この時、package managerはさきほどの "dev-lang/perl:0/5.16.1=" をチェックし、「dev-lang/perl-5.16.2をインストールすることで、この依存関係が壊れること」を認識します。すると、package managerは依存が壊れるものをリビルドする形で解決しようとします。これによって、いままで python-udater, perl-cleaner, haskell-updater, revdep-rebuildなどなど、壊れた依存を直すためのコマンドの役割が全てemergeに吸収され、emergeだけでなにもかもすむようになります。(実際のところは、haskell-updaterは結構使いますが…haskellの依存はいろいろ特殊…)

ということで、このSub-SLOTですがまだまだportageのメインツリーにはそこまで入ってきていません。gentoo-hasekllのツリーでは積極的にとりいれていて、新しいものはどんどんと":=" を使ったものに書きかわっているようです。

その他?

他にもebuildを書く側としては newhogeが標準入力を使えるようになったり、use.stable.maskというstableな時だけmaskされるUSEを指定したりと便利なものは入っているのだけれど、これは開発者むけだからね…。ユーザ向けには結局、Sub-SLOTだけかも。

ネットワークのこと

wicdがコマンドから使えるし、いいよねー?とか思ってたけど、最近はGentooサポートらしきものもnetworkmanagerに入ったようなので、NetworkManagerを(ノートPCでは)使っています。

そして、NetworkManagerのコマンドラインツール nmcliがあるのでこれでつないだりする。

# nmcli dev wifi connect <SSID> password <password>

依存衝突のこと

emergeするとこんなのが出てくる日もある

WARNING: One or more updates have been skipped due to a dependency conflict:

net-misc/curl:0

  (net-misc/curl-7.28.0-r1::gentoo, ebuild scheduled for merge) conflicts with
    <net-misc/curl-7.27.0 required by (dev-cpp/libcmis-0.1.0-r1::gentoo, installed)

これは

  • net-misc/curl-7.28.0-r1::gentoo を emergeしたい (ebuild scheduled for merge)
  • けど、 インストールしてある "dev-cpp/libcmis-0.1.0-r1::gentoo"が "

から、無理だよーってことを言ってる。

libcmisなんてこころあたりがないので、これがどのパッケージから呼ばれているのかを検索かけます。

# equery d libcmis
 * These packages depend on libcmis:
app-office/libreoffice-bin-3.5.5.3 (=dev-cpp/libcmis-0.1*)
                                   (<dev-cpp/libcmis-0.2)

というわけで、libreoffice-binのせいでした。 libreofficeにしたらいいのかもしれないけれども、めんどいのでこのconflictは放置、といったところですかね。

別のケース

dev-haskell/authenticate:0

  (dev-haskell/authenticate-1.3.1.2::gentoo-haskell, installed) pulled in by
    =dev-haskell/authenticate-1.3*:0/1.3.1.2= required by (dev-haskell/yesod-auth-1.1.1.4::gentoo-haskell, installed)

  (dev-haskell/authenticate-1.3.2::gentoo-haskell, ebuild scheduled for merge) pulled in by
    (no parents that aren't satisfied by other packages in this slot)
  • インストールされているyesod-authが "=dev-haskell/authenticate-1.3*:0/1.3.1.2="に依存
  • でも、dev-haskell/authenticate-1.3.2が更新でインストールされようとしている

これは上のSub-SLOTの例でpackage managerが自動的にyesod-authのrebuildをかけてくれるべきなんだけれど、推測に失敗している。

なので、手動で

emerge -1 authenticate yesod-auth

としてやると解決

依存のコンフリクトは結構迷うところなのでこれからも随時blogに書いていきたいところ。ただ、基本的なパターンは上の2つだと思う。

つまり

  • 心当たりがないなら、equeryを使ってどのパッケージがひっぱってきているかつきとめる
  • 仕方ないならあきらめる
  • とりあえずコンフリクトの登場人物を emerge -1 に渡してみる

Weekly Gentoo bugz review!

Last week This week
bsd assigned - 101 -
bsd CCed - 53 -
x86-fbsd assigned - 15 -
x86-fbsd CCed - 11 -
cjk assigned - 76 -
cjk CCed - 20 -
naota assigned - 3 -
naota CCed - 25 -
$ bugz search -a bsd@gentoo.org
428118 bsd                  dev-scheme/guile is broken on Gentoo FreeBSD with bo
=> ログを見ると「Binary: command not foud」とか書いてるし、環境の問題じゃないのかな。
428484 bsd                  typo in /etc/init.d/nfs for the freebsd-usbin 9.0 pa
=> 返信ないし、とりあえず問題なさそうなのでとじた。
430720 bsd                  net-fs/samba-3.6.7 dmapi USE flag mask and rekeyword
=> とりあえずビルドできたけど、 test ... == なやつがいるのでそいつのpatchをなげた
432410 bsd                  [keywordreq] some packages compile and works on amd6
=> amd64-fbsdにassignしなおし
433403 bsd                  x11-libs/libdrm failed for compile on Gentoo/FreeBSD
=> Freedesktopのbugzの方の反応待ちかなあ。しかし、freedesktopはbsdに冷たいイメージなのがアレ
435648 bsd                  Segmentation fault always occurs when starting X, us
=> upstreamになげないのかな?? まあ環境もないのでとりあえず放置
436560 bsd                  sys-apps/baselayout to create a lib directory empty.
=> amd64の話だから放置 assign変えたいぐらいのところ
437386 bsd                  *-fbsd keyword on net-mta/netqmail-1.06
=> qmailの方の反応待ち
437388 bsd                  please remove pkg command from sys-freebsd/freebsd-u
=> どうなんだろ? freebsd-updateも消してるし消してよさげか。自分のとこを9.1にあげるまでしばらく放置かな
437640 bsd                  *-fbsd keyword on =net-mail/vpopmail-5.4.33
=> qmailの方の反応待ち
* 101 bug(s) found.

dovecotまわりでqmailの反応待ちだし、desktopまわりは環境ないしupstreamにいやんなイメージあるのでもにょもにょ

$ bugz search --cc bsd@gentoo.org
424571 naota                Unmask USE=smbkrb5passwd for net-nds/openldap
=> 425352 が解決しないことにはどうにも
426462 infra-bugs           VM Request: Make a Gentoo FreeBSD development system
=> どこからでもつなげるVMがgentoo.orgにあったらうれしいけどなんも反応ないっすねwww
428112 x11                  media-libs/mesa-8.1 expects GNU dialect of indent
=> INDENT=catするようにしたしBSDとしてはやることはない
428228 base-system          sys-devel/bin86-0.16.18 fails to build on ~amd64-fbs
=> amd64-fbsdにCCしなおしたった
428356 printing             Please (re-)keyword net-print/cups-1.6.1 and net-pri
=> ぐぬぬ、"bsd@gentoo.org"は"amd64-fbsd@.."にもマッチしちまうのか
430072 kde                  KDE 4.9 and dependencies: keyword request
=> nepomuk-coreに当たってるpatchにバグがあるのでそれを修正するpatchをいれてもらおう
432420 kde                  media-libs/phonon/phonon-4.6.0-r1 and backends : key
=> すでに終わってたのでCCを削除
433760 x11                  >=x11-drivers/xf86-video-intel-2.20.6 keywording req
=> 433403 解決待ちだなー。解決してもマシンがないのでむずかしいが
435452 eras                 net-mail/dovecot net-mail/vpopmail Please (re-)keywo
=> qmailの2つのバグ待ち
437532 perl                 Please (re-)keyword >=dev-perl/HTTP-Message-6.40.0, 
=> x86-fbsdは終わってる
 * 53 bug(s) found.

bsd@gentoo.orgにamd64-fbsd@...もひっかかってしまってもにょもにょ。正規表現使えないっぽいしつらぽよ。いいかげんamd64-fbsdのVMでも作ってamd64-fbsdのもつぶしにいくか

$ bugz search -a x86-fbsd@gentoo.org
...
232260 x86-fbsd             games-emulation/snes9x-1.51 ~x86-fbsd keyword request
=> 動くのでkeywordした
232273 x86-fbsd             games-emulation/visualboyadvance-1.7.2-r2 ~x86-fbsd keyword request
=> pthreadがstruct pthreadかstd::pthreadかわかんねーよ、とかいうエラーで死んでる。また今度見る
233624 x86-fbsd             games-emulation/gnomeboyadvance-0.1 ~x86-fbsd keyword request
=> 232273 をさきに解決しないといけない。
233717 x86-fbsd             x11-misc/slock-0.9 ~x86-fbsd keyword request
=> -DHAVE_SHADOW_Hをおとしたらbuildできるのでsedってkeywordいれた。
236834 x86-fbsd             Keyword xfce-base/tumbler for ~x86-fbsd
=> pangoのあたりで死んでて確認できない
237130 x86-fbsd             [~x86-fbsd keyword request]  net-dns/rbldnsd-0.996b
=> おっけー keyword追加
303295 x86-fbsd             sys-apps/logwatch-7.3.7_pre20091210: keyword request
=> 303289 のSys-CPUをFreeBSD対応させないといけないんだけどupstreamが数年反応してなくてもにょる
303903 x86-fbsd             ~x86-fbsd keyword request for sci-mathematics/qtoctave
=> 303915待ち
303909 x86-fbsd             ~x86-fbsd keyword request for sci-libs/qrupdate, patches included
=> gccのビルド長いよー
303915 x86-fbsd             ~x86-fbsd keyword request for sci-mathematics/octave
=> 303909待ち
 * 15 bug(s) found.

あいかわらずBSDLinuxでびみょーにちがうとこでビルドがおちる。ひたすら直すだけだなー

$ bugz search --cc x86-fbsd@gentoo.org
...
253803 netmon               Rekeyword request for >=net-wireless/aircrack-ng-1.1 and >=net-wireless/iw-0.9.15
=> GentooであててるpatchがなくてもLinuxでbuildできるし、あるとFreeBSDでビルドできないので外してほしいところ。メンテナ反応待ち
267299 net-mail             Please keyword mail-client/alpine (and net-mail/topal)
=> MAKEが適切に設定されてない…。makeだとBSDのになってしまうからgmakeで上書きしないと
313589 net-irc              net-irc/xchat-2.8.8 rekeyword request
=> xchat: local symbol `__progname' in /usr/lib/gcc/i686-gentoo-freebsd9.0/4.7.2/../../../crt1.o is referenced by DSO だそうで
336899 voip                 net-libs/farsight2 please keyword
=> まーたヘッダ読まなくてもLinuxでは動くアレだよー
384445 emacs                app-editors/zile-2.4.1 dropped keywords
=> dev-libs/boehm-gcがkeywordできないのでアレ 多分USE=threadsを動くのだが…
417997 java                 Please stabilize =dev-java/saaj-1.3.19-r1, stable 1.3 fails to emerge, because org.w3c.dom.ElementTraversal can't be accessed.
=> javaはまずicedteaあたりをなんとかしないといけないのですごくおもい
421733 java                 =dev-java/tagsoup-1.2.1 Stable request
=> 同じく
424571 naota                Unmask USE=smbkrb5passwd for net-nds/openldap
=> openafsの-lresolvが解決しないといけないな。 libresolveってGNU libcな気がするからそのへん使ってpatchあてるかどうか選定すべき
433760 x11                  >=x11-drivers/xf86-video-intel-2.20.6 keywording request
=> 上に書いた通り
435452 eras                 net-mail/dovecot net-mail/vpopmail Please (re-)keyword
=> 上に書いた通り
 * 11 bug(s) found.

javaの環境を作れるようにしたいですなー

$ bugz search -a cjk@gentoo.org
...
413525 cjk                  app-i18n/uim: unsafe gtk-query-immodules-* usage
=> ふるいuimをおとそうかな
413527 cjk                  app-i18n/x-unikey: unsafe gtk-query-immodules-* usag
=> fixed.
413795 cjk                  www-client/w3m - default to type=text on unknown typ
=> あんまり独自にpatchあてたくないんだけど、w3mを代替できるtext browserがない以上あてとくしかないかなあ…。debianにもあたってるし…
415203 cjk                  app-i18n/fcitx does not work with kde-base/konqueror
=> わからん… fcitxのqt moduleのバグっぽいしupstreamになげつけるか
424329 cjk                  Re-KEYWORD dev-libs/m17n-lib-1.6.3-r1
=> どうなってるのやら
426682 cjk                  www-client/w3mmee-0.3.2_p24-r6 (stable) fails to bui
=> ppcのstable待ち
428872 cjk                  Please stabilize =app-i18n/multiskkserv-20100128
=> test時にnkfが必要だよーってコメント見すごしてた。dependを追加してコメント返信
433187 cjk                  Please stabilize =app-emacs/yatex-1.76
=> 437612検討中
434138 cjk                  app-i18n/scim-1.4.14 breaks x11-wm/windowmaker's roo
=> んーわからん。scimは正直こういうのが多いぜよ…
437612 cjk                  =app-emacs/yatex-1.76[linguas_ja] fails to build
=> いまいち文字コード変えてる意味がわからん。特にやる必要ない気がする。
* 76 bug(s) found.

fcitxマジ…scimマジ…。

$ bugz search --cc cjk@gentoo.org
...
325795 printing             app-text/ghostscript-gpl with USE=linguas_ja pulls i
=> printingチームが反応なくてアレ。MLになげるべきか
348481 arm                  dev-libs/libchewing-0.3.2-r1 keyword request
=> armから返事ないね
388981 aballier             app-office/lyx-1.6.x / 2.0.x not compatible with sub
=> backportしてくんないかな 
413529 gnome                [TRACKER] unsafe gtk-query-immodules-* usage, gnome2
=> まあぼちぼち直しましょう
421011 maintainer-wanted    app-i18n/uim-mozc-9999 - mozc input method for uim
=> 入れるか…
424491 qiaomuf              app-i18n/fcitx-sunpinyin-0.3.7 version bump
=> 427070が直ってるけど、sunpinyin-2.0.4が来ないのか
425270 emacs                app-emacs/lookup-1.4.1: fails to build with emacs-24
=> 最初に"e"が入っているだけのエラーじゃん
427846 qiaomuf              app-i18n/fcitx-4.2.5 not work in KDE
=> 415203 のdupじゃないの?
429628 aballier             >=app-office/lyx-2.0.3 - lyx crashes with "Exception
=> closeしてくれよー
431186 aballier             stabilize app-office/lyx-2.0.4
=> stable待ち
 * 20 bug(s) found.

いろんなとこから返事なくてアレである

$ bugz search -a naota@gentoo.org
404451 naota                net-misc/dropbox-1.2.51 won't start, or stops when c
=> これなんなんだろうね。まあbundleの使うしかしかたないのか
407579 naota                app-emacs/markdown-mode lacks a dependency over the 
=> んんんーout of boxで動くようにしたいよーなGentooらしくないよーな
424571 naota                Unmask USE=smbkrb5passwd for net-nds/openldap
=> openafsあたり待ちだなー
* 3 bug(s) found.

Dropboxはとりあえずupstream更新待ちか。markdownはどうしよう。out-of-boxで動くようにelispの設定したるのもなんともなあ。einfoを出してやるぐらいでいいか。

$ bugz search --cc naota@gentoo.org
...
373061 prefix               x11-libs/qt-core-4.7.3 install_mkspecs
=> Gentoo/Prefixの環境もう持ってないしCCはずすかな
373599 media-video          =media-video/ffmpeg-0.7.8 fails dodoc
=> 直ってるぽいのでとじとく
374081 maintainer-wanted    Request for Firefox Add-on SDK ebuild
=> まあそのうち書こう
383577 maintainer-wanted    Ebuild proposal: dev-util/gyp-9999
=> んー…
384925 ruby                 dev-ruby/knife-{ec2,rackspace,openstack}: ebuild req
=> そのうち書こう…
400705 dev-portage          More versatile return codes for emerge
=> 放置
400979 devurandom           app-backup/spideroak-bin-4.2.9913 ebuild fails to ac
=> 別のgentooメンテナがついてるから離脱
402081 dev-portage          Possibility to ignore libraries for preserved-libs/r
=> 離脱
426798 devurandom           app-backup/spideroak-bin-4.6.9945: bundles a lot of 
=> 離脱
430426 matsuu               sys-fs/nilfs-utils - nilfs_cleanerd does not run whe
=> udev-190で直ってる?
* 25 bug(s) found.

spideroak-binはもう使ってないのでメンテナやめよう。他にやってる人もいるし。

コマンドラインからの NetworkManager

コマンドラインから NetworkManagerを扱うcnetworkmanagerというものがあって、使ってみたのだけれど、どうにもうまく動かない。
ので、githubを見てみたら nmcliに移行してね、みたいなことが書いてあって、んじゃその nmcliはどこにあるの?と思ったら networkmanagerに付属だった。そりゃ移行するわな。

とりあえずWiFiにつなぎたい、とする

"nmcli dev wifi"で、wifiのアクセスポイントが出てくる。つなぎたいところに狙いを定めたら、"nmcli con 'hoge hoge' password 'fugafuga' name 'HoeHoe'"みたいな感じで接続する。一度こうしておくと、nameで指定した名前を使って "nmcli con up id 'HoeHoe'"といったふうにして接続することができるようになる、のでそれ以降はそうする。

LKMLの釣り師たち

ああん?最近釣りが多いな?

最近、LKMLに変な投稿投げる釣り師(?)がいるのでまとめておく。

09/07 LKML: Angela Bernard: Suggestions for the Future of Linux

Ethernetとかオワコン。誰も使わねーよ。

デスクトップは死につつあるし、Linuxのデスクトップは最初から死んでるぜ。よしんば使っててもマルチモニタなんて使わねーし、マルチモニタ機能消せー

マルチユーザなんて誰も使わねーよ消せー

光学ドライブとかいつ使ったよ?もうインターネットでいいだろ。光学ドライブ消そうぜ

09/12 LKML: Rich Lawlman: Various things Linux doesn't have/doesn't need

ARM以外のCPUのサポート削除して、ARMに注力するべき!!!

iPhoneはやってるやん? あんなふうにファイルシステムがユーザから見えないようにしてさ。ファイルマネージャだけから見えるようにしよう! そしたらセキュアだしシンプルだろ?

09/13 Really needs pulling

USBとか捨てるべき、wireless技術で置き換えられてしまうのだ!
USBなんかやめて、シリアルポートとかを使うようにしよう!

これ08/23のDrop support for x86-32で、x32がなんかを全然わからずに議論をして、ひどい受け答えしてたこの人の流れをくんで最近釣りが行なわれてるのかな。この一週間で変にこういうのなってたから、ちょっと気になった。

上に書いてあるのはものすごーい意訳な翻訳なので、これを根拠として議論なんかしないでね。まあどうせネタだろうけれどもね。

Btrfsの歴史とか

  • 2007年
  • 2008年
    • 04/30 Btrfs v0.14
    • 05/29 Btrfs v0.15
      • ext3からの変換をサポート
    • 8月 Btrfs v0.16
      • ディスクフォーマットの変更
  • 2009年
    • 1月 2.6.29-rc1 Btrfs v0.17
      • 圧縮機能
      • seed device機能
    • 12月 2.6.32
      • SSDのdiscardをサポート
  • 2011年
    • 1月 2.6.37
      • free space cache
    • 3月 2.6.38
      • LZO圧縮のサポート
    • 5月 2.6.39
      • ファイル単位での圧縮のサポート
    • 6月 FedoraがBtrfsをデフォルトにする計画
    • 7月 3.0
      • scrub機能
      • autodefrag機能
  • 2012年
    • 1月 Oracle Linux, Btrfsをproudction readyにすると発表
    • 1月 3.2
      • "mount -o recovery"で過去のroot blockを使った復旧をできるように
    • 3月 3.3
      • restriper: raidの構成を変更する機能
    • 5月 3.4
      • エラー処理の改善
    • 6月 主要開発者 Chris MasonがOracleからFusionIOへ
    • 7月 3.5
      • バイスのエラー統計情報の収集/表示
      • NFSサポートの改善
    • 8月 3.6-rc1
      • subvolume単位のquota (qgroup)
      • send/recv (効率的なデータdumpと復元)
      • subvolumeを越えたreflinkの作成


まあ、なんだ。リリース日で書いてるけど、パッチが投入されたのはその一つ前のリリースの直後だと思っていいわけで。それでこう、転職の時期と機能の実装具合い見ると面白そうだよね。

いつ安定するのかな、って