「動的カーネルモジュールサポート」の版間の差分
Add Chinese page link |
Kusanaginoturugi (トーク | 投稿記録) →参照: add TranslationStatus. |
||
| (8人の利用者による、間の26版が非表示) | |||
| 2行目: | 2行目: | ||
[[en:Dynamic Kernel Module Support]] |
[[en:Dynamic Kernel Module Support]] |
||
[[ru:Dynamic Kernel Module Support]] |
[[ru:Dynamic Kernel Module Support]] |
||
[[zh- |
[[zh-hans:Dynamic Kernel Module Support]] |
||
[[wikipedia:Dynamic_Kernel_Module_Support|Wikipedia]] より: |
[[wikipedia:Dynamic_Kernel_Module_Support|Wikipedia]] より: |
||
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
||
これはユーザーが会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。[[Pacman#フック]]が導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。 |
|||
== 効果 == |
|||
DKMS を使用する''プラス効果''はカーネルがアップグレードされるときにモジュールをリビルドできることです。これはつまり会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。 |
|||
DKMS を使用する''マイナス効果''は DKMS は Pacman のデータベースを破壊することです。作成されたモジュールはパッケージに属さないことになり、Pacman はモジュールを追跡できないという問題があります。ただし理論上は、フックを使ってサポートを追加することができます (参照: {{Bug|2985}})。 |
|||
== インストール == |
== インストール == |
||
{{pkg|dkms}} パッケージとターゲットカーネル/カーネルヘッダーを[[インストール]]してください。例えば、デフォルトの {{pkg|linux}} カーネルの場合は、{{pkg|linux-headers}} になります。他のカーネルの場合は、それぞれ独自のヘッダーパッケージがあります。 |
|||
[[公式リポジトリ]]から {{pkg|dkms}} をインストールしてください。 |
|||
カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは [https://www.archlinux.jp/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。 |
|||
{{ic|dkms}} [[systemd]] サービスを有効にすればカーネルをアップグレードした後の再起動時に DKMS モジュールが自動的にリビルドされるようになります。 |
|||
== アップグレード == |
|||
カーネルのソースツリーの外にあるモジュールについてはかなりの数 DKMS のパッケージが作られています。いくらかは [https://www.archlinux.org/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。以下のリストは DKMS のモジュールが存在するソフトウェアパッケージのひと握りです (wiki のページに DKMS についてのセクションがある場合はそのリンクを付しています): |
|||
大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。[[pacman]] の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。 |
|||
* [[AMD Catalyst|AMD Catalyst]]: {{AUR|catalyst-dkms}}; |
|||
* [[NVIDIA|NVIDIA]]: {{AUR|nvidia-dkms}}, {{AUR|nvidia-304xx-dkms}}, {{AUR|nvidia-173xx-dkms}}, {{AUR|nvidia-96xx-dkms}}; |
|||
* [[VirtualBox|VirtualBox]], セクション [[VirtualBox#ホストでカスタムカーネルを使っている場合|VirtualBox#ホストでカスタムカーネルを使っている場合]]; |
|||
* [[VMware|VMware]], セクション [[VMware#DKMS を使ってモジュールを管理する|VMware#DKMS を使ってモジュールを管理する]]。 |
|||
カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。 |
|||
== アップグレード == |
|||
大抵はカーネルがアップグレードしてもモジュールをリビルドすることができますが、ときどきパッケージのアップグレードが必要になることがあります。カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。 |
|||
== 使用方法 == |
== 使用方法 == |
||
| 37行目: | 28行目: | ||
# source /usr/share/bash-completion/completions/dkms |
# source /usr/share/bash-completion/completions/dkms |
||
=== モジュールの確認 === |
|||
モジュールの現在の状態、バージョンやツリーのカーネルを確認するには: |
|||
$ dkms status |
|||
=== モジュールのリビルド === |
=== モジュールのリビルド === |
||
| 42行目: | 39行目: | ||
全てのモジュールをリビルド: |
全てのモジュールをリビルド: |
||
# dkms autoinstall |
# dkms autoinstall |
||
もしくは特定のカーネルのモジュールをリビルド: |
もしくは特定のカーネルのモジュールをリビルド: |
||
| 50行目: | 47行目: | ||
''特定の''モジュールをビルド (例: 現在使用しているカーネル): |
''特定の''モジュールをビルド (例: 現在使用しているカーネル): |
||
# dkms install -m nvidia -v 334.21 |
# dkms install -m nvidia -v 334.21 |
||
もしくは: |
もしくは: |
||
# dkms install nvidia/334.21 |
# dkms install nvidia/334.21 |
||
''全ての''カーネルでモジュールをビルドするには: |
''全ての''カーネルでモジュールをビルドするには: |
||
| 69行目: | 66行目: | ||
# dkms remove nvidia/331.49 --all |
# dkms remove nvidia/331.49 --all |
||
{{Pkg|dkms}} パッケージを削除した場合、モジュールのビルドファイルに関連する情報が消失します。その場合 {{ic|/usr/lib/modules/KERNELVERSION-ARCH}} から使用しないファイルやディレクトリを削除してください。 |
|||
== 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]] (パッケージ内のよくあるミスや標準にないことをしていないか確認します) を通しておくと良いでしょう。ただし、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}} が使われます): |
|||
{{hc|amazing-dkms.install| |
|||
# old version (without -$pkgrel): ${1%%-*} |
|||
# new version (without -$pkgrel): ${2%%-*} |
|||
post_install() { |
|||
dkms install ''amazing''/${1%%-*} |
|||
} |
|||
pre_upgrade() { |
|||
pre_remove ${2%%-*} |
|||
} |
|||
post_upgrade() { |
|||
post_install ${1%%-*} |
|||
} |
|||
pre_remove() { |
|||
dkms remove ''amazing''/${1%%-*} --all |
|||
} |
|||
}} |
|||
{{Tip|To keep DKMS packages closer to their non-DKMS counterparts: avoid cluttering up package files with DKMS-specific stuff (e.g. version numbers that need updating).}} |
|||
== 参照 == |
|||
{{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 フックの後に実行されるようにするために必要であることに注意してください。