воскресенье, 1 апреля 2012 г.

dkms

надоело помнить и пересобирать сторонние модули ядра вручную
готовых портов dkms не нашёл
потому запилил вот такое:

#!/bin/bash

. /etc/init.d/functions.sh
case ${1} in

check ) check(){
  if [ -f "/var/lib/portage/dkms_db" ];then
 while read PKG MOD;do
   if [ -f "/lib/modules/`uname -r`/${MOD}" ];then
  echo "${MOD#*/}" && eend 0
   else
  FAILED+=" ${PKG}" 
  echo -e "${MOD#*/}" && eend 1
   fi
 done < /var/lib/portage/dkms_db
 if [ -n "${FAILED}" ];then
   eselect kernel set linux-`uname -r`
   emerge -1 $(echo -e "${FAILED// /\n}" | sort -u) && rm -f /var/tmp/dkms_failed || touch /var/tmp/dkms_failed
 fi
  else
 echo -e "dkms_db not found!\nyou need run:\ndkms-gentoo db" && return 1
  fi
  return 0
 }
check;;

db ) db_rebuild(){
  DB="/var/db/pkg/"
  TARGETS="$(grep "/lib/modules/.*.ko\>" ${DB}*/*/CONTENTS)"

  while read line;do
 MODULE="$(awk '{print $2}' <<< ${line})"
 KO="${MODULE#/*/*/*/}"
 PKG_FULL="$( cut -d\: -f1 <<< ${line} )"
 PACKAGE="$(sed -e "s|${DB}||" -e 's|/CONTENTS||' <<< "${PKG_FULL}")"
 ALL_MODULES+=">=${PACKAGE} ${KO}\n"
  done <<< "${TARGETS}"

  echo -e "${ALL_MODULES%\\n}" | column -t > /var/lib/portage/dkms_db
  }
db_rebuild;;

esac
ну и инит-скрипт для openrc
#!/sbin/runscript
# Copyright 1999-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

depend() {
 need localmount net
 before xdm
 keyword -timeout
}

start() {
 ebegin "Starting dkms"
   dkms-gentoo check
 eend $?
}

stop() {
 ebegin "Stopping dkms"
   if [ -f '/var/tmp/dkms_failed' ];then
  eend 0
   else
  dkms-gentoo db
   fi
 eend $?
}

теперь эти самы модули сами пересобираются при перезагрузке после смены ядра
точнее пакеты с этими модулями
при завершении работы создаётся база таких модулей, если при предыдущей загрузке сборка недостающих моделей не завершилась ошибкой
запилил в свой оверлей (stuff) как sys-apps/dkms-gentoo