コンテンツにスキップ

「動的カーネルモジュールサポート」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
同期
参照: add TranslationStatus.
 
(5人の利用者による、間の14版が非表示)
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.archlinux.jp/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-340xx-dkms}}
** {{AUR|nvidia-304xx-dkms}}
** {{AUR|nvidia-173xx-dkms}}
** {{AUR|nvidia-96xx-dkms}}
* [[VirtualBox]]:
** {{Pkg|virtualbox-host-dkms}}
** {{Pkg|virtualbox-guest-dkms}}
* [[VMware]]。


== アップグレード ==
== アップグレード ==


{{Note|[[Pacman]] は DKMS モジュールリビルドする際に依存関係を解決しません。DKMS モジュール他のモジュールに依存する場合、ビルドが失敗する可能性があります (例: {{AUR|zfs-dkms}})詳しくはバグレポート {{Bug|52901}}参照してください。{{AUR|dkms-sorted}} パッケージをインストールすることで依存関係実験的なサポートが追加されます。技術的 `dkms` パッケージが完全に代替されます。DKMS モジュールをインールする前に dkms-sorted のインストールことがきます。}}
大抵カーネルのアップグレード時に DKMS モジュールリビルドが行われますが、ビルドが失敗する可能性がときどきあります。[[pacman]] の出力よく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカタムカ DKMS使用る場合は特に重要です。

大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。pacman の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。


カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。
85行目: 71行目:
== DKMS パッケージの作成 ==
== DKMS パッケージの作成 ==


以下は DKMS パッケージを作成するときのガイドラインです
[[DKMS パッケージガイドライン]] を見てください


== 初期 RAM ディスク ==
=== パッケージの名前 ===


[[Wikipedia:ja:initrd|初期 RAM ディスク]] 内で使用されているカーネルモジュールを DKMS を通してインストールした場合(例: {{AUR|zfs-dkms}})、[[pacman]] フックを記述して初期 RAM ディスクイメージの再生成手順を自動化できます。
DKMS パッケージは公式のパッケージ名に "''-dkms''" を加えた名前を付けます。


例えば、{{Pkg|linux}} と [[mkinitcpio]] を使用している場合に、{{AUR|zfs-dkms}} がアップグレードされる度に [[ZFS]] モジュールを更新するには:
"''-dkms''" を削ったパッケージ名を表すのによく {{ic|$pkgname}} の下に {{ic|$_pkgname}} 変数が使われます (例: {{ic|1=_pkgname=${pkgname%-*} }})。公式パッケージの PKGBUILD と DKMS パッケージの同じ部分を残しておくのに便利です。


{{hc|1=/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook|2=[Trigger]
=== 依存パッケージ ===
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=zfs-dkms
Target=linux


[Action]
依存パッケージは元のパッケージから継承するのに加えて、{{pkg|dkms}} を追加して {{pkg|linux-headers}} を削除します (dkms パッケージは''任意パッケージ''として並べられます)。
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 を追加したり、フックの追加コピーを作成したりもできます。{{ic|90-}} 接頭辞は、フックが DKMS フックの後に実行されるようにするために必要であることに注意してください。
=== ビルドソースの場所 ===


== 参照 ==
ビルドソースは次の場所に配置します (DKMS のデフォルトビルドディレクトリです):


* [https://www.linuxjournal.com/article/6896 Linux Journal: Exploring Dynamic Kernel Module Support]
/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|depmod}} を明示的に呼び出す必要はありません。Pacman はフックによって自動的に DKMS の {{ic|dkms install}} と {{ic|dkms remove}} を実行します。{{ic|dkms install}} によって最後に必ず {{ic|depmod}} が呼びだれます。{{ic|dkms install}} は {{ic|dkms build}} に依存しており (最新カーネルに対してソースがビルドされます)、さらに {{ic|dkms build}} は {{ic|dkms add}} に依存しています ({{ic|/var/lib/dkms/<package>/<version>/source}} から {{ic|/usr/src/<package>}} にシンボリックリンクが張られます)。

=== サンプル ===

以下はパッケージ名とバージョンにあわせて {{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

}

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 ====

pacman には DKMS フックが実装されており、.install ファイルで DKMS 固有の設定を指定する必要はありません。{{ic|dkms install}} や {{ic|dkms remove}} は自動的に呼び出されます。

== 参照 ==


* [http://www.linuxjournal.com/article/6896 Linux Journal: Exploring Dynamic Kernel Module Support]
{{TranslationStatus|Dynamic Kernel Module Support|2024-09-11|801840}}

2024年9月11日 (水) 20:30時点における最新版

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 フックの後に実行されるようにするために必要であることに注意してください。

参照

翻訳ステータス: このページは en:Dynamic Kernel Module Support の翻訳バージョンです。最後の翻訳日は 2024-09-11 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。