설치된 모든 커널에 대한 모든 DKMS 모듈을 다시 작성하는 명령?


39

때때로, 내 시스템은 일부 커널에 하나 또는 두 개의 모듈이없는 상태가됩니다. 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

@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

모듈도 설치하려면 마지막 두 번째 행에서 buildinstall 로 바꾸십시오 .


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

다른 방법으로는 할 수없는 일에 대해 자세히 설명해 주시겠습니까?
Ryan Thompson

그것은 시스템에서 작동하지 유무 / usr / src / linux 디렉토리에-headers- *는 / var / lib 디렉토리 / initramfs에-도구
스투

dkms (일종의) 작동하는 사실 만 가지고있는 많은 다양한 Linux 배포판에서 실행 해야하는 상황을 고려하십시오.
stu

0

dkms status그리고 dkms_autoinstaller우분투 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.