创建自己的deb可安装程序

1. 工具准备

sudo apt install -y build-essential dh-make debhelper devscripts

2. 确定下内核版本

uname -a

3. 创建特定的目录

mkdir -p driver_deb

mkdir -p driver_deb/DEBIAN

mkdir -p driver_deb/lib/modules/$(uname -r)/kernel/drivers/misc/

其中misc要替换成自己想放的目录,misc只是一个简单的示例,字符设备驱动

4. copy driver到deb目录

cp ~/project/linux_driver_study/ubuntu/hello_driver/hello_driver.ko ./driver_deb/lib/modules/5.15.0-136-generic/kernel/drivers/misc/

选择自己的目录

5. 编写控制文件 (DEBIAN/control)

touch driver_deb/DEBIAN/control

复制代码
Package: driver-kmod
Version: 1.0.0
Section: kernel
Priority: optional
Architecture: amd64
Depends: linux-image-5.15.0-136-generic
Maintainer: Zhongjun.yu@QUECTEL.COM
Description: Pre-built kernel module for MyDevice (hello_driver.ko)
 This package installs the pre-compiled kernel module (hello_driver.ko) for the MyDevice hardware. It is built specifically for kernel version 5.15.0-136-generic.
 **WARNING:** This driver will stop working if the kernel is upgraded! A new package built against the new kernel version is required.

根据客户信息修改此内容

  • 关键点解释:
    • Package: 给您的驱动包起个名字(如 mydriver-kmod)。
    • Version: 设置您驱动的版本。
    • Architecture: 必须匹配 您的 .ko 文件编译的目标架构(运行 dpkg --print-architecture 在目标机器上查看)。
    • Depends: linux-image-$(uname -r): 这是核心! 它声明此包只能 安装在具有 完全匹配 内核版本 $(uname -r) (即您步骤 1 获取的版本) 的系统上。如果系统内核升级了,apt/dpkg 会阻止安装此包(因为依赖不满足),或者会在升级后标记此包为"因依赖问题未配置"。这明确告诉用户和管理员:此驱动只适用于特定内核。
    • Description: 清晰描述,并包含 警告:此驱动与内核版本绑定,内核升级后失效。

6. 编写安装/卸载脚本

安装后脚本 ( DEBIAN/postinst**):** 用于在安装完 .ko 文件后更新内核模块依赖信息 (depmod)。

touch driver_deb/DEBIAN/postinst

复制代码
#!/bin/sh
set -e
# 更新模块依赖关系 (非常重要!否则可能无法加载)
/sbin/depmod -a || true
# 通常不建议在这里自动加载模块,由系统按需加载或配置modprobe规则更好
# /sbin/modprobe hello_driver > /dev/null 2>&1 || true
exit 0

卸载前脚本 ( DEBIAN/prerm**):** 尝试在删除 .ko 文件前卸载模块(如果已加载)。

touch driver_deb/DEBIAN/prerm

复制代码
#!/bin/sh
set -e
# 检查模块是否加载,如果加载则尝试卸载
if /sbin/lsmod | grep -q '^hello_driver\s'; then
    /sbin/rmmod hello_driver || true # 忽略卸载失败(如模块正在使用)
fi
exit 0

卸载后脚本 ( DEBIAN/postrm**):** 在删除 .ko 文件后再次更新模块依赖信息。

复制代码
#!/bin/sh
set -e
# 再次更新模块依赖关系 (清理)
/sbin/depmod -a || true
exit 0

7. 分配权限

chmod 0755 driver_deb/DEBIAN/postinst

chmod 0755 driver_deb/DEBIAN/postrm

chmod 0755 driver_deb/DEBIAN/prerm

chmod 0755 driver_deb/DEBIAN/control

8. 构建deb包

dpkg-deb --build driver_deb/

9. 安装 .deb

sudo apt install ./driver_deb.deb # 首选,自动处理依赖

sudo dpkg -i driver_deb.deb # 如果依赖已明确满足

10. 验证驱动是否安装

ls -l /lib/modules/5.15.0-136-generic/kernel/drivers/misc/hello_driver.ko

复制代码
sudo insmod /lib/modules/5.15.0-136-generic/kernel/drivers/misc/hello_driver.ko
lsmod | grep hello_driver   # 检查是否加载
sudo rmmod hello_driver # 卸载

11. 其他补充命令

dpkg -l | grep driver-kmod #查看是否已经安装

sudo dpkg -P driver-kmod #卸载

卸载后就没有ko了