Top / Old / etch / Software / LinuxKernel

Linux カーネルの FAQ

i386 以外のカーネルをインストールするには

4.0 (etch) では linux-image-* という名前でパッケージが用意されています。

Intel 系 CPU なら

  • linux-image-2.6-486
  • linux-image-2.6-686
  • linux-image-2.6-686-bigmem
  • linux-image-2.6-xen-686
  • linux-image-2.6-vserver-686
  • linux-image-2.6-xen-vserver-686

AMD 系の CPU なら

  • linux-image-2.6-k7
  • linux-image-2.6-vserver-k7
  • linux-image-2.6-amd64
  • linux-image-2.6-xen-amd64
  • linux-image-2.6-vserver-amd64
  • linux-image-2.6-xen-vserver-amd64

のいずれかをインストールすればよいでしょう。 -vserver は linux-vserver 用カーネル、-xen は xen 用カーネルです。

カーネルとカーネルパッケージを再構築したい

1. 必要なファイルのインストール

パッケージ作成のためのパッケージと、カーネルソースの入ったパッケージをインストールします。 カーネルソースの apt 時に build-dep を指定すると、自動で必要な追加パッケージが選択されてインストールされます。便利。(etch 以前は kernel-source-*)

# apt-get build-dep linux-source-(バージョン)

または aptitude の機能を利用して

# aptitude install linux-source-(バージョン)

あと、必須ではありませんが root 権限を使わずにカーネルの再構築をするために fakeroot もインストールしておきます。

# aptitude install fakeroot

インストールされたソースファイルは /usr/src/ に圧縮されたファイルとして置かれています。適当なディレクトリに展開します。

$ tar xvfj /usr/src/linux-source-(バージョン).tar.bz2 /foo/bar/

linux-source-(バージョン) というディレクトリが作成されるので、そこに移動しておきます。mrproperもしておきます。

$ cd /foo/bar/linux-source-(バージョン)
$ make mrproper

なお、Debian が配布してないカーネルソース、例えば kernel.org からダウンロードしたカーネルソースで initrd を使う場合、上記のようなソース展開後に linux-patch-debian-(カーネルのバージョン) のインストールが必要です。

# apt-get install linux-patch-debian-(カーネルのバージョン)
$ export PATCH_THE_KERNEL=yes

2. カーネルの設定

ゼロから設定するのではなく、既にインストールされているカーネルの設定を引き継ぎたい場合には、設定ファイルを .config としてソースディレクトリにコピーしておきます。

$ cp /boot/config-(インストール済バージョン) ./.config

その後、現在のカーネル用に設定ファイルを変換します。

$ make oldconfig

ただし、すべての設定が正確に引き継がれるとは限りません。 例えば 2.4 系から 2.6 系へ設定を引き継ごうとしても、多分うまくいかないです。

カーネルの設定は make config で行います。

$ make-kpkg [--added-patches パッチ名[,...]] --revision リビジョンナンバー  --config {xconfig | menuconfig | config | oldconfig}  configure

config の代わりに menuconfig や xconfig を指定して多少グラフィカルに設定することもできます。

  • menuconfig には libncurses-dev が必要
  • xconfig には libqt3-mt-dev (2.4 系では tk-dev) が必要
  • gconfig (2.6 専用) には libglade2-dev が必要

2.1 設定の注意

2.1.1 外部カーネルモジュールについて
カーネルソースにも含まれているカーネルモジュール、例えば pcmcia や 2.6 系での alsa を外部カーネルモジュールとして別途構築する場合は、カーネル側の pcmcia や alsa モジュールを無効にしておく必要があります。

2.1.2 システム起動に必要な設定について
システムの起動時に必要なものは モジュール (M) ではなく、組み込み (Y) にした方がいいです。 例えば HDD のアクセス関係

  • CONFIG_IDE (IDE 接続の HDD),CONFIG_BLK_DEV_IDEDISK,および使用しているIDE chipset support(CONFIG_BLK_DEV_PIIX等)
  • CONFIG_SCSI (SCSI 接続の HDD),および使用しているSCSIドライバ等

ルートファイルシステムに使われているファイルシステム関係

  • CONFIG_EXT3_FS (ext3 ファイルシステム)
  • CONFIG_REISERFS_FS (reiserfs ファイルシステム)

など。 これらを M にした場合、initrd-tools (initramfs-tools, yaird) 等を利用しないと起動できなくなります。 公式のカーネルパッケージの /boot/config-* は、これらが M になっているので、そのまま流用するとハマります。 最も初歩的な kernel panic で起動できなくなる原因の一つなので注意。

3. カーネルパッケージの構築

カーネルの設定が終わったらパッケージを構築します。しばらく時間がかかります。

$ fakeroot make-kpkg kernel-image --revision hogehoge

正常に終了した場合はカレントディレクトリに linux-image-(バージョン)_hogehoge_i386.deb のようなファイルができているはずです。 hogehoge にはわかりやすい名称をつけておくといいでしょう。--revision を指定しない場合には 10.00.Custom になります。

initrd を使用する場合は

$ fakeroot make-kpkg --initrd kernel-image

となります。ただし、このオプションをつけても作成されたカーネルパッケージに initrd は含まれません。(dpkg -L linux-image-x.y.z するとわかります)
しかし、カーネルパッケージに含まれるインストールスクリプト (postinst など) には ちゃんとmkinitrd (initrd を生成するプログラム) を実行するよう指示されているはずです。

4. 構築したカーネルパッケージのインストール

# dpkg -i ../linux-image-(バージョン)_10.00.Custom_i386.deb

インストールした後は必ず LILO や GRUB などのブートローダの設定を確認しましょう。 問題ない事を確認した上、新しいカーネルで起動し直しましょう。 GRUB の場合は update-grub を利用するとカーネル更新を自動で認識してくれます。

5. 設定のいろいろ

その他様々なオプションや指定できる環境変数、(make の) ターゲット、設定ファイル (kernel-img.conf, kernel-pkg.conf) へのポインタが make-kpkg のマニュアル (man make-kpkg) や /usr/share/kernel-package/rules に載っています。

例:

  • make-kpkg の時に 環境変数 CONCURRENCY_LEVEL=2 を指定しておくと、make -j2 で CPU を 2 つ使ってコンパイルしてくれます。
  • --append-to-version (--append_to_version) オプションによりトップディレクトリの Makefile に書かれている EXTRAVERSION に追記できます。(これにより意図しないカーネルの衝突、上書きを回避できます。)

6. とりあえずカーネル作成に役立ちそうなリンク

カーネルインストール時に自動で GRUB 設定を更新

/usr/share/doc/grub/README.Debian の update-grub の項にあるように /etc/kernel-img.conf というファイルを以下の内容で作成すると LILO の問いあわせは無くなり、update-grub を自動的に実行してくれます。

postinst_hook = /sbin/update-grub
postrm_hook = /sbin/update-grub
do_bootloader = no

etch 以降は

postinst_hook = /usr/sbin/update-grub
postrm_hook = /usr/sbin/update-grub
do_bootloader = no

参考:
GNU GRUB カーネル追加の為の設定

カーネルを 2.6 系にしたら色々と問題が出た

参考
http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt

  • make xconfig が動かない
    xconfig は Tk ではなく Qt で動くようになったので libqt3-mt-dev が必要です。 GTK+ で動く gconfig というものも追加されていますが、こちらは libglade2-dev が必要です。
  • モジュールが読み込まれなくなった
    modutils の替わりに module-init-tools が必要。
    モジュールの設定先も /etc/modutils から /etc/modprobe.d に変わってる。
  • 画面が表示されない/キーボードが効かない
    oldconfig で設定を引き継ぐとハマる問題。 Input device support などの項目が新設されてるからチェックしてみれ。
  • PS/2 マウスが動かなくなった
    デバイスドライバ:mousedev と、psmouse をロードする。 /etc/modules に上のドライバを二行に分けて追加する。 CONFIG_PNPACPI=y にすれば hotplug が読み込んでくれる?
  • PS/2 マウスの挙動がおかしくなった
    カーネルパラメータに psmouse.proto=bare を指定してみろ。
  • 動かないアプリが出た
    NPTL との互換性の問題かもしれない。
    $ LD_ASSUME_KERNEL=2.4.1 hoge
    $ LD_ASSUME_KERNEL=2.2.5 hoge
    みたいな感じで起動してみれ。
  • カスタム kernel を make-kpkg --initrd で作るとインストール出来ない。
    Setting up kernel-image-2.6.3 (debian) ...
    /usr/sbin/mkinitrd: add_modules_dep_2_5: modprobe failed
    FATAL: Module ata_piix not found.
    FATAL: Module sd_mod not found.
    Failed to create initrd image.
    dpkg: error processing kernel-image-2.6.3 (--install):
     subprocess post-installation script returned error exit status 9
     Errors were encountered while processing:
      kernel-image-2.6.3
    debian の initrd-tools は公式パッケージである kernel-image の為にあり、
    再構築したカーネルでの使用をサポートしていません。
    initrd-tools の mkinitrd はカーネル 2.6 の場合、sd_mod,ata_piix モジュールなど
    環境によっては起動に必須かもしれないものをすべて要求する為、
    それがない時に initrd の作成に失敗します。
    対策としては、initrd は諦めるということになります。
    自分で再構築したカーネルなわけですから initrd を作る意味はあまりないでしょう。
    起動に必要なものはモジュール化せずに組み込みましょう。
    カーネルのサイズを可能な限り小さくする (すべてをモジュール化する) ために
    initrd をどうしても使いたいという方は、
    sd_mod,ata_piix など mkinitrd が要求するものをモジュール化しておくか、
    /usr/sbin/mkinitrd を編集するということになります。 詳しくは Creating an initrd image on Debian GNU/Linux を見てください。
  • ビープが鳴らなくなった
    カーネル側で新しい項目が新設されてるから確認してみれ
    CONFIG_INPUT_PCSPKR
  • powerpc では nptl が使われてないみたい
    gcc-3.3 では使えない模様。

参考
BTS:246689

  • シャットダウン時に自動で電源が落ちなくなった
    マシンのACPIの仕様が古いのが原因です。 カーネルのブートオプションに"acpi=force"を加えると良いかも。

外部カーネルモジュールを再構築したい

  1. カーネルヘッダーを使う場合
    カーネルヘッダーと外部モジュールソースをインストールします。
    例えば alsa の場合は
    # aptitude install alsa-source linux-header-(カーネルのバージョン)
    alsa のソースを展開し、そのディレクトリの移動
    $ tar xvfj /usr/src/alsa-driver.tar.bz2
    $ cd module/alsa-driver/
    ビルド開始
    $ fakeroot debian/rules clean
    $ fakeroot debian/rules KSRC=/usr/src/linux-headers-(カーネルヘッダのバージョン) \
    KVERS=(カーネルのバージョン) KDREV=Custom binary-modules
    他のモジュールを作るときもほとんど一緒です。 参考:
    http://lists.debian.or.jp/debian-users/200210/msg00062.html
  2. カーネルソースが丸ごとある場合、カーネルヘッダーパッケージは要りません。
    モジュールの Makefile に KSRC みたいなカーネルソースのトップディレクトリを
    指定するような変数がある場合は、モジュールのディレクトリで
    $ make KSRC=/usr/src/linux-source-x.y.z
    とします。無い場合は以下の通りで。
    # aptitude install alsa-source
    alsa のソースを展開し、カーネルソースのトップディレクトリに移動
    $ tar xvfj /usr/src/alsa-driver.tar.bz2
    $ cd (カーネルソースのトップディレクトリ)
    $ MODULE_LOC="(alsa ソースを展開したディレクトリ)/modules" fakeroot make-kpkg modules-image
    # dpkg -i ../alsa-modules-*.deb
  3. sarge 以降であれば専用のツールである module-assistant を使うと簡単です。
    # aptitude install module-assistant
    カーネルヘッダーも必要なので、これもインストールしておきましょう。
    # aptitude install kernel-headers-(カーネルのバージョン)
    例えば cloop を再構築する場合は
    # module-assistant get cloop
    $ mkdir (作業ディレクトリ)/modass
    $ module-assistant --userdir="(作業ディレクトリ)/modass" build cloop
    # dpkg -i (作業ディレクトリ)/modass/cloop-modules-*.deb
    なお make-kpkg linux-headers で生成したカーネルヘッダーパッケージではうまく動きません。 カーネルソースを直接指定しましょう。
    $ KERNELDIRS="(カーネルソースのパス)" module-assistant --userdir="(作業ディレクトリ)/modass" build cloop

/etc/modules.conf にモジュールを追加したんですが、再起動したら消えちゃいました

/etc/modules.conf にも書いてあるとおり直接編集してはいけません。 /etc/modutils 下のファイルに書きましょう。 変更点を modules.conf に反映するには

# update-modules

また 2.6 系カーネルで module-init-tools を使っている場合は /etc/modprobe.d 下になります。 更に module-init-tools 3.1 以降では update-modules を実行する必要はありません。 /etc/modprobe.d 下を直接読んでくれます。

また起動時に読み込んでほしいモジュールは /etc/modules に書きましょう。 モジュールの読み込みは modconf 等を使うと簡単です。

etch で新しいカーネルパッケージが見つからないんだけど

2.6.12 以降では、Linux カーネルのパッケージ名が kernel-* から linux-* に変更されました。 例えば kernel-source-2.6.12 は linux-source-2.6.12 となっています。

カーネルモジュールに渡すオプションはどこで指定したらいいの?

2.6 系なら、モジュール hogemodule に対して hogeoption を渡したい場合は /etc/modprobe.d/hogemodule というファイルをつくって

options hogemodule hogeoption

という風に書けばいいらしい。

参考:
http://lists.debian.or.jp/debian-users/200511/msg00269.html



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-12 (金) 23:18:45 (3267d)