@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.
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 Kernel Development, Robert Love
- Understanding the Linux Kernel, Daniel Bovet + Marco Cesati
- Linux Device Drivers, Third Edition, Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman https://lwn.net/Kernel/LDD3/
- Professional Linux Kernel Architecture
などがあげられていました。日本語に翻訳されているものもあるのでぜひ。
編集後記
Linux 3.0-rc が出ていますね。みなさん試していますか?
ぼくはLinux 3.0-rc1を試していろんなものが動かなくなりました。そのへんを代替品に置き換えてたりします。
Gentoo Linux on MacBook Proで使っていますが動かなくなったのは
それぞれの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
と書いて、broadcomのfirmwareがインストールされるようにします。あとは 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に更新しちゃいましょう。