[[ $mdadmconf_l ]] && mdadmconf=$mdadmconf_l
[[ $lvmconf_l ]] && lvmconf=$lvmconf_l
[[ $dracutbasedir ]] || dracutbasedir="$dracutsysrootdir"/usr/lib/dracut
-[[ $fw_dir ]] || fw_dir="$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware:$dracutsysrootdir/lib/firmware/$kernel"
+[[ $fw_dir ]] || {
+ fw_path_para=$(< /sys/module/firmware_class/parameters/path)
+ fw_dir="${fw_path_para:+$dracutsysrootdir$fw_path_para:}$dracutsysrootdir/lib/firmware/updates/$kernel:$dracutsysrootdir/lib/firmware/updates:$dracutsysrootdir/lib/firmware/$kernel:$dracutsysrootdir/lib/firmware"
+}
[[ $tmpdir_l ]] && tmpdir="$tmpdir_l"
[[ $tmpdir ]] || tmpdir="$TMPDIR"
[[ $tmpdir ]] || tmpdir="$dracutsysrootdir"/var/tmp
"\n"
" --module,-m Install kernel modules, instead of files\n"
" --kerneldir Specify the kernel module directory\n"
- " (default: /lib/modules/`uname -r`)\n"
+ " (default: /lib/modules/$(uname -r))\n"
" --firmwaredirs Specify the firmware directory search path with : separation\n"
- " (default: DRACUT_FIRMWARE_PATH env var, /lib/firmware if not set)\n"
+ " (default: $DRACUT_FIRMWARE_PATH, otherwise kernel-compatible\n"
+ " $(</sys/module/firmware_class/parameters/path),\n"
+ " /lib/firmware/updates/$(uname -r), /lib/firmware/updates\n"
+ " /lib/firmware/$(uname -r), /lib/firmware)\n"
" --silent Don't display error messages for kernel module install\n"
" --modalias Only generate module list from /sys/devices modalias list\n"
" -o --optional If kernel module does not exist, do not fail\n"
log_set_max_level(arg_loglevel);
}
+ struct utsname buf = {0};
if (!kerneldir) {
- struct utsname buf;
uname(&buf);
- _asprintf(&kerneldir, "%s%s", "/lib/modules/", buf.release);
+ _asprintf(&kerneldir, "/lib/modules/%s", buf.release);
}
if (arg_modalias) {
if (arg_module) {
if (!firmwaredirs) {
- char *path = NULL;
-
- path = getenv("DRACUT_FIRMWARE_PATH");
+ char *path = getenv("DRACUT_FIRMWARE_PATH");
if (path) {
log_debug("DRACUT_FIRMWARE_PATH=%s", path);
firmwaredirs = strv_split(path, ":");
} else {
- firmwaredirs = strv_new("/lib/firmware", NULL);
+ if (!*buf.release)
+ uname(&buf);
+
+ char fw_path_para[PATH_MAX + 1] = "";
+ int path = open("/sys/module/firmware_class/parameters/path", O_RDONLY | O_CLOEXEC);
+ if (path != -1) {
+ ssize_t rd = read(path, fw_path_para, PATH_MAX);
+ if (rd != -1)
+ fw_path_para[rd - 1] = '\0';
+ close(path);
+ }
+ char uk[22 + sizeof(buf.release)], fk[14 + sizeof(buf.release)];
+ sprintf(uk, "/lib/firmware/updates/%s", buf.release);
+ sprintf(fk, "/lib/firmware/%s", buf.release);
+ firmwaredirs = strv_new(STRV_IFNOTNULL(*fw_path_para ? fw_path_para : NULL),
+ uk,
+ "/lib/firmware/updates",
+ fk,
+ "/lib/firmware",
+ NULL);
}
}
}