Hatena::ブログ(Diary)

Emacs ひきこもり生活 このページをアンテナに追加 RSSフィード

2010-12-12

カーネル/VM Advent Calendar 6日目: make *config 〜カーネルいじっちゃお!〜

| 23:54 |  カーネル/VM Advent Calendar 6日目: make *config 〜カーネルいじっちゃお!〜を含むブックマーク

カーネル/VM Advent Calendar

この記事は 500 Internal Server Error : イベント開催支援ツール ATND(アテンド) のために書かれました。

Linux カーネルを設定しよう

Linux カーネルは多種多様なアーキテクチャに対応して、数多くの設定項目があります。 distroカーネルをそのまま使うのもいいですが、自分の環境・自分の好みにあわせてカーネルを設定し、コンパイルするのもまた楽しいものですよ!よ!

カーネルソースのディレクトリに cd して "make <設定方法>" することで、カーネルの設定を行なうことができます。設定方法には以下のものがあります。

  • config
  • nconfig
  • menuconfig
  • xconfig
  • gconfig
  • oldconfig, silentoldconfig, oldnoconfig
  • localmodconfig, localyesconfig
  • allnoconfig, allyesconfig, allmodconfig, alldefconfig
  • randconfig

以下、それぞれ簡単に説明します。

config

全ての項目をひとつひとつ懇切丁寧に聞いてきます。 twitter がない時のひまつぶしや、寝れない夜などに利用します。

"y" でカーネルに組み込み、 "n" で機能無効、 "m" でカーネルモジュールになります。なんじゃこりゃ?と思った時は "?" で説明を見ることができます。

nconfig

最近あらわれた新しい設定方法。 curses base です。

F1操作のヘルプ表示
F2項目のヘルプ表示
F3簡単な操作説明
F4全ての項目表示 <-> (無効などで)隠されている項目非表示の切り替え
F5一つ上の階層へ
F6保存
F7ロード
(F8)(シンボルの検索)
(/)(ページ内検索)

() の中に入っているものは 2.6.37 から使えるようになる予定です。ページ内検索は menuconfig にない便利で気がきいた機能ですし、隠れているシンボルを一時的に表示させることで他の設定の影響で無効になっているものも簡単に見つけだしなぜそれが隠れているのかを調べることができます。

環境変数 NCONFIG_MODE=single_menu としておくと、階層メニューではなくなり、一つのページでツリーを開いたり閉じたりするような動作になります。

menuconfig

コンソールで昔から使われてきた設定方法だと思います。 "/" で設定項目全体からの検索ができます。

xconfig

qt4 base でグラフィカルな設定エディタになっています。こんな感じ。

f:id:meech:20101212234534p:image

検索してその画面のまま、設定の変更ができる様子、なかなかいい。

f:id:meech:20101212234535p:image

gconfig

こちらは gtk base です。まぁだいたい同じ見ため。

f:id:meech:20101212234536p:image


しかし、こちらは検索ができないようです! gtk が好きで kernel いじってみたい人はぜひここに patch を!(え

oldconfig, silentoldconfig, oldnoconfig

oldconfig 系列。 oldconfig をいまある .config (設定ファイル) をもとに追加された設定項目を聞いてきてくれます。 silentoldconfig は聞いてこずにデフォルトにして、そして oldnoconfig は追加項目の設定を No にします。

localmodconfig, localyesconfig

localmodconfig は現在の設定から「カーネルに読みこまれていない module」を無効にした設定を行ないます。読みこまれていれば、そのままなので「ある程度」カーネルの設定をマシンに最適化するのには使えますが、「ある程度」以上には使えないと思います。 (kvm なんかの module はデフォルトでは読みこまれないから、これで無効になってしまうんじゃあないだろうか…)

localyesconfig はさきほどのものを module ではなくカーネル組み込みにするだけの違いです。


allnoconfig, allyesconfig, allmodconfig, alldefconfig, randconfig

順番に

  • 全てを無効 (最小限になります)
  • 全てをカーネルに組み込み
  • 全てを module にする
  • 全てをデフォルトにする
  • 全てをランダムに設定

ここらはビルドテスト用に使われますね。特に allyesconfig, randconfig なんかでビルドできないような変更をしてないかどうか確認するのによく使われています。

裏側

*config で使われる設定ツールのソースは linux-2.6/scripts/kconfig/ に入っています。

ほとんどはやっぱり C で書かれていますが、 localmodconfig, localyesconfig については streamline_config.pl という Perl スクリプトで書かれています。これは、 ソースツリー・ config ファイル・lsmod の結果を書いたファイルを引数にとって、 読まれていないものをオフにしたものを出力します。 localyesconfig は、その結果を「単純に sedで s/=m/=y/」 しているだけなのでここには注意が必要です。自分で設定した・自動で設定したにかかわらず全ての module が組み込みになってしまうわけです。

gconfig に検索機能をいれたい方はここの gconf.c をいじってください!

こぼればなし

この config いじるやつらはどうにも権限チェックがあいまいで困ります。

たとえば make config の .config への書きこみは最後に行なわれていて、うっかり user で make config で根気よくひとつひとつ設定して終わった!!! -> 書きこみ -> そこで パーミッションチェックが行なわれ、 .config が root のものだったりすると…… -> 書きこめませんでした! -> そのまま他の保存場所なんか聞かずにエラー終了

問: …あれ…ぼくのがんばって設定したものは…どこ…に? 答: /dev/null に保存しておいたよ!おにいちゃん!

という悲しいことになります。このゆゆしき問題については @hiromu1996 せんせーにすでに嘆いているので、きっと彼が解決してくれるでしょう!!! パッチ期待してます! もうがんばって設定した結果を無駄にしたくないのです!!!