「動的カーネルモジュールサポート」の版間の差分
細 (文字列「[[zh-CN:」を「[[zh-hans:」に置換) |
(同期) |
||
| 7行目: | 7行目: | ||
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
: '''Dynamic Kernel Module Support''' ('''DKMS''') はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。 |
||
| + | DKMS を使用する''プラス効果''はカーネルがアップグレードされるときにモジュールをリビルドできることです。これはつまり会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。[[Pacman#フック]]が導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。 |
||
| − | == 効果 == |
||
| − | |||
| − | DKMS を使用する''プラス効果''はカーネルがアップグレードされるときにモジュールをリビルドできることです。これはつまり会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。 |
||
| − | |||
| − | DKMS を使用する''マイナス効果''は DKMS は Pacman のデータベースを破壊することです。作成されたモジュールはパッケージに属さないことになり、Pacman はモジュールを追跡できないという問題があります。ただし理論上は、フックを使ってサポートを追加することができます (参照: {{Bug|2985}})。 |
||
== インストール == |
== インストール == |
||
| − | [[公式リポジトリ]]から {{pkg|dkms}} をインストールしてください。 |
+ | [[公式リポジトリ]]から {{pkg|dkms}} をインストールしてください。また、使用しているカーネルにあったヘッダーをインストールしてください (標準カーネルの場合 {{Pkg|linux-headers}} です)。 |
| + | カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは [https://www.archlinuxjp.org/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。以下のリストは DKMS のモジュールが存在するソフトウェアパッケージのひと握りです (wiki のページに DKMS についてのセクションがある場合はそのリンクを付しています): |
||
| − | {{ic|dkms}} [[systemd]] サービスを有効にすればカーネルをアップグレードした後の再起動時に DKMS モジュールが自動的にリビルドされるようになります。 |
||
| + | * [[AMD Catalyst]]: {{AUR|catalyst-dkms}}。 |
||
| − | カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは [https://www.archlinux.org/packages/?&q=dkms 公式リポジトリ] にも存在しますが、ほとんどのモジュールは [https://aur.archlinux.org/packages/?SeB=n&K=dkms AUR] にあります。以下のリストは DKMS のモジュールが存在するソフトウェアパッケージのひと握りです (wiki のページに DKMS についてのセクションがある場合はそのリンクを付しています): |
||
| + | * [[NVIDIA]]: |
||
| + | ** {{Pkg|nvidia-dkms}} |
||
| + | ** {{Pkg|nvidia-304xx-dkms}} |
||
| + | ** {{AUR|nvidia-173xx-dkms}} |
||
| + | ** {{AUR|nvidia-96xx-dkms}} |
||
| + | ** {{AUR|nvidia-grsec-dkms}} |
||
| + | * [[VirtualBox]]: |
||
| + | ** {{Pkg|virtualbox-host-dkms}} |
||
| + | ** {{Pkg|virtualbox-guest-dkms}} |
||
| + | * [[VMware]]。 |
||
| + | == アップグレード == |
||
| − | * [[AMD Catalyst]]: {{AUR|catalyst-dkms}}; |
||
| − | * [[NVIDIA]]: {{Pkg|nvidia-dkms}}, {{Pkg|nvidia-304xx-dkms}}, {{AUR|nvidia-173xx-dkms}}, {{AUR|nvidia-96xx-dkms}}; |
||
| − | * [[VirtualBox]], セクション [[VirtualBox#ホストでカスタムカーネルを使っている場合]]; |
||
| − | * [[VMware]], セクション [[VMware#DKMS を使ってモジュールを管理する]]。 |
||
| + | 大抵はカーネルのアップグレード時に DKMS モジュールのリビルドが行われますが、リビルドが失敗する可能性がときどきあります。pacman の出力をよく見てください。起動するのに DKMS モジュールに依存している環境の場合や[[公式リポジトリ]]に存在しないカスタムカーネルで DKMS を使用する場合は特に重要です。 |
||
| − | == アップグレード == |
||
| − | + | カーネルの変更に対処したり、バグを修正したり、必要な機能を追加するため、再起動する前に DKMS パッケージをアップグレードするようにしてください。 |
|
== 使用方法 == |
== 使用方法 == |
||
2017年3月5日 (日) 15:52時点における版
Wikipedia より:
- Dynamic Kernel Module Support (DKMS) はカーネルのソースツリーの外にソースが存在する Linux カーネルモジュールの生成を可能にするプログラム/フレームワークです。新しいカーネルがインストールされたときに DKMS モジュールは自動的にリビルドされます。
DKMS を使用するプラス効果はカーネルがアップグレードされるときにモジュールをリビルドできることです。これはつまり会社・プロジェクト・パッケージメンテナが新しいバージョンのモジュールをリリースするのを待つ必要がないということを意味します。Pacman#フックが導入されたことで、カーネルがアップグレードされたときにモジュールのリビルドは自動的に処理されるようになっています。
目次
インストール
公式リポジトリから dkms をインストールしてください。また、使用しているカーネルにあったヘッダーをインストールしてください (標準カーネルの場合 linux-headers です)。
カーネルのソースツリーの外にあるモジュールについてはかなりの数の DKMS のパッケージが作られています。いくらかは 公式リポジトリ にも存在しますが、ほとんどのモジュールは AUR にあります。以下のリストは DKMS のモジュールが存在するソフトウェアパッケージのひと握りです (wiki のページに DKMS についてのセクションがある場合はそのリンクを付しています):
- AMD Catalyst: catalyst-dkmsAUR。
- NVIDIA:
- VirtualBox:
- VMware。
アップグレード
大抵はカーネルのアップグレード時に 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 パッケージを作成するときのガイドラインです。
パッケージの名前
DKMS パッケージは公式のパッケージ名に "-dkms" を加えた名前を付けます。
"-dkms" を削ったパッケージ名を表すのによく $pkgname の下に $_pkgname 変数が使われます (例: _pkgname=${pkgname%-*})。公式パッケージの PKGBUILD と DKMS パッケージの同じ部分を残しておくのに便利です。
依存パッケージ
依存パッケージは元のパッケージから継承するのに加えて、dkms を追加して linux-headers を削除します (dkms パッケージは任意パッケージとして並べられます)。
ビルドソースの場所
ビルドソースは次の場所に配置します (DKMS のデフォルトビルドディレクトリです):
/usr/src/PACKAGE_NAME-PACKAGE_VERSION
パッケージディレクトリ内の、モジュールのビルド方法を記述した DKMS の設定 (dkms.conf) には PACKAGE_NAME と PACKAGE_VERSION 変数を含めます。
PACKAGE_NAME- 実際のプロジェクト名 (通常は$_pkgnameまたは$_pkgbase)。PACKAGE_VERSION-$pkgverにするのが慣例です。
パッチ
PKGBUILD または dkms.conf でソースにパッチを適用できます。
.install でモジュールを自動的にロード
モジュールのロードやアンロードはユーザーが行うようにしてください。モジュールがロードされたときにクラッシュする可能性を考慮します。
namcap の出力
どんなパッケージでも一度は namcap (パッケージ内のよくあるミスや標準にないことをしていないか確認します) を通しておくと良いでしょう。ただし、namcap はまだ DKMS 特有のガイドラインに対応していません。
例えば、DKMS はデフォルトで /usr/src/ を使用しますが、Namcap はこのディレクトリを非標準のディレクトリと判断します。
サンプル
以下はパッケージ名とバージョンにあわせて dkms.conf を編集するサンプルパッケージです。
PKGBUILD
PKGBUILD
# 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 '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
dkms.conf
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
depmod の代わりに dkms install を使うことができます (dkms build に依存しており、さらにそこから dkms add が使われます):
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
}