สั่งให้สร้างโมดูล DKMS ทั้งหมดสำหรับเมล็ดที่ติดตั้งใหม่ทั้งหมดหรือไม่


39

บางครั้งระบบของฉันจะเข้าสู่สถานะที่เมล็ดบางอันขาดโมดูลหรือสองอันเนื่องจาก DKMS ลืมที่จะรวบรวมโมดูลเหล่านั้นสำหรับเคอร์เนลนั้น แทนที่จะใช้เวลาวิเคราะห์ปัญหามันจะดีถ้ามีคำสั่งเดียวที่ฉันสามารถเรียกใช้woudl นั้นเพิ่งสร้างโมดูลควบคุมทุก dkms สำหรับทุกเคอร์เนลที่ติดตั้ง มีคำสั่งดังกล่าวหรือไม่?


ฉันมักจะได้รับเอาท์พุทโมดูล Broadcom-sta / 5.100.82.112 แล้วติดตั้งบนเคอร์เนล 2.6.38jon-64 / x86_64 ฉันต้องการตัวเลือก --force หรือ - สร้าง - เพียงแค่ทำสิ่งที่ฉันพูด;)

คำตอบ:


47

ฉันหาเปลือกหนึ่งซับเพื่อทำ:

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

สิ่งนี้ใช้งานได้เพราะชื่อของไดเรกทอรีใน/var/lib/initramfs-toolsนั้นเป็นชื่อรุ่นเคอร์เนลที่คุณต้องผ่านdkms_autoinstallerเพื่อบอกให้สร้างโมดูลทั้งหมดสำหรับเคอร์เนลเวอร์ชันเหล่านั้น โปรดทราบว่าหากคุณได้ถอนการติดตั้งเคอร์เนลเก่าบางส่วนไดเรกทอรีของพวกเขาอาจยังคงวางอยู่และทำให้เกิดข้อผิดพลาดบางอย่างที่จะรายงาน แต่นี่ไม่ใช่ปัญหาเพราะdkms_autoinstallerจะไม่ทำอะไรเลยสำหรับเคอร์เนลเวอร์ชันที่ไม่ได้ติดตั้ง


1
มันทำให้ข้อผิดพลาดบางเพราะมันขึ้นมาส่วนหัวและส่วนหัว xxx-xxx-ทั่วไป แต่ดูเหมือนว่ามันจะสร้างสิ่งที่ถูกต้องแม้จะมีข้อผิดพลาด
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

หากคุณต้องการติดตั้งโมดูลให้แทนที่การสร้างด้วยการติดตั้งในบรรทัดสุดท้ายที่สอง


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 / ลินุกซ์ headers- * และ / var / lib / initramfs เครื่องมือ
STU

พิจารณาสถานการณ์ที่คุณต้องการให้มันทำงานบน distros linux ต่างๆที่มีข้อเท็จจริงว่า dkms (sort of) ทำงานได้เหมือนกัน
stu

0

dkms statusและdkms_autoinstallerไม่ทำงานใน Ubuntu 16.x. ดังนั้นเชลล์สคริปต์บางตัวจะทำ สคริปต์นี้สมมติว่าคุณได้*-dkmsติดตั้งแพ็กเกจ deb ที่เหมาะสมและ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.