DKMSが何らかの理由でそれらのモジュールをそのカーネル用にコンパイルするのを忘れていたため、一部のカーネルにモジュールが1つまたは2つ欠けている状態になることがあります。問題を診断するのに時間を費やすのではなく、単に再構築する単一のコマンドがあればいいでしょうeverydkms-controlled module foreveryインストールされたカーネル。そのようなコマンドはありますか?
私はそれを行うためのシェルのワンライナーを見つけました:
ls /var/lib/initramfs-tools | \
Sudo xargs -n1 /usr/lib/dkms/dkms_autoinstaller start
これは、/var/lib/initramfs-tools
のディレクトリ名が、カーネルバージョンのすべてのモジュールを再構築するようにdkms_autoinstaller
に渡す必要があるカーネルバージョン名とまったく同じであるため、機能します。いくつかの古いカーネルをアンインストールした場合、それらのディレクトリがまだ存在し、いくつかのエラーが報告される可能性がありますが、dkms_autoinstaller
はそうでないカーネルバージョンに対しては何もしないため、これは問題ではありませんインストール済み。
dkms
コマンドを使用してそれを実行できるようには見えません。必要な処理を行う小さなPythonスクリプトを作成しました。 ~/.bashrc
のようなエイリアスを置くことができます
alias dkms-buildall='Sudo ./wherever/your/script/is'
もちろん、最初に実行可能にする必要があります。コードは次のとおりです。
#!/bin/env python
#
# NOTE: This assumes that all modules and versions are built for at
# least one kernel. If that's not the case, adapt parsing as needed.
import os
import subprocess
# Permission check.
if os.geteuid() != 0:
print "You need to be root to run this script."
exit(1)
# Get DKMS status output.
cmd = ['dkms', 'status']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
dkms_status = process.communicate()[0].strip('\n').split('\n')
dkms_status = [x.split(', ') for x in dkms_status]
# Get kernel versions (probably crap).
cmd = ['ls', '/var/lib/initramfs-tools/']
# Alternative (for use with Arch Linux for example)
# cmd = ['ls', '/usr/lib/modules/']
process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
kernels = process.communicate()[0].strip('\n').split('\n')
# Parse output, 'modules' will contain all modules pointing to a set
# of versions.
modules = {}
for entry in dkms_status:
module = entry[0]
version = entry[1].split(': ')[0]
try:
modules[module].add(version)
except KeyError:
# We don't have that module, add it.
modules[module] = set([version])
# For each module, build all versions for all kernels.
for module in modules:
for version in modules[module]:
for kernel in kernels:
cmd = ['dkms', 'build', '-m', module, '-v', version, '-k', kernel]
ret = subprocess.call(cmd)
ここでテストし、うまく機能しているようです:
$ dkms status
nvidia-current, 275.09.07, 3.0.0-5-generic, x86_64: installed
virtualbox, 4.0.10, 3.0.0-5-generic, x86_64: installed
$ Sudo python dkms.py
...
$ dkms status
nvidia-current, 275.09.07, 3.0.0-5-generic, x86_64: installed
nvidia-current, 275.09.07, 3.0-2-generic, x86_64: built
nvidia-current, 275.09.07, 3.0-3-generic, x86_64: built
virtualbox, 4.0.10, 3.0.0-5-generic, x86_64: installed
virtualbox, 4.0.10, 3.0-2-generic, x86_64: built
virtualbox, 4.0.10, 3.0-3-generic, x86_64: built
モジュールもインストールする場合は、最後の2行目のbuildをinstallに置き換えます。
@htorqueと@Ryan Thompsonの答えを組み合わせて、ここに私の(ルートとしての)ワンライナーがあります:
dkms status | sed s/,//g | awk '{print "-m",$1,"-v",$2}' | while read line; do ls /var/lib/initramfs-tools | xargs -n 1 dkms install $line -k; done
上記はすべてのバリアントで機能するわけではありません。これらの場合にはもう少し役立つかもしれません...
$modulename="whatever"
$moduleversion=`modinfo $modulename | grep "^version:" | awk '{ print $2 }'`
dkms status | grep $modulename | tr -d ',' | awk '{ print $3 }' | xargs -n1 dkms build $modulename/$moduleversion -k
dkms status
およびdkms_autoinstaller
は、ubuntu 16.xでは機能しません。そのため、いくつかのシェルスクリプトで対応できます。このスクリプトは、適切な*-dkms
deb-packageがインストールされ、bash
がシェルであることを前提としています。
for k in $(ls /var/lib/initramfs-tools) ; do
for d in $(cd /usr/src; ls -d *-*) ; do
[[ -f /usr/src/${d}/dkms.conf ]] || continue
m=$(echo $d | sed -r -e 's/-([0-9]).+//')
v=$(echo $d | sed -r -e 's/[^0-9]+-([0-9])/\1/')
Sudo /usr/sbin/dkms install -c /usr/src/$d/dkms.conf -m $m -v $v -k $k
done
done