@naota344の今週のLKML

今週は

  • unlink(nonexistent): EROFS or ENOENT?
  • [ANNOUNCE] The Linux Test Project has been released for MAY 2011.
  • Linux 3.0-rc2
  • Looking for a good reference, a book, on the Linux kernel

unlink(nonexistent): EROFS or ENOENT?

http://permalink.gmane.org/gmane.linux.kernel/1147292

リードオンリーのファイルシステムから存在しないファイルを指定してunlink()を呼ぶと想定とは違ったエラーが出る、というメール。

http://permalink.gmane.org/gmane.linux.kernel/1150539

再現できないぜ?とメールが来るも…

http://permalink.gmane.org/gmane.linux.file-systems/54852

unlinkat()が存在しないファイルに対してEROFSを返すので、ファイルが存在するかどうかをstat()で調べて、なければEROFSをENOENTに変換している、のだとか。

ということで、このせいで

  • /etc をgitで管理している
  • read-writeにしてファイルを消す
  • read-onlyにする
  • git rm してなかったのを思い出してgit rmする

ということが失敗する、ようです。

Linuxは(あんまり)POSIX考えてないような感じで、エラー番号になにを返すかの基準がはっきりしてないといえばしてないのでどうなることやら…。

[ANNOUNCE] The Linux Test Project has been released for MAY 2011.

http://permalink.gmane.org/gmane.linux.kernel/1150685

LinuxカーネルをテストするプロジェクトLTPの2011年5月版が出ています。

Linux 3.0-rc2

http://permalink.gmane.org/gmane.linux.kernel/1150660

3.0-rc2が出ています。tar ballがなにやらトラぶっているようですね。Linusはまだ旅行中で忙しそうです :D

Looking for a good reference, a book, on the Linux kernel

http://permalink.gmane.org/gmane.linux.kernel/1150400

いい本を教えてくれ!とLKMLに書いてる人がいました :)

などがあげられていました。日本語に翻訳されているものもあるのでぜひ。

編集後記

Linux 3.0-rc が出ていますね。みなさん試していますか?

ぼくはLinux 3.0-rc1を試していろんなものが動かなくなりました。そのへんを代替品に置き換えてたりします。

Gentoo Linux on MacBook Proで使っていますが動かなくなったのは

  • 無線LANドライバ
  • nVidiaの謹製ドライバ
  • btrfsが遅くなった

それぞれのGentooでの対処を書いてみます。

まずは無線LANドライバ。ずっと net-wireless/broadcom-sta というプロプライエタリなドライバを使っていたのですが 3.0-rc1ではうまくビルドできなくなりました。そこでこの機会にリリースされてニュースになっていたオープンソース版に乗り換えます。

Bus options (PCI etc.) --->
  [*] PCI support
Networking support --->
  [*] Wireless --->
    <M> cfg80211 - wireless configuration API
    <M> Generic IEEE 802.11 Networking Stack (mac80211)
Device Driver --->
  [*] Network device support--->
    [*] Wireless LAN --->
  [*] Staging drivers --->
    [ ] Exclude Staging drivers from being built
    <M>   Broadcom IEEE802.11n PCIe SoftMAC WLAN driver

こんな感じでとりあえずドライバはビルドできるはずですが、これだけではこのドライバは動作はしません。ファームウェアが必要になります。

/etc/portage/savedconfig/sys-kernel/linux-firmware

brcm/bcm43xx_hdr-0.fw
brcm/bcm43xx-0.fw

と書いて、broadcomfirmwareがインストールされるようにします。あとは USE="savedconfig" emerge linux-firmware です。

次に nVidia これはもうあれですね。 nouveau ドライバです。

Bus options (PCI etc.) --->
  [*] PCI support
Device Driver --->
  Graphics support --->
    <M> Direct Rendering Manager
    [*] Support for frame buffer devices --->
      < > nVidia Framebuffer Support
  [*] Staging drivers --->
    [ ] Exclude Staging drivers from being built
    <M>   Nouveau (nVidia) cards

こんな感じでドライバがはいります。/etc/make.confにVIDEO_CARDS="nouveau"と書いて emerge -1 xorg-drivers ですね。うちではこれで Xorg.conf なしで動くようになりました!

btrfs が遅くなった…。これはまぁ http://permalink.gmane.org/gmane.comp.file-systems.btrfs/10368 のせいです。

これまでbtrfsは新しいファイルに割り当るinode番号を決めるのに「今までに使った最高のinode番号」を覚えておいて、それ+1を使っていました。単純ですね。しかし、これだと(仮にファイルを削除したりしても)新しいファイルに割り当てられるinode番号は大きくなる一方で32bitマシンなんかではこれで簡単にinode番号が最大値にまで到達してしまいます。

そこで空いているinode番号をrbtreeに登録しておいて、そこからinode番号を割り当てる、という戦略をとります。

ところで、この「空いているinode番号のrbtree」はいままではなかったものですから、新しく作らなくてはいけません。それを行なうkernel threadとしてbtrfs-ino-cacheというものが作られました。ところが、このカーネルスレッドががんがんdiskからinodeがあるかどうかを読みこもうとするのでdisk IOが高まり操作がにぶくなってしまいます。特にIO Schedulerにdeadlineという単純なFIFOのようなschedulerを使っている場合にはほとんどなにも動かなくなってしまいます。どうしても3.0-rc1でbtrfsを使いたければIO Schedulerを CFQにしておきましょう。

さて、そんなbtrfs-ino-cacheですが… mount option に inode_cache を追加する http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4b9465cb9e3859186eefa1ca3b990a5849386320 が3.0-rc2に入っていてデフォルトでOFFになっています。3.0-rc1 で btrfsを使っていて遅い!と悩んでいる方は3.0-rc2に更新しちゃいましょう。