インストールされているすべてのカーネルのすべてのDKMSモジュールを再構築するコマンド?


39

ときどき、私のシステムは、いくつかのカーネルが1つまたは2つのモジュールを失っている状態になります。DKMSが何らかの方法でそれらのモジュールをそのカーネル用にコンパイルするのを忘れたためです。単一のコマンドは、私はちょうど再構築そのwoudlを実行する可能性があった場合ではなく、問題を診断過ごす時間よりも、それはいいだろう、すべてのDKMS制御モジュールをすべてのインストールカーネル。そのようなコマンドはありますか?


常にカーネル2.6.38jon-64 / x86_64にインストールされた出力モジュールbroadcom-sta / 5.100.82.112を取得します--forceまたは--rebuild --just-do-what-i-sayオプションが本当に必要です;)

回答:


47

私はそれを行うためのシェルのワンライナーを見つけました:

ls /var/lib/initramfs-tools | \
    sudo xargs -n1 /usr/lib/dkms/dkms_autoinstaller start

これが機能するのは、ディレクトリの名前が、/var/lib/initramfs-toolsカーネルバージョンのdkms_autoinstallerすべてのモジュールを再構築するように伝えるために渡す必要があるカーネルバージョン名とまったく同じであるためです。古いカーネルをいくつかアンインストールした場合、それらのディレクトリがまだ存在し、エラーが報告される可能性がありますdkms_autoinstallerが、インストールされていないカーネルバージョンに対しては何もしないため、これは問題ではないことに注意してください。


1
headers-xxxとheaders-xxx-genericが発生したためエラーが発生しましたが、エラーにもかかわらず正しいものを再構築したようです
フランクスター

@frankster複数の「エラー!dkms.confファイルが見つかりませんでした」を見つけた後。新しいカーネルのインストールでdkms statusは、「/ usr / src」から必要な特定のモジュールごとに次を使用して、新しいカーネルにリストされた以前のカーネルモジュールをインストールできました。-c、-m、-vの必要に応じてパラメーターを変更する必要があります。nvidia-384-384.90モジュールの例を次に示します ls /var/lib/initramfs-tools | \ sudo xargs -n1 /usr/sbin/dkms install -c /usr/src/nvidia-384-384.90/dkms.conf -m nvidia -v 384-384.90 -k
。– m1st0

8

この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行目のビルドインストールに置き換えます。


4

@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

1

上記はすべてのバリアントで機能するわけではありません。これらの場合にはもう少し役立つかもしれません...

$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

他の方法では得られないことを詳しく説明していただけますか?
ライアンC.トンプソン

これは/ usr / src / linux-ヘッダなど*と/ var / libに/ initramfs-toolsで持っていないシステム上で動作します
STU

共通してdkms(の一種)が機能するという事実のみを持つ多くのLinuxディストリビューションで実行する必要がある状況を考えてください。
-stu

0

dkms statusまたdkms_autoinstaller、ubuntu 16.xでは機能しません。そのため、いくつかのシェルスクリプトで対応できます。このスクリプトは、適切な*-dkmsdeb-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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.