#!/sbin/openrc-run # Copyright (c) 2007-2015 The OpenRC Authors. # See the Authors file at the top-level directory of this distribution and # https://github.com/OpenRC/openrc/blob/HEAD/AUTHORS # # This file is part of OpenRC. It is subject to the license terms in # the LICENSE file found in the top-level directory of this # distribution and at https://github.com/OpenRC/openrc/blob/HEAD/LICENSE # This file may not be copied, modified, propagated, or distributed # except according to the terms contained in the LICENSE file. description="Loads a user defined list of kernel modules." depend() { use isapnp provide modules-load keyword -docker -lxc -openvz -prefix -systemd-nspawn -vserver } find_modfiles() { local dirs="/usr/lib/modules-load.d /run/modules-load.d /etc/modules-load.d" local basenames files fn x y for x in $dirs; do [ ! -d $x ] && continue for y in $x/*.conf; do [ -f $y ] && basenames="${basenames}\n${y##*/}" done done basenames=$(printf "$basenames" | sort -u) for x in $basenames; do for y in $dirs; do [ -r $y/$x ] && fn=$y/$x done files="$files $fn" done echo $files } load_modules() { local file m _modules rc x file=$1 [ -z "$file" ] && return 0 while read m x; do case $m in \;*) continue ;; \#*) continue ;; *) _modules="$_modules $m" ;; esac done < $file for x in $_modules; do ebegin "Loading module $x" case "$RC_UNAME" in FreeBSD) kldload "$x"; rc=$? ;; Linux) modprobe --first-time --use-blacklist --verbose "$x"; rc=$? ;; *) ;; esac eend done return 0 } modules_load_d() { local x files=$(find_modfiles) for x in $files; do load_modules $x done return 0 } FreeBSD_modules() { local cnt=0 x for x in $modules; do ebegin "Loading module $x" kldload "$x" eend && : $(( cnt += 1 )) done einfo "Autoloaded $cnt module(s)" return 0 } Linux_modules() { # Should not fail if kernel does not have module # support compiled in ... [ ! -f /proc/modules ] && return 0 local KV x y kv_variant_list KV=$(uname -r) # full $KV kv_variant_list="${KV}" # remove any KV_EXTRA options to just get the full version x=${KV%%-*} # now slowly strip them while [ -n "$x" ] && [ "$x" != "$y" ]; do kv_variant_list="${kv_variant_list} $x" y=$x x=${x%.*} done local list= x= xx= y= args= for x in $kv_variant_list ; do eval list=\$modules_$(shell_var "$x") [ -n "$list" ] && break done [ -z "$list" ] && list=$modules [ -n "$list" ] && ebegin "Loading kernel modules" for x in $list; do xx=$(shell_var "$x") for y in $kv_variant_list ; do eval args=\$module_${xx}_args_$(shell_var "$y") [ -n "${args}" ] && break done [ -z "$args" ] && eval args=\$module_${xx}_args eval modprobe --first-time --use-blacklist --verbose "$x" "$args" done [ -n "$list" ] && eend return 0 } start() { case "$RC_UNAME" in FreeBSD|Linux) modules_load_d ${RC_UNAME}_modules ;; *) ;; esac return 0 }