Lệnh xây dựng lại tất cả các mô-đun DKMS cho tất cả các hạt nhân đã cài đặt?


39

Thỉnh thoảng, hệ thống của tôi rơi vào trạng thái mà một số hạt nhân bị thiếu một hoặc hai mô-đun, vì DKMS bằng cách nào đó đã quên biên dịch các mô-đun đó cho hạt nhân đó. Thay vì dành thời gian để chẩn đoán vấn đề, sẽ tốt hơn nếu có một lệnh duy nhất tôi có thể chạy mà chỉ cần xây dựng lại mỗi mô-đun được điều khiển dkms cho mỗi hạt nhân được cài đặt. Có một lệnh như vậy?


Tôi luôn nhận được mô-đun đầu ra broadcom-sta / 5.100.82.112 đã được cài đặt trên kernel 2.6,38jon-64 / x86_64 Tôi thực sự muốn một tùy chọn --force hoặc --rebuild --just-do-what-i-say;)

Câu trả lời:


47

Tôi đã tìm ra một lớp vỏ một lớp để làm điều đó:

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

Điều này hoạt động vì tên của các thư mục trong /var/lib/initramfs-toolschính xác là tên phiên bản kernel mà bạn cần chuyển đến dkms_autoinstallerđể bảo nó xây dựng lại tất cả các mô-đun cho các phiên bản kernel đó. Lưu ý rằng nếu bạn đã gỡ cài đặt một số hạt nhân cũ, các thư mục của chúng vẫn có thể nằm xung quanh và gây ra một số lỗi được báo cáo, nhưng đây không phải là vấn đề vì dkms_autoinstallersẽ không làm gì cho những phiên bản kernel không được cài đặt.


1
nó đã đưa ra một số lỗi vì nó xuất hiện các tiêu đề-xxx và tiêu đề-chung chung nhưng nó dường như xây dựng lại các công cụ chính xác bất chấp các lỗi
frankster

@frankster Sau khi tìm thấy nhiều "Lỗi! Không thể định vị tệp dkms.conf." để cài đặt kernel mới, tôi có thể cài đặt các mô-đun kernel trước được liệt kê bởi dkms statuskernel mới bằng cách sử dụng các mô-đun cụ thể sau mà tôi muốn từ "/ usr / src". Các tham số cần được thay đổi khi cần cho -c, -m, -v. Dưới đây là một ví dụ cho mô-đun 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

Không giống như dkmslệnh cho phép bạn làm điều đó. Tôi đã tạo một tập lệnh Python nhỏ nên làm những gì bạn muốn. Bạn có thể đặt một bí danh trong ~/.bashrclike của bạn

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

Tất nhiên bạn cần phải làm cho nó thực thi đầu tiên. Đây là mã:

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

Đã thử nghiệm ở đây, dường như chỉ hoạt động tốt:

$ 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

Nếu bạn cũng muốn cài đặt các mô-đun, thay thế bản dựng bằng cài đặt ở dòng cuối cùng thứ hai.


4

Kết hợp câu trả lời của @htorque và @Ryan Thompson, đây là phần lót của tôi (dưới dạng gốc):

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

Ở trên không hoạt động trên tất cả các biến thể, điều này có thể hữu ích hơn một chút trong những trường hợp đó ...

$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

Bạn có thể giải thích về những gì mà các phương pháp khác không?
Ryan Thompson

Nó hoạt động trên hệ thống mà không có / usr / src / linux-headers- * và / var / lib / initramfs-tools
Stu

hãy xem xét tình huống mà bạn cần nó để chạy trên nhiều bản phân phối linux khác nhau mà chỉ có thực tế là các dkms (sắp xếp) hoạt động chung.
stu

0

dkms statusdkms_autoinstallerkhông hoạt động trong Ubuntu 16.x. Vì vậy, một số kịch bản shell sẽ làm. Kịch bản lệnh này giả định rằng bạn đã *-dkmscài đặt gói gỡ lỗi thích hợp và bashlà trình bao của bạn.

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.