Tüm yüklü çekirdekler için tüm DKMS modüllerini yeniden kurma komutu?


39

Zaman zaman, sistemim bazı çekirdeklerin bir veya iki modülün eksik olduğu bir duruma giriyor, çünkü DKMS bir şekilde bu çekirdek için bu modülleri derlemeyi unuttu. Sorunu teşhis etmek için zaman harcamak yerine, o ana kadar sadece her dkms-kontrol modülünü kurulu her çekirdek için yeniden kurabilirim . Böyle bir komut var mı?


Her zaman zaten çekirdekte yüklü olan Broadcom-sta / 5.100.82.112 çıkış modülünü alıyorum 2.6.38jon-64 / x86_64 Gerçekten bir --force veya --rebuild --just-do-what-i-say seçeneği istiyorum;)

Yanıtlar:


47

Bunu yapmak için bir astarlı bir kabuk düşündüm:

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

Bu işe yarıyor, çünkü dizinlerin isimleri /var/lib/initramfs-toolstam olarak bu çekirdek versiyonları dkms_autoinstalleriçin tüm modülleri yeniden inşa etmelerini söylemek için geçmeniz gereken çekirdek versiyon isimleri . Bazı eski çekirdekleri kaldırdıysanız, dizinlerinin hala etrafta yattığını ve bazı hataların rapor edilmesine neden olabileceğini unutmayın, ancak bu bir sorun değildir çünkü dkms_autoinstalleryüklü olmayan bu çekirdek sürümleri için hiçbir şey yapmaz.


1
bazı hatalar verdi çünkü headers-xxx ve headers-xxx-generic geldi, ancak hatalara rağmen doğru şeyleri yeniden inşa ediyor gibiydi
frankster

@frankster Birden fazla bulduktan sonra "Hata! dkms.conf dosyası bulunamadı." yeni bir çekirdek kurulumu için, dkms status"/ usr / src" 'den istediğim belirli modüller için aşağıdakileri kullanarak yeni çekirdeğe göre listelenen önceki çekirdek modüllerini kurmayı başardım. Parametrelerin -c, -m, -v için gerektiği gibi değiştirilmesi gerekir. İşte nvidia-384-384,90 modülü için bir örnektir: 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

Görünmüyor ki dkmskomut bunu yapmanıza izin veriyor. İstediğini yapması gereken küçük bir Python betiği oluşturdum. Eğer bir takma ad koyabilirsiniz ~/.bashrcbeğendiniz

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

Elbette önce çalıştırılabilir hale getirmeniz gerekir. İşte kod:

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

Burada test edilmiş, iyi çalışıyor gibi görünüyor:

$ 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

Modülleri de kurmak istiyorsanız , ikinci satırdaki build ile install komutunu değiştirin .


4

@Htorque ve @Ryan Thompson'ın cevaplarını birleştirirken, işte (root olarak) bir-liner:

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

Yukarıdakiler tüm değişkenlerde çalışmaz, bu durumlarda bu biraz daha yararlı olabilir ...

$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

Diğer metotların yapmadığı şeyleri detaylandırabilir misiniz?
Ryan Thompson

/ Usr / src / linux-headers- * ve / var / lib / initramfs-tools bulunmayan sistemlerde çalışır
stu

Sadece dkms (tür) ortak olarak çalıştığı gerçeğine sahip birçok linux dağıtımında çalışmanız gereken durumu düşünün.
stu

0

dkms statusve dkms_autoinstallerubuntu 16.x'de çalışmaz. Yani bazı kabuk komut dosyası yapacak. Bu komut dosyası, uygun bir *-dkmsdeb-paketinizin kurulu olduğunu varsayıyor ve bashsizin kabuğunuz.

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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.