[SOLVED]using dkms to install driver with errors

16 Mar 2018

起因

由于笔记本(ThinkPad X1C 2014)在Linux下的待机时间远不如Windows,经过简单的搜索,发现了TLP这款能耗管理神器,调教起来还比较简单,基本只要用自带的能源方案就已经够了,其他的就不多说了,因为美帝良心想的本子都有一个电源管理设置叫充放电阈值(这个还是刚查的)有利于笔记本电源的保养,在我的历代笔记本里都是电池先DIE,所以对此比较在意,就查了一下,TLP是支持[仅ThinkPad]的该项设置,在/etc/default/tlp中,需要acpi-call这个模块,对,这就是本文的主角。
按照TLP官网教程安装过程很顺利

sudo apt-get update && sudo apt-get install acpi-call-dkms
# 好,没有报错,那现在来检查一下有没有效果

sudo tlp-stat
# 结果还是inactive,显示没有安装,我想,那是不是dkms要手动安装啊?Google上没找到,然后我想到了软件自带的帮助

sudo dpkg -l | grep dkms # 确认一下有这个软件包

sudo dkms install # 猜测是这么用

#然后会提示这么用不对,使用 help 命令查询使用方式

sudo dkms help #诶!这个autoinstall好像可以

Usage: /usr/sbin/dkms [action] [options]
  [action]  = { add | remove | build | install | uninstall | match | autoinstall
               | mkdriverdisk | mktarball | ldtarball | mkrpm | mkkmp | mkdeb | mkbmdeb | status }
  [options] = [-m module] [-v module-version] [-k kernel-version] [-a arch]
              [-d distro] [-c dkms.conf-location] [-q] [--force] [--all]
              [--templatekernel=kernel] [--directive='cli-directive=cli-value']
              [--config=kernel-.config-location] [--archive=tarball-location]
              [--kernelsourcedir=source-location] [--no-prepare-kernel] [--no-initrd]
              [--binaries-only] [--source-only] [-r release (SuSE)] [--verbose]
              [--size] [--spec=specfile] [--media=floppy|iso|tar] [--legacy-postinst=0|1]
              [--no-depmod]
              [-j number]
Error! No action was specified.
sudo dkms autoinstall

问题

提示是这样的,大概意思就是说引用函数没有找到

DKMS make.log for acpi_call-1.2.0 for kernel 4.12.1-chrysalis (x8664)
Thu Jul 13 19:31:39 CEST 2017
make -C /lib/modules/4.12.1-chrysalis/build M=/var/lib/dkms/acpi_call/1.2.0/build modules
make[1]: Entering directory ‘/tmp/linux-4.12.1’
CC [M] /var/lib/dkms/acpi_call/1.2.0/build/acpi_call.o
/var/lib/dkms/acpi_call/1.2.0/build/acpi_call.c: In function ‘acpi_proc_write’:
/var/lib/dkms/acpi_call/1.2.0/build/acpi_call.c:307:9: error: implicit declaration of function ‘copy_from_user’ [-Werror=implicit-function-declaration]
if (copy_from_user( input, buff, len )) {
^~~~~~~~~~~~~~
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:309: /var/lib/dkms/acpi_call/1.2.0/build/acpi_call.o] Error 1
make[1]: *** [Makefile:1512: _module
/var/lib/dkms/acpi_call/1.2.0/build] Error 2
make[1]: Leaving directory ‘/tmp/linux-4.12.1’
make: *** [Makefile:7: default] Error 2

然后在网上找了很久,对应的方法都没有解决:

后来注意到有两个版本:copy_from_user这个函数在<asm/uaccess.h>另一说是在<linux/uaccess.h>,用locate命令查到源码位置后,发现是引用的是<asm/uaccess.h>,之前挖坑的时候遇到过不在标准位置这个问题,就想着这个是不是在linux/下面,于是把asm改成了linux,先手动运行了一下make,跑通了,然后

sudo dkms autoinstall