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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎アップグレード: 英語版を元に修正)
(→‎参照: add TranslationStatus.)
 
(3人の利用者による、間の5版が非表示)
11行目: 11行目:
 
== インストール ==
 
== インストール ==
   
{{pkg|dkms}} パッケージとターゲットカーネル/カーネルヘッダーを][[[インストール]]してください。例えば、デフォルトの {{pkg|linux}} カーネルの場合は、{{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 のパッケージが作られています。いくらかは [https://www.archlinux.jp/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。
71行目: 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 パッケージの同じ部分を残しておくのに便利です。
 
 
=== 依存パッケージ ===
 
 
依存パッケージは元のパッケージから継承するのに加えて、{{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|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}} は自動的に呼び出されます。
 
 
== Initial ramdisk ==
 
 
In case you've got any kernel modules installed via DKMS that are used in [[Wikipedia:Initial ramdisk|initial ramdisk]], e.g. {{AUR|zfs-dkms}}, you may want to write a [[pacman]] hook to automate the process of regenerating initramfs image(s).
 
 
For example, when using {{Pkg|linux}} and [[mkinitcpio]], to update [[ZFS]] module after each {{AUR|zfs-dkms}} upgrade,
 
   
 
{{hc|1=/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook|2=[Trigger]
 
{{hc|1=/etc/pacman.d/hooks/90-mkinitcpio-dkms-linux.hook|2=[Trigger]
199行目: 94行目:
 
Exec=/bin/sh -c 'while read -r trg; do case $trg in linux) exit 0; esac; done; /usr/bin/mkinitcpio -p linux'}}
 
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 フックの後に実行されるようにするために必要であることに注意してください。
You may add more targets to the hook and make additional copies of the hook if you've installed other kernels. Note the {{ic|90-}} prefix is necessary to make sure it runs after the DKMS hooks.
 
   
 
== 参照 ==
 
== 参照 ==
   
 
* [https://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]
  +
  +
{{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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。