- 建立根目录, 目录名称为test
- 在test目录下建立配置文件目录:DEBIAN和程序文件目录:usr,目录结构如下所示:
3.DEBIAN目下创建文件名分别为control、md5sums、postinst、postrm、prerm的配置文件,如下所示:
a、control包描述文件
Package: test
Version: 1.0.0
Architecture: arm64
Maintainer: jason
Installed-Size: 351
Depends: dkms (>= 2.1.0.0)
Section: misc
Priority: optional
Description: test driver in DKMS format.
b、md5sums各个文件的md5校验值,这个文件是非必须的
c、postinst安装包后执行文件
#!/bin/bash
echo "=========================================="
#echo "请阅读以下协议:"
cat /usr/share/doc/test/copyright
#read -t 3 -p "请输入是否接受该协议,3秒后默认接受该协议,自动进行安装[yes/no]:" ans
#if [ -z ${ans} ] ;then
# ans="yes"
# echo ""
#fi
#ans=$(echo $ans | tr '[A-Z]' '[a-z]')
#if ( [ ${ans} != yes ] && [ ${ans} != y ] ) ;then
# echo "[INFO] 由于您拒绝接受协议,安装程序自动退出!"
# exit -1
#fi
#echo "[INFO] 接受该协议,自动进行安装。"
BUILD_SYS=4.4.131-20200710.kylin.desktop-generic
INSTALL_SYS=`uname -r`
echo "================================================================================================"
echo " BUILD SYSTEM ${BUILD_SYS} "
echo " INSTALL SYSTEM ${INSTALL_SYS} "
echo "================================================================================================"
if [ ${BUILD_SYS} != ${INSTALL_SYS} ];then
echo "[ERROR]检查到系统内核版本与驱动编译版本不同!"
echo "[ERROR]请在系统内核版本为 ${BUILD_SYS} 对于的 test"
echo "[WARNING]对于内核不匹配的驱动,安装后将有可能导致黑屏,死机等可能性,"
read -p "是否强制安装[yes/no]:" ans
ans=$(echo $ans | tr '[A-Z]' '[a-z]')
if ( [ ${ans} != yes ] && [ ${ans} != y ] ) ;then
echo "[INFO] 安装程序已退出,程序未安装."
exit -1
else
echo "[INFO] 强制执行安装程序."
fi
fi
DEB_NAME=test
NAME=test
VERSION=1.0.0
for kv in `ls /lib/modules/ |grep -e 3.14 -e 4.4` ; do
if [ -d /lib/modules/${kv}/build/ ]; then
echo install ${NAME}/${VERSION} to kernel ${kv}
dkms add ${NAME}/${VERSION}
dkms build ${NAME}/${VERSION}
dkms install ${NAME}/${VERSION} -k ${kv}
update-initramfs -u -k ${kv}
cp /boot/initrd.img-${kv} /boot/initramfs.img-${kv}
depmod -a
insmod /lib/modules/${INSTALL_SYS}/kernel/drivers/char/${NAME}.ko
sleep 1
chmod 777 /dev/test
echo "test" >> /etc/modules
else
echo /lib/modules/${kv}/build/ directory is not exist.
fi
done
exit 0
d、postrm删除包后执行文件
#!/bin/sh
for kv in `ls /lib/modules/ |grep -e 3.14 -e 4.4` ; do
if [ -d /lib/modules/${kv}/build/ ]; then
update-initramfs -u -k ${kv}
cp /boot/initrd.img-${kv} /boot/initramfs.img-${kv}
fi
done
exit 0
e、prerm删除包前执行文件
#!/bin/sh
DEB_NAME=test
NAME=test
VERSION=1.0.0
dkms remove ${NAME}/${VERSION} --all
exit 0
4.usr实际上是文件要安装的目录,该目下创建sbin、share、src三个目录,如下所示:
a、sbin目录下放置应用程序
b、share存放文档,这个目录也是非必需创建的
例子中在该目录下创建一个doc目录,doc下创建一个test目录,存放版权信息等类容,share目录结构如下:
test目录下可以创建一个版权文件:copyright,内容如下:
test版本信息读取程序
copyright@ 2021-2022 jingjiaMicro All rights reserved
<author> <time> <version>
jason 2021/07/23 V1.0.0
c、src目录下放置dkms驱动程序
src目录结构如下:
test-1.0.0目录下放置驱动相关文件和makefile,如下所示:
其中dkms.conf为编译dkms驱动的配置文件,内容如下:
PACKAGE_NAME="test"
PACKAGE_VERSION="1.0.0"
MAKE[0]="make -C ${dkms_tree}/test/${PACKAGE_VERSION}/build/"
CLEAN="make -C ${dkms_tree}/test/${PACKAGE_VERSION}/build/ clean"
BUILT_MODULE_NAME[0]="test"
DEST_MODULE_LOCATION[0]="/kernel/drivers/char"
AUTOINSTALL="yes"
REMAKE_INITRD="true"
其中Makefile文件内容如下:
obj-m := test.o
test-objs := test.o.dkms
ifneq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(KERNELRELEASE)/build
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
endif
PWD := $(shell pwd)
.PHONY: all
all: clean modules #install
.PHONY: modules
modules:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
.PHONY: clean
clean:
$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
5、目录创建完后,在test目录下用dpkg -b test命令创建deb安装包,名称执行成功后会生成名称为:test.deb的安装包。如果提示提示postinst 权限错误,将DEBIAN目录下所有配置文件权限修改成775即可。
相关命令说明:
dkms 驱动创建:
1、将源文件拷贝到 /usr/src目录,源文件目录格式name-version 例如test-0.1
2、添加模块:dkms add test/0.1 (删除模块命令 dkms remove test/0.1 --all)
3、编译模块: dkms build test/0.1
4、安装模块:dkms install test/0.1 (协助模块命令dkms uninstall test/0.1)
deb包命令:
创建deb包命令:dpkg -b lpc
安装deb包:dpkg -i lpc.deb
卸载deb包:dpkg -r lpc
安装包例子下载地址,包含以上涉及的创建所需文件: