때때로, 내 시스템은 일부 커널에 하나 또는 두 개의 모듈이없는 상태가됩니다. DKMS는 어떻게 든 해당 커널에 대한 해당 모듈을 컴파일하는 것을 잊었 기 때문입니다. 하나의 명령 난 그냥 다시 그 woudl를 실행할 수 있었다면 오히려 문제를 진단 지출 시간보다, 그것은 좋은 것 마다 에 대한 DKMS 제어 모듈을 모든 설치된 커널. 그런 명령이 있습니까?
때때로, 내 시스템은 일부 커널에 하나 또는 두 개의 모듈이없는 상태가됩니다. DKMS는 어떻게 든 해당 커널에 대한 해당 모듈을 컴파일하는 것을 잊었 기 때문입니다. 하나의 명령 난 그냥 다시 그 woudl를 실행할 수 있었다면 오히려 문제를 진단 지출 시간보다, 그것은 좋은 것 마다 에 대한 DKMS 제어 모듈을 모든 설치된 커널. 그런 명령이 있습니까?
답변:
나는 그것을 할 쉘 원 라이너를 알아 냈습니다.
ls /var/lib/initramfs-tools | \
sudo xargs -n1 /usr/lib/dkms/dkms_autoinstaller start
이는 디렉토리의 이름이 해당 커널 버전의 모든 모듈을 다시 작성하기 /var/lib/initramfs-tools
위해 전달해야하는 커널 버전 이름과 정확히 일치 하기 때문에 작동합니다 dkms_autoinstaller
. 오래된 커널을 제거했다면, 디렉토리가 여전히 놓여 있고 일부 오류가보고 될 수 있지만, dkms_autoinstaller
설치되지 않은 커널 버전에 대해서는 아무 것도 수행하지 않기 때문에 문제 가되지 않습니다.
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
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
모듈도 설치하려면 마지막 두 번째 행에서 build 를 install 로 바꾸십시오 .
위의 모든 변형에서 작동하지는 않습니다.이 경우 약간 더 도움이 될 수 있습니다 ...
$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
dkms status
그리고 dkms_autoinstaller
우분투 16.x.에서 작동하지 않습니다 따라서 일부 쉘 스크립트가 수행합니다. 이 스크립트는 적절한 *-dkms
deb-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