「Dynamic Kernel Module Support」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(update Pkg/AUR templates)
(→‎初期 RAM ディスク: リンクの修正)
 
(6人の利用者による、間の16版が非表示)
7行目: 7行目:
 
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。
 
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。
   
DKMS を使用する''プラス効果''ネルアップグレードされるときにモジュールをリビルドできることです。これはつまり会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。[[Pacman#フック]]が導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。
+
これユーザーが会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。[[Pacman#フック]]が導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。
   
 
== インストール ==
 
== インストール ==
   
[[公式リポジトリ]]から {{pkg|dkms}} をインストールしてください。また、使用しているカーネルにあったヘッダーをインストールしてください (標準カーネルの場合 {{Pkg|linux-headers}} )
+
{{pkg|dkms}} パッケージとターゲッ/カーネルヘッダーを[[インストール]]してください。例えば、デフォルトの {{pkg|linux}} カーネルの場合は、{{pkg|linux-headers}} になります。他のカーネルの場合は、それぞれ独自のヘッダーパッケージがあります。
   
カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは [https://www.archlinuxjp.org/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。以下のリストは DKMS のモジュールが存在するソフトウェアパッケージのひと握りです (wiki のページに DKMS についてのセクションがある場合はそのリンクを付しています):
+
カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは [https://www.archlinux.jp/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。
 
* [[AMD Catalyst]]: {{AUR|catalyst-dkms}}。
 
* [[NVIDIA]]:
 
** {{Pkg|nvidia-dkms}}
 
** {{Pkg|nvidia-304xx-dkms}}
 
** {{AUR|nvidia-173xx-dkms}}
 
** {{AUR|nvidia-96xx-dkms}}
 
** {{AUR|nvidia-grsec-dkms}}{{Broken package link|package not found}}
 
* [[VirtualBox]]:
 
** {{Pkg|virtualbox-host-dkms}}
 
** {{Pkg|virtualbox-guest-dkms}}
 
* [[VMware]]。
 
   
 
== アップグレード ==
 
== アップグレード ==
   
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。pacman の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。
+
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。[[pacman]] の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。
   
 
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。
 
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。
83行目: 71行目:
 
== DKMS パッケージの作成 ==
 
== DKMS パッケージの作成 ==
   
以下は DKMS パッケージを作成するときのガイドラインです
+
[[DKMS パッケージガイドライン]] を見てください
 
=== パッケージの名前 ===
 
 
DKMS パッケージは公式のパッケージ名に "''-dkms''" を加えた名前を付けます。
 
 
"''-dkms''" を削ったパッケージ名を表すのによく {{ic|$pkgname}} の下に {{ic|$_pkgname}} 変数が使われます (例: {{ic|1=_pkgname=${pkgname%-*} }})。公式パッケージの PKGBUILD と DKMS パッケージの同じ部分を残しておくのに便利です。
 
 
=== 依存パッケージ ===
 
 
依存パッケージは元のパッケージから継承するのに加えて、{{pkg|dkms}} を追加して {{pkg|linux-headers}} を削除します (dkms パッケージは''任意パッケージ''として並べられます)。
 
 
=== ビルドソースの場所 ===
 
 
ビルドソースは次の場所に配置します (DKMS のデフォルトビルドディレクトリです):
 
 
/usr/src/''PACKAGE_NAME''-''PACKAGE_VERSION''
 
 
パッケージディレクトリ内の、モジュールのビルド方法を記述した DKMS の設定 ({{ic|dkms.conf}}) には {{ic|PACKAGE_NAME}} と {{ic|PACKAGE_VERSION}} 変数を含めます。
 
 
* {{ic|PACKAGE_NAME}} - 実際のプロジェクト名 (通常は {{ic|$_pkgname}} または {{ic|$_pkgbase}})。
 
* {{ic|PACKAGE_VERSION}} - {{ic|$pkgver}} にするのが慣例です。
 
 
=== パッチ ===
 
 
PKGBUILD または {{ic|dkms.conf}} でソースにパッチを適用できます。
 
 
=== .install でモジュールを自動的にロード ===
 
 
モジュールのロードやアンロードはユーザーが行うようにしてください。モジュールがロードされたときにクラッシュする可能性を考慮します。
 
 
=== namcap の出力 ===
 
 
どんなパッケージでも一度は [[namcap]] (パッケージ内のよくあるミスや標準にないことをしていないか確認します) を通しておくと良いでしょう。ただし、namcap はまだ DKMS 特有のガイドラインに対応していません。
 
 
例えば、DKMS はデフォルトで {{ic|/usr/src/}} を使用しますが、Namcap はこのディレクトリを非標準のディレクトリと判断します。
 
 
=== サンプル ===
 
 
以下はパッケージ名とバージョンにあわせて {{ic|dkms.conf}} を編集するサンプルパッケージです。
 
 
==== PKGBUILD ====
 
 
{{hc|PKGBUILD|2=
 
# Maintainer: foo <foo(at)gmail(dot)com>
 
# Contributor: bar <bar(at)gmai(dot)com>
 
 
_pkgbase=amazing
 
pkgname=amazing-dkms
 
pkgver=1
 
pkgrel=1
 
pkgdesc="The Amazing kernel modules (DKMS)"
 
arch=('i686' 'x86_64')
 
url="https://www.amazing.com/"
 
license=('GPL2')
 
depends=('dkms')
 
conflicts=("${_pkgbase}")
 
install=${pkgname}.install
 
source=("${url}/files/tarball.tar.gz"
 
'dkms.conf'
 
'linux-3.14.patch')
 
md5sums=(''use <nowiki>'</nowiki>updpkgsums''')
 
 
build() {
 
cd ${_pkgbase}-${pkgver}
 
 
# Patch
 
patch -p1 -i "${srcdir}"/linux-3.14.patch
 
 
# Build
 
msg2 "Starting ./configure..."
 
./configure
 
 
msg2 "Starting make..."
 
make
 
}
 
 
package() {
 
# Install
 
msg2 "Starting make install..."
 
make DESTDIR="${pkgdir}" install
 
 
# Copy dkms.conf
 
install -Dm644 dkms.conf "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf
 
 
# Set name and version
 
sed -e "s/@_PKGBASE@/${_pkgbase}/" \
 
-e "s/@PKGVER@/${pkgver}/" \
 
-i "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/dkms.conf
 
 
# Copy sources (including Makefile)
 
cp -r ${_pkgbase}/* "${pkgdir}"/usr/src/${_pkgbase}-${pkgver}/
 
}
 
}}
 
 
==== dkms.conf ====
 
 
{{hc|dkms.conf|2=
 
PACKAGE_NAME="@_PKGBASE@"
 
PACKAGE_VERSION="@PKGVER@"
 
MAKE[0]="make --uname_r=$kernelver"
 
CLEAN="make clean"
 
BUILT_MODULE_NAME[0]="@_PKGBASE@"
 
DEST_MODULE_LOCATION[0]="/kernel/drivers/misc"
 
AUTOINSTALL="yes"
 
}}
 
 
==== .install ====
 
 
{{ic|depmod}} の代わりに {{ic|dkms install}} を使うことができます ({{ic|dkms build}} に依存しており、さらにそこから {{ic|dkms add}} が使われます):
 
   
  +
== 初期 RAM ディスク ==
{{hc|amazing-dkms.install|
 
# old version (without -$pkgrel): ${1%%-*}
 
# new version (without -$pkgrel): ${2%%-*}
 
   
  +
[[Wikipedia:ja:initrd|初期 RAM ディスク]] 内で使用されているカーネルモジュールを DKMS を通してインストールした場合(例: {{AUR|zfs-dkms}})、[[pacman]] フックを記述して初期 RAM ディスクイメージの再生成手順を自動化できます。
post_install() {
 
dkms install ''amazing''/${1%%-*}
 
}
 
   
  +
例えば、{{Pkg|linux}} と [[mkinitcpio]] を使用している場合に、{{AUR|zfs-dkms}} がアップグレードされる度に [[ZFS]] モジュールを更新するには:
pre_upgrade() {
 
pre_remove ${2%%-*}
 
}
 
   
  +
{{hc|1=/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook|2=[Trigger]
post_upgrade() {
 
  +
Operation=Install
post_install ${1%%-*}
 
  +
Operation=Upgrade
}
 
  +
Operation=Remove
  +
Type=Package
  +
Target=zfs-dkms
  +
Target=linux
   
  +
[Action]
pre_remove() {
 
  +
Description=Update dkms modules in Linux initcpio
dkms remove ''amazing''/${1%%-*} --all
 
  +
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'}}
   
  +
他のカーネルをインストールしている場合には、フックに target を追加したり、フックの追加コピーを作成したりもできます。{{ic|90-}} 接頭辞は、フックが DKMS フックの後に実行されるようにするために必要であることに注意してください。
{{Tip|DKMS パッケージはできるだけ元のパッケージに合わせるようにしてください: DKMS 関連のことでパッケージファイルを乱してはいけません (例: アップデートが必要なバージョン番号)。}}
 
   
 
== 参照 ==
 
== 参照 ==
   
* [http://www.linuxjournal.com/article/6896 Linux Journal: Exploring Dynamic Kernel Module Support]
+
* [https://www.linuxjournal.com/article/6896 Linux Journal: Exploring Dynamic Kernel Module Support]

2022年4月20日 (水) 12:08時点における最新版

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 パッケージガイドライン を見てください。

初期 RAM ディスク

初期 RAM ディスク 内で使用されているカーネルモジュールを DKMS を通してインストールした場合(例: zfs-dkmsAUR)、pacman フックを記述して初期 RAM ディスクイメージの再生成手順を自動化できます。

例えば、linuxmkinitcpio を使用している場合に、zfs-dkmsAUR がアップグレードされる度に ZFS モジュールを更新するには:

/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'

他のカーネルをインストールしている場合には、フックに target を追加したり、フックの追加コピーを作成したりもできます。90- 接頭辞は、フックが DKMS フックの後に実行されるようにするために必要であることに注意してください。

参照