動的カーネルモジュールサポート
Wikipedia より:
- Dynamic Kernel Module Support (DKMS) はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。
これはユーザーが会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。Pacman#フックが導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。
目次
インストール
dkms パッケージとターゲットカーネル/カーネルヘッダーをインストールしてください。例えば、デフォルトの linux カーネルの場合は、linux-headers になります。他のカーネルの場合は、それぞれ独自のヘッダーパッケージがあります。
カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは 公式リポジトリ にも存在しますが、ほとんどのモジュールは AUR にあります。
アップグレード
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。pacman の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や公式リポジトリに存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。
使用方法
DKMS を手動で使用する方法です。
タブ補完は次を実行することで使えます:
# source /usr/share/bash-completion/completions/dkms
モジュールの確認
モジュールの現在の状態、バージョンやツリーのカーネルを確認するには:
$ dkms status
モジュールのリビルド
全てのモジュールをリビルド:
# dkms autoinstall
もしくは特定のカーネルのモジュールをリビルド:
# dkms autoinstall -k 3.16.4-1-ARCH
特定のモジュールをビルド (例: 現在使用しているカーネル):
# dkms install -m nvidia -v 334.21
もしくは:
# dkms install nvidia/334.21
全てのカーネルでモジュールをビルドするには:
# dkms install nvidia/334.21 --all
モジュールの削除
モジュールを削除するには (古いモジュールが勝手に削除されることはありません):
# dkms remove -m nvidia -v 331.49 --all
もしくは:
# dkms remove nvidia/331.49 --all
dkms パッケージを削除した場合、モジュールのビルドファイルに関連する情報が消失します。その場合 /usr/lib/modules/KERNELVERSION-ARCH
から使用しないファイルやディレクトリを削除してください。
DKMS パッケージの作成
DKMS パッケージガイドライン を見てください。
Initial ramdisk
In case you've got any kernel modules installed via DKMS that are used in initial ramdisk, e.g. zfs-dkmsAUR, you may want to write a pacman hook to automate the process of regenerating initramfs image(s).
For example, when using linux and mkinitcpio, to update ZFS module after each zfs-dkmsAUR upgrade,
/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook
[Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package Target=zfs-dkms Target=linux [Action] Description=Update dkms modules in Linux initcpio Depends=mkinitcpio When=PostTransaction NeedsTargets Exec=/bin/sh -c 'while read -r trg; do case $trg in linux) exit 0; esac; done; /usr/bin/mkinitcpio -p linux'
You may add more targets to the hook and make additional copies of the hook if you've installed other kernels. Note the 90-
prefix is necessary to make sure it runs after the DKMS hooks.