#topicpath

#contents

*Linux カーネルの FAQ [#v842f294]

-https://alioth.debian.org/projects/kernel/
--https://lists.alioth.debian.org/pipermail/kernel-svn-changes/
-https://alioth.debian.org/projects/kernel-handbook/
--https://kernel-handbook.alioth.debian.org/
--https://lists.alioth.debian.org/pipermail/kernel-handbook-general/
-https://lists.alioth.debian.org/mailman/listinfo/kernel-sec-discuss
-https://lists.debian.org/debian-kernel/
-https://wiki.debian.org/Kernel
--https://wiki.debian.org/CategoryKernel
--https://wiki.debian.org/KernelFAQ
--https://wiki.debian.org/DebianKernel
--https://wiki.debian.org/DebianKernelABIChanges
--https://wiki.debian.org/Modules
--https://wiki.debian.org/initramfs
---https://wiki.debian.org/Initrd
--https://wiki.debian.org/Firmware
---https://wiki.debian.org/KernelFirmwareLicensing
--https://wiki.debian.org/KernelModuleBlacklisting
//-http://kernel-archive.buildserver.net/
-http://merkel.debian.org/~jurij/
//-[[Kernel SVN Repository for Debian>http://svn.debian.org/wsvn/kernel]]
//--[[Debian のカーネルソースに適用されているパッチ>http://svn.debian.org/wsvn/kernel/dists/trunk/linux-2.6/debian/patches/]]
---[[そのパッケージ (linux-patch-debianlogo)>pkg:linux-patch-debianlogo]]
-https://wiki.debian.org/HowToRebuildAnOfficialDebianKernelPackage
--[[Rebuilding official Debian kernel packages>https://kernel-handbook.alioth.debian.org/ch-common-tasks.html]]
-初期 RAM ディスク (初期ルートファイルシステム) からの起動の流れ
--第 40 回 関西 Debian 勉強会 [["initramfs について">http://www.n-z.jp/presen/KansaiDebianMeeting20101024/KansaiDebianMeeting20101024.pdf]]
-Debian Project におけるカーネル開発プロセスの詳細
--[[第 64 回 東京エリア Debian 勉強会>https://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201005.pdf]]
[[4. Debian での Linux カーネルとの付き合い方>https://tokyodebian.alioth.debian.org/html/debianmeetingresume201005se4.html]]
---2010 年 5 月時点における、Debian のカーネル開発の体制やリリースサイクル、
Debian 公式パッケージの詳細についての情報があるので一度目を通したほうがよい。
(カーネル開発は刻一刻と変わるので、現在ではやや古い情報や誤りも一部あるというのは差し引いておくこと)

----

*注意 [#jb5e30ba]

以上の情報は Linux カーネルの公式バイナリパッケージを対象としています。
カスタムカーネルのつくり方など情報は [[カスタム Linux カーネルの FAQ>Software/LinuxKernel/Build]] にまとめてあります。

* CPU に最適化されたカーネルをインストールするには (jessie) &aname(linux_image); [#s09d1ff9]
Debian 4.0 (etch) 以降ではカーネルパッケージとして、linux-image-* という名前で用意されています。~
通常、Debian をインストールした際にはパッケージの中から CPU に対応したものが自動的にインストールされています。

-Intel 系 32bit CPU
--linux-image-3.16-586 ([[PAE>http://ja.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E6%8B%A1%E5%BC%B5]] をサポートしない古い CPU はこちら)
--linux-image-3.16-686-pae
-x86-64 CPU (AMD64, Intel 64 (例: Intel Core 2))
--linux-image-3.16-amd64
--i386 用インストーラで Debian をインストールした場合、上記 686 用パッケージがインストールされます。amd64 用インストーラを使用した場合、以下のパッケージが選択できます。
-仮想化機能を有効化したカーネル
--xen-linux-system-3.2.0-4-amd64
--[[Xen>http://ja.wikipedia.org/wiki/Xen_%28%E4%BB%AE%E6%83%B3%E5%8C%96%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29]] 用カーネルのみです。
*squeeze から wheezy の変更点 [#h16c08a6]
2011-05-21: 現時点では squeeze との違いは以下を除き、無いと思われます。
-openvz と vserver カーネルが廃止されました。
-"686"フレーバーが廃止され、"686-bigmem"フレーバーが"686-pae"にリネームされました。

*wheezy から jessie の変更点 [#u874dfb6]
-"486"フレーバーが廃止され、代わりに"586"フレーバーが追加されました。
-xen の i386 カーネルが廃止されました。

* カーネルインストール時に自動でブートローダ (GRUB, LILO) の設定を更新 &aname(update_grub); [#vd39a97d]

**sarge から lenny 迄 [#ia087a2a]
GRUB Legacy を使用している場合、
/usr/share/doc/grub/README.Debian の update-grub の項にあるように
/etc/kernel-img.conf というファイルを以下の内容で作成すると update-grub を自動的に実行してくれます。
 postinst_hook = update-grub
 postrm_hook = update-grub
 do_bootloader = no

**squeeze 以降 [#w3b2064b]
GRUB (Legacy, 2 双方) を使用している場合は 

/etc/kernel/post{inst,rm}.d/zz-update-grub というファイルがあることを確認します。
これは内部で update-grub を呼び出しています。
/etc/kernel-img.conf は、特に書き換える必要はありません。

参考までに、デフォルトで以下のようになっており、*_hook 関連の設定がなくなっていることが分かります。
squeeze 以降では *_hook 項目は廃止予定となっていますので、もしある場合は ''*_hook 項目を削除してください。''
 # Kernel image management overrides
 # See kernel-img.conf(5) for details
 do_symlinks = yes
 do_bootloader = no
 do_initrd = yes
 link_in_boot = no

また LILO については、squeeze 以降では GRUB と同様、/etc/kernel/post{inst,rm}.d/zz-lilo というファイルが用意されており、これは内部で /sbin/lilo を呼び出しています。
また[[メンテナスクリプト>Glossary#Maintainer_Scripts]] (post{inst,rm}) から /usr/sbin/update-lilo を呼び出し、/etc/lilo.conf の更新を行います。
これにより、カーネルイメージパッケージを導入・更新する際には LILO も自動的に更新されます。

*トラブル [#qd4b0619]

** etch のカーネルから lenny 以降のカーネルにアップグレードしたらルートファイルシステムが見えなくなった &aname(libata); [#uef8f38d]

Debian では以前のリリースと異なり  lenny v2.6.26 カーネルから (Debian インストーラも含め) 
libata が有効になっています。~
libata は SCSI サブシステムを使用している為、/dev/hda, hdb,... という命名規則ではなく、/dev/sda, sdb,... となります。~
これにより単純にアップグレードしただけでは、ルートファイルシステムが見えなくなり起動できなくなります。~
カーネルのアップグレード後、再起動する前に準備が必要です。~
ちなみに上流カーネルバージョン 2.6.33 以降でも CONFIG_IDE (ide-core ドライバ) は廃止予定 (Deprecated) となっています。 ~
今後は パラレル ATA (PATA)、 シリアル ATA (SATA) 問わず、CONFIG_ATA (libata) の移行が推奨されています。

-完全に移行するには、CONFIG_IDE を無効化 (=n) し、CONFIG_ATA=m (モジュール) もしくは =y (組み込み) としたカーネルをインストールします。
--しかし、一部の ATA デバイス、チップセットでは未だ libata 未対応なものもありますので、廃止されるまでの暫定的な対応として、
CONFIG_ATA =m するのと同時に CONFIG_IDE=m と関連ドライバも =m とし、(従って initramfs は必須です。)
カーネルコマンドラインに ''blacklist=(IDE ドライバモジュール名),(IDE ドライバモジュール名),(IDE ドライバモジュール名),...''
となるようブートローダに設定、正しく起動できるか試した上で blacklist 付きで運用するか、完全に CONFIG_IDE=n にしてしまう
方法もあります。
---例: Intel PIIX IDE の場合、IDE driver: piix を blacklist に入れて再起動し、lsmod 等で libata driver: ata_piix がロードできているかチェックします。
---initramfs-tools を使用している場合は、カーネルコマンドラインに追記する形でもよいし、/etc/modprobe.d/ide-blacklist.conf というファイルに
 blacklist ide-core
 blacklist ide-gd_mod
 blacklst ide-cd_mod
 blacklist piix
などと記載し、
 # update-initramfs -k (対象カーネルのバージョン) -u
を実行します。
-移行後は デバイスファイル名が /dev/hda などから /dev/''s''da に変化しますので、
libata を有効化したカーネルで起動する前に /etc/fstab, /etc/lilo.conf, /boot/grub/menu.lst 等の設定ファイルで 
/dev/hda などとなっている箇所を全て /dev/sda などに変更する必要があります。~
--ただし libata を無効化しているカーネルと共存している場合は、
単純に /dev/sdx 規則に書き換えてしまうと今度は libata が無効なカーネルで起動できなくなるので、
ファイルシステム作成時にわり振られる [[UUID>http://en.wikipedia.org/wiki/Universally_unique_identifier]] 
([[汎用一意識別子>http://ja.wikipedia.org/wiki/%E6%B1%8E%E7%94%A8%E4%B8%80%E6%84%8F%E8%AD%98%E5%88%A5%E5%AD%90]]) の利用もしくは
ボリュームラベル (LABEL) をつけて、UUID や LABELで設定ファイルに指定しておくと安全かつ /dev/xdx の命名規則に惑わされなくなります。
(但し全ての設定ファイルが対応しているわけではありません。)~
/etc/fstab ファイル (mount コマンド) ではパーティションの UUID や LABEL を認識します。~
lenny 以降ではデフォルトで /etc/fstab に UUID を指定しています。
sarge 以降の Debian インストーラでインストールした場合、ディスクパーティショニング (partman) 中に LABEL を設定できます。
---UUID または LABEL をチェックするには、[[util-linux>pkg:util-linux]] パッケージに含まれる、blkid を実行する。
 $ /sbin/blkid | grep /dev/sda1
 /dev/sda1: LABEL="rootfs" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"

---UUID は以下の方法でもチェックできる。
 $ ls -l /dev/disk/by-uuid | grep sda1
 lrwxrwxrwx 1 root root 10 2010-08-24 12:00 ''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'' -> ../../sda1

---lenny デフォルトインストール後の /etc/fstab はこの様になっている。
 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /               ext4    errors=remount-ro 0       1

---LABEL を新たに付けるには、
ext3 なら
 # tune2fs -L hogehoge /dev/hdx1
/etc/fstab は
 LABEL=hogehoge / ext3 defaults 0 1
GRUB Legacy の場合は、/boot/grub/menu.lst に
 kernel /boot/vmlinuz root=LABEL=hogehoge
と設定する。~
LILO (/etc/lilo.conf) も同様に。

---GRUB 2 では update-grub 実行時に自動的にパーティションの UUID を読み取って、/boot/grub/grub.cfg に書き込むため、何もする必要はありません。

--squeeze 2.6.32-11 以降では
 # dpkg-reconfigure -plow linux-base
を実行すると、ある程度の設定ファイル (/etc/fstab, /etc/default/grub, /boot/grub/menu.lst, /etc/lilo.conf, /etc/uswsusp.conf など) を自動的に書き換えてくれます。

--LABEL は可読性が良いですが、衝突の危険性があります。UUID は衝突する心配はありません。

--その他の設定ファイルは初回の再起動時にエラーが出ても良いならば無理に書き換える必要はありません。
---/etc/auto.* ([[autofs>pkg:autofs]]) は適宜書き換えて下さい。
書き換え方は以下の様な感じで UUID を使うと便利。 /etc/auto.mnt の例:
>sda1 -fstype=ntfs-3g,noauto,user,exec,umask=022 :''/dev/disk/by-uuid/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''
<
---/etc/default/hddtemp ([[hddtemp>pkg:hddtemp]]),
/etc/default/smartmontools ([[smartmontools>pkg:smartmontools]]) には
デバイスファイル名を書くとむしろ不具合が起きるので、デバイスファイル名を書かないデフォルトの設定ファイルで問題無し。
(UUID を自動で読み取っている)

-もし何も対処せずに再起動してしまった場合、[[リリースノート>https://www.debian.org/releases/lenny/releasenotes]]の 
"4.8.2. アップグレードの後で問題を解決するには'' を参考に復旧してください。

参考:~
-[[Linux ATA wiki>http://ata.wiki.kernel.org/]]
-[[UUIDを使ったディスクドライブ指定>http:/osdn.jp/magazine/08/09/18/0148228]]
-[[UUIDを使ったディスクドライブ指定>https:/osdn.jp/magazine/08/09/18/0148228]]
-[[Debian GNU/Linux 5.0 (lenny) リリースノート>https://www.debian.org/releases/lenny/releasenotes]]

**モジュールが読み込まれなくなった [#me7ec2c3]
//modutils の替わりに module-init-tools が必要。~
//モジュールの設定先も /etc/modutils から /etc/modprobe.d  に変わってる。
[[起動時にモジュールを読み込ませるには>#etc_modules]],
[[カーネルモジュールに渡すオプションはどこで指定したらいいの?>#kernel_option]] 参照。


**PS/2 マウスが動かなくなった [#r675ca51]
デバイスドライバ:mousedev と、psmouse をロードする。
/etc/modules に上のドライバを二行に分けて追加する。
//CONFIG_PNPACPI=y にすれば hotplug が読み込んでくれる?

**PS/2 マウスの挙動がおかしくなった [#zb6c9acd]
psmouse モジュールの自動認識に失敗したかもしれない。~
ブートパラメータに psmouse.proto=bare を指定するか、
psmouse のロード時に proto=bare オプションを加えるとうまくいくかもしれない。
 # modprobe -i psmouse proto=bare
bare だと2ボタン、imps だとホイール付きマウスと認識されます。~
その他、~
bare|imps|exps|lifebook|any~
が指定可能。(2.6.36)

//**動かないアプリが出た [#lcbd5018]
//NPTL との互換性の問題かもしれない。
// $ LD_ASSUME_KERNEL=2.4.1 hoge
// $ LD_ASSUME_KERNEL=2.2.5 hoge
//みたいな感じで起動してみれ。~
//[[プログラムが使用しているスレッドの調査・変更>Tips#pthread_check]] も参考に。

**pcspkr についての警告メッセージが出る [#oe58fdf2]
[[BTS:540831]], [[BTS:495674]]

/var/log/syslog をのぞくと、
 Aug 15 01:10:50 xxx kernel: [    6.295665] Error: Driver 'pcspkr' is already registered, aborting...
squeeze では alsa-base バージョン 1.0.21+dfsg-1 以降をインストールすると以後メッセージは消える。
(/etc/modprobe.d/alsa-base-blacklist.conf 参照。)~
lenny 以前で出る場合は、以下の内容を記載した、拡張子 conf のファイルを /etc/modprobe.d/ 以下に置き、
>blacklist snd-pcsp

そして、
 # update-initramfs -k (対象のカーネルバージョン、インストール済みカーネル全部なら all) -u
を実行する。

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

*カーネルを再構築したい [#nef2ea75]

// ちょっと長いので移動
[[カスタム Linux カーネルの FAQ>Software/LinuxKernel/Build]] 参照

*外部カーネルモジュールを構築したい &aname(ExternalKernelModule); [#v58c6bc4]

構築前に、まず各モジュールの README 等のドキュメントを読んで、事前準備を行って下さい。~
特に必須となる開発ツールやユーザランドのライブラリ、ヘッダ、
また[[カーネルコンフィグ>Software/LinuxKernel/Build#config]]、[[initrd の必要性>Software/LinuxKernel/Build#build_with_initramfs]]の有無は必ずチェックして下さい。~
その際、設定が足りない、もしくは不適切な設定があった等の理由でカーネルのコンフィグと再構築をやり直す必要がある場合は、
[[カーネル構築と同時に外部カーネルモジュールのビルドを行う方法>Software/LinuxKernel/Build#build_with_modules]]を選択してください。

-Debian によらず、v2.6 カーネルにおける外部モジュールの構築には
Kbuild インフラストラクチャを利用するのが一般的で、これは
カーネルソースのトップレベル Makefile と scripts/ ディレクトリ以下のユーティリティから構成されます。
(linux-kbuild-2.6.'''x''' パッケージの中身を見てください。)~
手順は原則以下の通りです。
--A. 外部カーネルモジュールソースのトップディレクトリに Makefile があり、
これにはモジュールファイル名と構成ソースが記述されています。
場合によっては Kbuild, Kconfig というコンフィグファイルやカーネルソース内のモジュールとの依存関係を記述したファイルも
あります。
--B. A. のファイルとソースコードのあるディレクトリで make modules を実行し、
make プロセス上で Kbuild インフラストラクチャのあるディレクトリ
((通常はカーネルヘッダーディレクトリ (/usr/src/linux-headers-2.6.'''x'''-'''ABI'''-'''SUBARCH''') もしくは、make-kpkg でビルドしたカーネルのトップディレクトリのこと))
に移動 (-C)、
モジュール出力先ディレクトリを適宜指定 (SUBDIRS もしくは M=`pwd`) します。
--C. ビルドが正常に終了すると *.ko ファイルがソースディレクトリにあるので
これを適切なディレクトリにコピーし、depmod -a を実行します。

-Debian では以下 ''1. Debian パッケージ化されたモジュールソースの場合'' における方法を推奨していますが、
いずれも Kbuild インフラストラクチャを内部で利用しています。
ユーザーはこのことについて知らずに容易に外部カーネルモジュールを構築できます。
 
-''2. Debian パッケージ化されていない場合'' については直接 Kbuild を利用する方法を説明しています。

**1. Debian パッケージ化されたモジュールソースの場合 [#u93ae2fb]

以下の手順、上から順番に試してみて下さい。
おそらくいずれかで出来るはずです。

**1.1 module-assistant [#vaa45bab]

[[Module Assistant - Debian Wiki>https://wiki.debian.org/ModuleAssistant]]

sarge 以降であれば専用のツールである module-assistant を使うと簡単です。
 # aptitude install module-assistant
作業前に /usr/src/linux (ファイル・ディレクトリ、リンク)がある場合は退避します。
 # mv /usr/src/linux /usr/src/linux-real
インストール後に以下を実行すると、
開発ツール群 (build-essential)、稼働中のカーネルバージョンと同じカーネルヘッダー (linux-headers-(バージョン) パッケージ)
がインストールされカーネルヘッダーのディレクトリから /usr/src/linux へのシンボリックリンクが張られます。
 # module-assistant prepare # またはコマンド名を短縮して m-a prepare
もしくは、
 # module-assistant
とターゲット無しで実行してダイアログフロントエンドを起動し、"PREPARE" を選択、実行してください。~
/usr/src/linux へのシンボリックリンク が適切に張られない場合、
またターゲットのカーネル≠ビルドシステム上でのカーネルの場合は
手動でターゲットカーネルのヘッダーディレクトリに張ってください。

 # ln -fs /usr/src/linux-headers-2.6.x-ABI-SUBARCH /usr/src/linux

基本的なコマンドの構文は以下です。

 $ module-assistant [オプション] ''ターゲット'' ''ターゲットモジュール''

次にモジュールソースをビルドします。

まずモジュールパッケージのリストを更新します。
 # module-assistant update
(情報ファイルは /var/cache/modass に格納されています。)

続いてモジュールのソースを取得し、ビルドします。

''1.1.1 単純ビルド''

例: cloop を再構築する場合は
 # module-assistant get cloop
 $ mkdir (作業ディレクトリ)/modass
 $ module-assistant --userdir="(作業ディレクトリ)/modass" --kernel-dir /usr/src/linux build cloop
(--userdir オプションは一般ユーザ所有のディレクトリでビルドする場合)

(作業ディレクトリ)/modass 以下に cloop-modules-*.deb があります。

''1.1.2 アーカイブ展開後にビルド''

カーネルの更新による API の変更等により独自にパッチ等を当てたい場合は、
ソースアーカイブを展開し、パッチを当てて、--not-unpack オプションでビルドします。

 # module-assistant get cloop
 $ mkdir -p ./modass/usr_src (modass の部分は任意)
 $ tar xf /usr/src/cloop.tar.bz2 -C ./modass/usr_src
 $ cd ./modass/usr_src/modules/cloop
 (patch -p1 < xxx.patch ...etc)
 $ cd ../../../../
 $ module-assistant --userdir ./modules --not-unpack --kernel-dir /usr/src/linux build cloop

''1.1.3 その他''
-~--text-mode オプションはフロントエンドを起動せず、コンソールモードで表示します。
-~--force オプションはパッケージビルド済でも強制的にビルドします。
-ターゲットモジュールに all を指定すると module-assistant 管理下のすべてのパッケージを対象とします。
-ターゲットモジュールに alli を指定するとインストール済みのモジュールソースパッケージすべてを対象とします。
-ターゲットモジュールに allu を指定すると展開済みのモジュールソースすべてを対象とします。
-install ターゲットはパッケージのインストールを行います。(ソースパッケージのビルド・インストールはしない)
-auto-install (短縮形 a-i)ターゲットは現在稼働中のカーネルに対し、
ソースパッケージのインストール、展開、ビルド、モジュールパッケージのインストールをすべて自動で行います。
auto-build (短縮形 a-b) ターゲットはビルドまで行います。

-その他のターゲット、オプションは man module-assistant(8) を参照。

**1.2 DKMS [#ha8ac241]
squeeze 以降では [[DKMS>pkg:dkms]] というツールもあります。~
こちらはカーネルの更新を検出すると自動で外部カーネルモジュールをビルドし、ロードするツールです。
-https://wiki.debian.org/KernelDKMS
-https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo
--[[DKMS 対応モジュール>https://packages.debian.org/search?keywords=dkms]]

事前にカーネルヘッダーもしくはビルド済みカーネルソースを用意しておきます。

**1.3 ビルド済みのカーネルソースが丸ごとある場合 [#wfd9a0e2]
make-kpkg コマンドでビルドしたフルカーネルソースがある場合は[[こちら>Software/LinuxKernel/Build#build_with_modules]]を参照してください。

**1.4 カーネルヘッダーを使いビルドする [#h3d182fe]
カーネルヘッダーと外部カーネルモジュールソースをインストールします。
例えば alsa の場合は
 # aptitude install alsa-source linux-header-(カーネルのバージョン)
alsa のソースを展開し、そのディレクトリの移動
 $ tar xf /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

もしくは、
 $ debuild -uc -us --set-envvar=KSRC=/usr/src/linux-headers-(カーネルヘッダーのバージョン) \
 --set-envvar=KVERS=(カーネルのバージョン) \
 --set-envvar=KDREV=Custom

とかでもビルドできます。
他のモジュールを作るときもほとんど一緒です。

参考~
https://lists.debian.or.jp/debian-users/200210/msg00062.html

**2. Debian パッケージ化されていない場合 [#m5e978bd]

Debian パッケージ化されていない場合、 もしくは ''1'' の手順で Debian パッケージが出来なかった場合、
残念ながら dpkg/apt の管理外になりますが、
外部カーネルモジュールをビルドする方法はあります。

例として、linux-image-2.6.32-5-686 をターゲットとしたカーネルモジュール (単純なビルド形式のモジュール) を作成したい場合を考えます。~
まず、linux-headers-2.6.32-5-686 パッケージをインストールします。~
インストール後、外部カーネルモジュールソースのトップディレクトリに入ります。
 $ cd /path/to/extmod
カーネル v2.6 対応モジュールの場合は、以下のような Makefile とソースコード
(例では subroutine_001.c subroutine_002.c main.c ) があります。~
Kbuild や Kconfig といったファイルもあるかもしれません。

 obj-m += extmod.o
 extmod-y := subroutine_001.o subroutine_002.o main.o
 #or,
 #extmod-objs := subroutine_001.o subroutine_002.o main.o
 
 ifndef PWD
 $(info Info: built-in $$(PWD) variable NOT defined. use result of command `pwd'.)
 PWD = $(shell pwd)
 endif
 
 UNAME_R = $(shell uname -r)
 
 KSRC = /lib/modules/$(UNAME_R)/build
 
 
 default: modules
 
 install: modules
        @if test root != $(shell whoami) ; then \
          echo "ERROR: Permission denied." ; \
          exit 1 ; \
         fi
 
        $(MAKE) modules_install
 
 modules modules_install clean:
         $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) $@

ビルドするシステムで稼働中のカーネル=ターゲットカーネル、即ちビルドするシステムのカーネルが 2.6.32-5-686 ならば
(uname -r で確認できます。)
 $ make
と実行すればビルド完了ですが、違う場合は以下の通りです。

''KSRC'' (変数名は任意なので、別名の可能性があります) という変数が
/lib/modules/`uname -r`/build というディレクトリを指し示していますが、実際に代入されるのは、
/lib/modules/(現在稼働中のカーネルのバージョン)/build となります。~
make-kpkg 等で作成したカーネルや公式カーネルヘッダーには実際にシンボリックリンクがあり、
フルビルド済みカーネルソースやカーネルヘッダーのトップディレクトリを指していることが分かります。~
しかしターゲットのカーネルバージョンが異なる場合はこれではまずいので、変数 KSRC をビルド中にオーバーライドします。
モジュールソースのトップディレクトリに入り、
 make KSRC=/usr/src/linux-headers-2.6.32-5-686
とします。~

そのような変数すらなく、ひどい場合は Makefile も無いかもしれません。
そのような場合でも、カーネルヘッダーさえあればビルドできます。

Kbuild というファイルを以下の内容で作成します。

 obj-m += extmod.o
 extmod-y := subroutine_001.o subroutine_002.o main.o

あとは、
 $ make -C /usr/src/linux-headers-2.6.32-5-686 SUBDIRS=`pwd` modules
とコマンドを叩けばおそらくビルドできるはずです。

正常にビルドできれば、extmod.ko があるはずなので、これをターゲットシステムの
/lib/modules/2.6.32-5-686/extmod
にコピーし、(ディレクトリがない場合は作成してください。)
 # depmod -a
してください。~

ビルドするシステムで稼働中のカーネル=ターゲットカーネルならば、
 # make install
と実行すれば、
/lib/modules/2.6.32-5-686/''extra'' にモジュール extmod.ko がインストールされ、depmod も自動的に実行されます。

こののち、
 $ /sbin/modinfo extmod
して以下の様な情報が表示されればシンボル解決はできています。

 filename:       /lib/modules/2.6.32-5-686/extmod/extmod.ko
 version:        hoge
 description:    fuga
 author:         foo
 license:        GPL
 depends:        bar
 vermagic:       2.6.32-5-686 SMP mod_unload modversions 686 
 parm:           baz
続いて
 # modprobe -i extmod
すればロードされるはずです。

*起動時にモジュールを読み込ませるには &aname(etc_modules); [#s8e7d8cb]
起動と同時に読み込んでほしいモジュールは /etc/initramfs-tools/modules に
 hogemodule1
 hogemodule2
という具合に書き、initrd を更新します。
 # dpkg-reconfigure linux-image-XXX

逆に読み込んでほしくないモジュールは /etc/modprobe.d ディレクトリ以下に、*.conf という名前のファイルを作成して
 blacklist hogemodule1
 blocklist hogemodule2
という具合に書き、initrd を更新します。
 # dpkg-reconfigure linux-image-XXX

ルートファイルシステムマウント後に読み込んでほしいモジュールは /etc/modules に書きます。

-[[KernelModuleBlacklisting>https://wiki.debian.org/KernelModuleBlacklisting]]
*カーネルモジュールに渡すオプションはどこで指定したらいいの? &aname(kernel_option); [#q993a083]
2.6 系なら、モジュール hogemodule に対して hogeoption を渡したい場合は /etc/modprobe.d/hogemodule.conf というファイルをつくって
>''options'' hogemodule hogeoption
<
と書く。~
initrd 読み込みの時点でモジュールを追加オプション付きでロードするには、
initramfs-tools をインストール後、/etc/initramfs-tools/modules に以下のように書き、
>hogemodule hogeoption
<
 # update-initramfs -k (対象カーネルのバージョン) -u
します。~
ただし、/etc/modprobe.d/hogemodule.conf と /etc/initramfs-tools/modules 
で対象となるモジュールのオプションに相違があるとエラーになりますので、一致させるよう注意してください。~
(もしくは、/etc/modprobe.d/hogemodule.conf では何も書かず、再ロードしないようにして下さい。)

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

*initrd の中身を見るには [#r7a03645]
 $ lsinitramfs /boot/initrd.img-(バージョン) | pager

*initrd の中身をカレントディレクトリに取り出すには [#x8496e70]
 $ zcat /boot/initrd.img-(バージョン) | cpio -i
*initrd にバイナリ、スクリプト等を追加するには [#jee42e7b]
man initramfs-tools(8) を参照すること。~
/etc/initramfs-tools/hook ディレクトリに以下のような内容のスクリプトファイルを実行権限付で置く。~
/bin/hoge を initrd 内の /bin に配置するスクリプト:

 #! /bin/sh
 
 PREREQ=""
 
 prereqs()
 {
   echo "$PREREQ"
 }
 
 case $1 in
   # get pre-requisites
   prereqs)
     prereqs
     exit 0
     ;;
 esac
 
 . /usr/share/initramfs-tools/hook-functions
 
 copy_exec /bin/hoge /bin

その後
 # update-initramfs -u -k (対象カーネルのバージョン)
バイナリに依存するライブラリも (/usr/bin/ldd で発見できるものに限り) すべてコピーされます。

その他、カーネルモジュールを強制ロードする方法などもマニュアルにあり。

* Kernel Modesetting (KMS) の有効化 &aname(kernel_modesetting); [#y29c45a6]
参考:~
-[[Debian GNU/Linux 6.0 (squeeze) -- リリースノート>https://www.debian.org/releases/squeeze/releasenotes]] -
2.1.6. カーネルモードセッティング (Kernel mode setting)
-[[Kernel Modesetting>https://wiki.debian.org/KernelModesetting]]
-[[X/KernelModeSetting>https://wiki.ubuntu.com/X/KernelModeSetting]]
-[[kernel mode setting>http://d.hatena.ne.jp/sasakyh/20100120]]

Kernel Modesetting (KMS) とは 元来 X 上で行っていたグラフィックカードの初期化や解像度設定をカーネルで行い、
Linux/X 環境の画像処理をより「スマート」にする仕組みです。

squeeze では KMS の仕組みが X と Linux カーネルに導入されています。
対応 H/W で稼働中の Debian を squeeze にアップグレードした後 X が正常に動作せず画面が真っ暗になっている場合は、
KMS がうまく動作していないかもしれません。
取り敢えず無効化したい場合は、カーネルコマンドライン、即ち /etc/default/grub 等で
>GRUB_CMDLINE_LINUX_DEFAULT="<他のパラメータ> <他のパラメータ>...''nomodeset''
<
というように nomodeset を付けると無効化できます。

squeeze では以下のグラフィックカードを搭載しているシステムでは KMS を有効化できます。
-[[AMD/ATI Radeon 系>http://wiki.x.org/wiki/radeon]]: 対応カードの詳細な情報は[[こちら>http://wiki.x.org/wiki/RadeonFeature]]
-[[Intel i9xx>http://intellinuxgraphics.org/]]: 対応カードの詳細な情報は[[こちら>http://wiki.x.org/wiki/IntelGraphicsDriver]]
-nVidia製カードもXドライバ [[xserver-xorg-video-nouveau>pkg:xserver-xorg-video-nouveau]] にて対応している。
[[xserver-xorg-video-nv>pkg:xserver-xorg-video-nv]](wheezyにて廃止),
[[xserver-xorg-video-vesa>pkg:xserver-xorg-video-vesa]],
そしてプロプライエタリな [[nvidia-glx>pkg:nvidia-graphics-drivers]] はいずれもKMSに対応していない。

squeeze 以降では以下の手順により、KMS を有効化できます。

**AMD/ATI Radeon 系の場合 [#x364fdd7]
-[[プロプライエタリドライバ (non-free, AMD が提供しているバイナリオンリーなドライバ)>pkg:fglrx-driver]]
をインストールしている場合は事前に削除してください。
-バージョン 2.6.29 以上 (ただし古いものはバグありなので極力最新) の Linux カーネルを以下のオプションを有効化して再構築する。
 CONFIG_DRM_RADEON=m もしくは y
 CONFIG_DRM_RADEON_KMS=y
-[[xserver-xorg-video-radeon>pkg:xserver-xorg-video-radeon]] バージョン 1:6.12.192-2  以降のパッケージをインストールする。
--インストール後、以下の内容が書かれた /etc/modprobe.d/radeon-kms.conf ファイルが存在することを確認。
 options radeon modeset=1
-Debian のソースを利用している場合はファームウェアがカーネルに無いため、
[[firmware-linux-nonfree>pkg:firmware-linux-nonfree]] パッケージをインストールする。
--ビデオカードに対応する /lib/firmware/radeon/*.bin ファイルが KMS 有効時に自動的にロードされる。
-該当するカーネルで起動した後、以下を実行する。
 # aptitude install xserver-xorg
 # X -configure
 # mv /root/xorg.conf.new /etc/X11/xorg.conf
続いて X を起動します。
 # aptitude install xinit (KDE, GNOME 等のデスクトップ環境でも可)
 # startx (もしくは KDM, GDM 等を起動)
次の 2 つのログにメッセージがあれば有効になっています。
--/var/log/syslog に以下のようなメッセージがある。
 # grep "kernel modesetting" /var/log/syslog
 Aug 21 10:30:08 xxx kernel: [    2.112034] [drm] radeon kernel modesetting enabled.
 Aug 21 10:30:08 xxx kernel: [    2.116610] [drm] initializing kernel modesetting (xxxxx 0xxxxx:0xxxxx).
--/var/log/Xorg.0.log に以下のようなメッセージがある。
 $ grep "KMS" /var/log/Xorg.0.log
 (II) [KMS] Kernel modesetting enabled.
-起動直後から KMS を有効化するには、
--''1.'' /etc/initramfs-tools/modules に 
 radeon modeset=1
を追記し、
 # update-initramfs -k (KMS を有効化したいカーネルのバージョン) -u
を実行。
--''2.'' カーネルコマンドラインに radeon.modeset=1 を追加し、vga=... 等 vesafb で使用するパラメータを全て削除してください。
(vesafb で使用しているパラメータは Documentation/fb/vesafb.txt を参照)~
GRUB 2 の場合、/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT に 上記の通りカーネルパラメータを編集して
 # update-grub
を実行。~
GRUB Legacy の場合は /boot/grub/menu.lst、LILO の場合は /etc/lilo.conf それぞれを編集し、設定を反映させる。
-カードが対応していれば自動的にフレームバッファも有効になっています。
 # grep drmfb /var/log/syslog
 Aug 21 10:30:08 xxx kernel: [    2.247733] fb0: radeondrmfb frame buffer device
 $ cat /proc/fb
 0 radeondrmfb
コンソール上で、fbterm を起動し、フレームバッファドライバがロードされていることを確認。
 $ fbterm -v
 ...
 [screen] driver: radeondrmfb, ...

**Intel i9xx の場合 [#s71ed5e3]
-バージョン 2.6.29 以上 (ただし古いものはバグありなので極力最新) の Linux カーネルを以下のオプションを有効化して再構築する。
 CONFIG_DRM_I915=m もしくは y
 CONFIG_DRM_I915_KMS=y
但し、squeeze では以下に書かれている説明の通り /etc/modprobe.d/i915-kms.conf に適切な設定がなされているので再構築は必要無いそうです。
-[[xserver-xorg-video-intel>pkg:xserver-xorg-video-intel]] バージョン 2:2.9.1-2 以降のパッケージをインストールする。
--インストール後、以下の内容が書かれた /etc/modprobe.d/i915-kms.conf ファイルが存在することを確認。
 options i915 modeset=1

>
squeeze の /usr/share/doc/xserver-xorg-video-intel/README.Debian (xserver-xorg-video-intel (2:2.13.0-2)) より
>>
- To enable KMS, either of those should be sufficient:
-- /etc/modprobe.d/i915-kms.conf should contain:
 options i915 modeset=1
-- CONFIG_DRM_I915_KMS=y should be set in the kernel config.
<<
xserver-xorg-video-intel パッケージにより /etc/modprobe.d/i915-kms.conf はセットされているため、
squeeze のカーネル (2.6.32) 再構築 (CONFIG_DRM_I915_KMS=y) は不要。~
ただし、 kernel 2.6.38 ではどうも状況が違うらしく、''起動直後から KMS を有効にするには'' CONFIG_DRM_I915_KMS=y が必要。
squeeze-backports のカーネルでは CONFIG_DRM_I915_KMS=y が有効になっている。
<
-該当するカーネルで起動した後、以下を実行する。
 # aptitude install xserver-xorg
 # X -configure
 # mv /root/xorg.conf.new /etc/X11/xorg.conf
続いて X を起動します。
 # aptitude install xinit (KDE, GNOME 等のデスクトップ環境でも可)
 # startx (もしくは KDM, GDM 等を起動)
次の 2 つのログにメッセージがあれば有効になっています。
--/var/log/syslog に以下のようなメッセージがある。
 # pager /var/log/syslog
 ...
 Aug 21 10:30:08 xxx kernel: [    2.760091] fb0: inteldrmfb frame buffer device
(フレームバッファに intelfb ではなく、inteldrmfb が使われている)
--/var/log/Xorg.0.log に以下のようなメッセージがある。
 $ grep "KMS" /var/log/Xorg.0.log
 (II) [KMS] Kernel modesetting enabled.
-起動直後から KMS を有効化するには、
--''1.'' /etc/initramfs-tools/modules に 
 i915 modeset=1
を追記し、
 # update-initramfs -k (KMS を有効化したいカーネルのバージョン) -u
を実行。
--''2.'' カーネルコマンドラインに i915.modeset=1 を追加し、vga=... 等 vesafb で使用するパラメータを全て削除してください。
(vesafb で使用しているパラメータは Documentation/fb/vesafb.txt を参照)~
GRUB 2 の場合、/etc/default/grub の GRUB_CMDLINE_LINUX_DEFAULT に 上記の通りカーネルパラメータを編集して
 # update-grub
を実行。~
GRUB Legacy の場合は /boot/grub/menu.lst、LILO の場合は /etc/lilo.conf それぞれを編集し、設定を反映させる。
-カードが対応していれば自動的にフレームバッファ (inteldrmfb) も有効になっています。
 # grep drmfb /var/log/syslog
 Aug 21 10:30:08 xxx kernel: [    2.247733] fb0: inteldrmfb frame buffer device
 $ cat /proc/fb
 0 inteldrmfb
コンソール上で、fbterm を起動し、フレームバッファドライバがロードされていることを確認。
 $ fbterm -v
 ...
 [screen] driver: inteldrmfb, ...

*マシンをサスペンド・ハイバネーションするには? &aname(suspend); [#g943afe5]
[[こちら>Software/Suspend]]に移動しました。

*i486 向けカーネルはなくなったの? [#n13fa30c]
jessie からなくなりました。
理由を簡単に説明すると、i486 は GCC のセキュリティ機能を有効にしてビルドできなかったため切り捨てられました。
詳しくは[[BTS:766105]]。

*カーネルのファイル名 "vmlinuz" ってなに? [#n64a76ee]
-"vm" は仮想メモリ (Virtual Memory) をサポートしていることを示している。
-"z" は圧縮されている (gZipped) ことを示している。

つまり "vmlinuz" は、圧縮された仮想メモリをサポートする linu(x) ですよ、となる。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS