「動的カーネルモジュールサポート」の版間の差分
Kusakata.bot (トーク | 投稿記録) Pkg/AUR テンプレートの更新 |
Kusanaginoturugi (トーク | 投稿記録) →参照: add TranslationStatus. |
||
| (4人の利用者による、間の10版が非表示) | |||
| 7行目: | 7行目: | ||
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
||
これはユーザーが会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。[[Pacman#フック]]が導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。 |
|||
== インストール == |
== インストール == |
||
{{pkg|dkms}} パッケージ |
{{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] にあります。 |
||
* [[AMD Catalyst]]: {{AUR|catalyst-dkms}}。 |
|||
* [[NVIDIA]]: |
|||
** {{Pkg|nvidia-dkms}} |
|||
** {{AUR|nvidia-340xx-dkms}} |
|||
** {{AUR|nvidia-304xx-dkms}}{{Broken package link|{{aur-mirror|nvidia-304xx-dkms}}}} |
|||
** {{AUR|nvidia-173xx-dkms}} |
|||
** {{AUR|nvidia-96xx-dkms}} |
|||
* [[VirtualBox]]: |
|||
** {{Pkg|virtualbox-host-dkms}} |
|||
** {{Pkg|virtualbox-guest-dkms}} |
|||
* [[VMware]]。 |
|||
== アップグレード == |
== アップグレード == |
||
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。[[pacman]] の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。 |
|||
{{Note|[[Pacman]] は DKMS モジュールをリビルドする際に依存関係を解決しません。DKMS モジュールが他のモジュールに依存する場合、ビルドが失敗する可能性があります (例: {{AUR|zfs-dkms}})。詳しくはバグレポート {{Bug|52901}} を参照してください。{{AUR|dkms-sorted}}{{Broken package link|パッケージが存在しません}} パッケージをインストールすることで依存関係の実験的なサポートが追加されます。技術的には `dkms` パッケージが完全に代替されます。DKMS モジュールをインストールする前に dkms-sorted のインストールを試すことができます。}} |
|||
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。pacman の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。 |
|||
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。 |
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。 |
||
| 85行目: | 71行目: | ||
== 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 のデフォルトビルドディレクトリです): |
|||
/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}} は自動的に呼び出されます。 |
|||
== 参照 == |
== 参照 == |
||
* [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 ディスクイメージの再生成手順を自動化できます。
例えば、linux と mkinitcpio を使用している場合に、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 フックの後に実行されるようにするために必要であることに注意してください。