107 lines
3.5 KiB
Bash
Executable File
107 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# postinst - 安装后加载内核模块
|
|
|
|
set -e
|
|
|
|
# 当脚本由 dpkg 触发时,$DPKG_MAIN_TSN_PACKAGE 通常可用
|
|
# 如果为空,则回退到通过文件名解析
|
|
PACKAGE_NAME="${DPKG_MAIN_TSN_PACKAGE}"
|
|
if [ -z "$PACKAGE_NAME" ]; then
|
|
SCRIPT_NAME=$(basename "$0")
|
|
PACKAGE_NAME=$(echo "$SCRIPT_NAME" | sed 's/\.postinst$//' | sed 's/\.prerm$//')
|
|
fi
|
|
|
|
# 从 dpkg 数据库获取版本
|
|
if [ -n "$PACKAGE_NAME" ]; then
|
|
PACKAGE_VERSION=$(dpkg-query -W -f='${Version}' "$PACKAGE_NAME" 2>/dev/null)
|
|
# 去掉 Debian 修订号(-1, -2, -ubuntu1 等)
|
|
PACKAGE_VERSION=$(echo "$PACKAGE_VERSION" | sed 's/-.*$//')
|
|
fi
|
|
|
|
DKMS_SRC_DIR="/usr/src/${PACKAGE_NAME}-${PACKAGE_VERSION}"
|
|
|
|
# 从预期的源码释放路径去解析驱动名称
|
|
MAKEFILE_PATH="${DKMS_SRC_DIR}/Makefile"
|
|
MODULE_NAME=""
|
|
|
|
case "$1" in
|
|
configure)
|
|
echo "正在配置 ${PACKAGE_NAME} 软件包..."
|
|
|
|
# 创建 DKMS 源码目录
|
|
echo "创建 DKMS 源码目录: ${DKMS_SRC_DIR}"
|
|
mkdir -p "${DKMS_SRC_DIR}"
|
|
|
|
# 复制源码文件到 DKMS 目录
|
|
SOURCE_DIR="/usr/share/${PACKAGE_NAME}/source"
|
|
if [ -d "${SOURCE_DIR}" ]; then
|
|
echo "从 ${SOURCE_DIR} 复制源码到 DKMS 目录..."
|
|
cp -rf "${SOURCE_DIR}"/* "${DKMS_SRC_DIR}/"
|
|
fi
|
|
|
|
# 确保 dkms.conf 存在
|
|
if [ ! -f "${DKMS_SRC_DIR}/dkms.conf" ]; then
|
|
echo "错误: DKMS 配置文件不存在: ${DKMS_SRC_DIR}/dkms.conf" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# 动态解析驱动模块名称
|
|
if [ -f "${MAKEFILE_PATH}" ]; then
|
|
MODULE_NAME=$(sed -n -E 's/^DRIVER_NAME[[:space:]]*:?=[[:space:]]*([^[:space:]]+).*/\1/p' "${MAKEFILE_PATH}" | head -1 | sed 's/\.ko$//')
|
|
fi
|
|
|
|
# 如果 Makefile 里没解析出来,降级使用包名作为模块名
|
|
if [ -z "$MODULE_NAME" ]; then
|
|
MODULE_NAME="${PACKAGE_NAME}"
|
|
fi
|
|
echo "解析到的驱动模块名称: ${MODULE_NAME}"
|
|
|
|
# 设置正确的权限
|
|
# chmod -R 644 "${DKMS_SRC_DIR}"
|
|
|
|
# 添加到 DKMS
|
|
echo "添加 ${PACKAGE_NAME} 到 DKMS..."
|
|
if ! dkms status -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}" | grep -q "added"; then
|
|
dkms add -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}"
|
|
fi
|
|
|
|
# 编译模块
|
|
echo "编译内核模块..."
|
|
dkms build -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}"
|
|
|
|
# 安装模块
|
|
echo "安装内核模块..."
|
|
dkms install -m "${PACKAGE_NAME}" -v "${PACKAGE_VERSION}"
|
|
|
|
# 更新模块依赖
|
|
echo "更新模块依赖..."
|
|
depmod -a
|
|
|
|
# 加载模块
|
|
echo "加载内核模块: ${MODULE_NAME}"
|
|
if modprobe "${MODULE_NAME}" 2>/dev/null; then
|
|
echo "模块 ${MODULE_NAME} 加载成功"
|
|
else
|
|
echo "错误: 模块 ${MODULE_NAME} 加载失败" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# 设置模块开机自动加载
|
|
if [ ! -f "/etc/modules-load.d/${PACKAGE_NAME}.conf" ]; then
|
|
echo "配置模块开机自动加载..."
|
|
echo "${MODULE_NAME}" > "/etc/modules-load.d/${PACKAGE_NAME}.conf"
|
|
fi
|
|
|
|
echo "${PACKAGE_NAME} 安装完成"
|
|
;;
|
|
|
|
abort-upgrade|abort-remove|abort-deconfigure)
|
|
echo "安装过程被中断,不做配置"
|
|
;;
|
|
|
|
*)
|
|
echo "postinst 被调用时参数: $1" >&2
|
|
;;
|
|
esac
|
|
|
|
exit 0 |