Команда для восстановления всех модулей DKMS для всех установленных ядер?

Иногда моя система попадает в состояние, когда в некоторых ядрах отсутствует модуль или два, потому что DKMS каким-то образом забыл скомпилировать эти модули для этого ядра. Не тратьте время на диагностику проблемы, было бы неплохо, если бы была одна команда, которую я мог бы запустить, woudl просто перестроил каждый модуль, контролируемый dkms, для каждого установленного ядра. Есть ли такая команда?

36
задан 16 July 2011 в 22:56

35 ответов

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в [ f3], чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

37
ответ дан 25 May 2018 в 19:47
  • 1
    он дал некоторые ошибки, потому что он появился в заголовках-xxx и headers-xxx-generic, но он, казалось, восстанавливал правильные вещи, несмотря на ошибки – frankster 15 February 2012 в 01:09
  • 2
    @frankster После обнаружения нескольких ошибок! Не удалось найти файл dkms.conf. & Quot; для новой установки ядра я смог установить предыдущие модули ядра, перечисленные в 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 24 October 2017 в 14:14

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 25 July 2018 в 21:34

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 31 July 2018 в 10:30

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 2 August 2018 в 03:12

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 4 August 2018 в 19:05

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 6 August 2018 в 03:23

Я вычислил оболочку с одним слоем для этого:

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

Это работает, потому что имена каталогов в /var/lib/initramfs-tools - это точно имена версий ядра, которые вам нужно передать в dkms_autoinstaller, чтобы сообщить об этом, чтобы перестроить все модули для этих версий ядра. Обратите внимание, что если вы удалили некоторые старые ядра, их каталоги все еще могли бы вращаться и приводить к сообщениям об ошибках, но это не проблема, потому что dkms_autoinstaller просто ничего не сделает для тех версий ядра, которые не установлены.

38
ответ дан 7 August 2018 в 21:10

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 25 May 2018 в 19:47

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 25 May 2018 в 19:47

Вышеупомянутые не работают во всех вариантах, это может быть немного более полезным в этих случаях ...

$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
0
ответ дан 25 May 2018 в 19:47
  • 1
    Не могли бы вы рассказать о том, что это значит, что другие методы не делают? – Ryan Thompson 20 February 2016 в 03:00
  • 2
    Он работает на системах, в которых нет / usr / src / linux-headers- * и / var / lib / initramfs-tools – stu 21 February 2016 в 16:43
  • 3
    рассмотрите ситуацию, когда вам это нужно, чтобы работать на многих различных дистрибутивах linux, которые имеют только тот факт, что dkms (вроде) работает, как правило. – stu 21 February 2016 в 16:43

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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 
0
ответ дан 25 May 2018 в 19:47

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 25 July 2018 в 21:34

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 25 July 2018 в 21:34

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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
0
ответ дан 25 July 2018 в 21:34

Вышеупомянутые не работают во всех вариантах, это может быть немного более полезным в этих случаях ...

$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
0
ответ дан 25 July 2018 в 21:34
  • 1
    Не могли бы вы рассказать о том, что это значит, что другие методы не делают? – Ryan Thompson 20 February 2016 в 03:00
  • 2
    Он работает на системах, в которых нет / usr / src / linux-headers- * и / var / lib / initramfs-tools – stu 21 February 2016 в 16:43
  • 3
    рассмотрите ситуацию, когда вам это нужно, чтобы работать на многих различных дистрибутивах linux, которые имеют только тот факт, что dkms (вроде) работает, как правило. – stu 21 February 2016 в 16:43

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 31 July 2018 в 10:30

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 31 July 2018 в 10:30

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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
0
ответ дан 31 July 2018 в 10:30

Вышеупомянутые не работают во всех вариантах, это может быть немного более полезным в этих случаях ...

$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
0
ответ дан 31 July 2018 в 10:30
  • 1
    Не могли бы вы рассказать о том, что это значит, что другие методы не делают? – Ryan Thompson 20 February 2016 в 03:00
  • 2
    Он работает на системах, в которых нет / usr / src / linux-headers- * и / var / lib / initramfs-tools – stu 21 February 2016 в 16:43
  • 3
    рассмотрите ситуацию, когда вам это нужно, чтобы работать на многих различных дистрибутивах linux, которые имеют только тот факт, что dkms (вроде) работает, как правило. – stu 21 February 2016 в 16:43

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 2 August 2018 в 03:12

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 2 August 2018 в 03:12

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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
0
ответ дан 2 August 2018 в 03:12

Вышеупомянутые не работают во всех вариантах, это может быть немного более полезным в этих случаях ...

$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
0
ответ дан 2 August 2018 в 03:12
  • 1
    Не могли бы вы рассказать о том, что это значит, что другие методы не делают? – Ryan Thompson 20 February 2016 в 03:00
  • 2
    Он работает на системах, в которых нет / usr / src / linux-headers- * и / var / lib / initramfs-tools – stu 21 February 2016 в 16:43
  • 3
    рассмотрите ситуацию, когда вам это нужно, чтобы работать на многих различных дистрибутивах linux, которые имеют только тот факт, что dkms (вроде) работает, как правило. – stu 21 February 2016 в 16:43

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 4 August 2018 в 19:05

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 4 August 2018 в 19:05

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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
0
ответ дан 4 August 2018 в 19:05

Вышеупомянутые не работают во всех вариантах, это может быть немного более полезным в этих случаях ...

$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
0
ответ дан 4 August 2018 в 19:05
  • 1
    Не могли бы вы рассказать о том, что это значит, что другие методы не делают? – Ryan Thompson 20 February 2016 в 03:00
  • 2
    Он работает на системах, в которых нет / usr / src / linux-headers- * и / var / lib / initramfs-tools – stu 21 February 2016 в 16:43
  • 3
    рассмотрите ситуацию, когда вам это нужно, чтобы работать на многих различных дистрибутивах linux, которые имеют только тот факт, что dkms (вроде) работает, как правило. – stu 21 February 2016 в 16:43

Объединив ответы @htorque и @Ryan Thompson, вот мой (как root) однострочный:

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
3
ответ дан 6 August 2018 в 03:23

Не похоже, что команда 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

Если вы также хотите установить модули, замените сборку с установкой на второй последняя линия.

8
ответ дан 6 August 2018 в 03:23

dkms status и dkms_autoinstaller не работают в ubuntu 16.x. Так что некоторые сценарии оболочки будут делать. В этом скрипте предполагается, что у вас установлен правильный deb [] f4], а 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
0
ответ дан 6 August 2018 в 03:23

Другие вопросы по тегам:

Похожие вопросы: