Commande pour reconstruire tous les modules DKMS pour tous les noyaux installés?

35

De temps en temps, mon système entre dans un état où il manque un ou deux modules, car DKMS a en quelque sorte oublié de compiler ces modules pour ce noyau. Plutôt que de passer du temps à diagnostiquer le problème, ce serait bien s'il y avait une seule commande que je pourrais exécuter pour reconstruire tous les modules contrôlés par dkms pour tous les noyaux installés. Y a-t-il une telle commande?

    
posée Ryan Thompson 16.07.2011 - 19:56
la source

5 réponses

39

J'ai trouvé un monocouche pour le faire:

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

Cela fonctionne parce que les noms des répertoires dans /var/lib/initramfs-tools correspondent exactement aux noms de version du noyau que vous devez transmettre à dkms_autoinstaller pour lui indiquer de reconstruire tous les modules pour ces versions du noyau. Notez que si vous avez désinstallé certains anciens noyaux, il est possible que leurs répertoires soient toujours là et que certaines erreurs soient signalées, mais ce n'est pas un problème car dkms_autoinstaller ne fera rien pour les versions du noyau non installées.

    
réponse donnée Ryan Thompson 18.07.2011 - 14:05
la source
8

Ne ressemble pas à la commande dkms qui vous permet de faire cela. J'ai créé un petit script Python qui devrait faire ce que vous voulez. Vous pouvez mettre un alias dans votre ~/.bashrc comme

alias dkms-buildall='sudo ./wherever/your/script/is'

Bien sûr, vous devez d'abord le rendre exécutable. Voici le code:

#!/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)

Testé ici, semble fonctionner très bien:

$ 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

Si vous souhaitez également installer les modules, remplacez build par install dans la dernière ligne.

    
réponse donnée htorque 17.07.2011 - 10:51
la source
3

Combinant les réponses de @htorque et @Ryan Thompson, voici mon one-liner (en tant que root):

dkms status | sed s/,//g | awk '{print "-m",,"-v",}' | while read line; do ls /var/lib/initramfs-tools | xargs -n 1 dkms install $line -k; done
    
réponse donnée phs 09.08.2012 - 23:43
la source
0

Ce qui précède ne fonctionne pas sur toutes les variantes, cela pourrait être un peu plus utile dans ces cas ...

$modulename="whatever"
$moduleversion='modinfo $modulename | grep "^version:" | awk '{ print  }''
dkms status | grep $modulename | tr -d ',' | awk '{ print  }' | xargs -n1 dkms build $modulename/$moduleversion -k
    
réponse donnée stu 19.02.2016 - 20:27
la source
0

dkms status et dkms_autoinstaller ne fonctionnent pas dans ubuntu 16.x. Donc, certains scripts shell feront l'affaire. Ce script suppose que vous avez correctement installé *-dkms deb-package et que bash est votre shell.

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])//')
  sudo /usr/sbin/dkms install -c /usr/src/$d/dkms.conf -m $m -v $v -k $k
 done
done 
    
réponse donnée sehari24jam 07.03.2018 - 07:10
la source

Lire d'autres questions sur les étiquettes