标签: kernel-modules

在一台机器上构建内核,在另一台机器上安装

我想在我的主机上构建 Linux 内核并在我的 VWware 虚拟机中使用它。他们现在都使用相同的 Ubuntu 内核。

在我的主机上,我执行makemake configuremake modules_install那么,在执行和之前,我应该将哪些文件复制到目标计算机make install

我还需要做哪些事情?

compiling kernel kernel-modules

7
推荐指数
2
解决办法
9305
查看次数

如何修复明显缺失的内核模块依赖声明?

我遇到了 ASIX AX88179 USB 3.0 千兆位以太网适配器的一个相对常见的问题,它根本无法工作,或者偶尔工作,并且dmesg显示如下错误

[23552.344134] ax88179_178a 2-1:2.1 eth1: Failed to read reg index 0x0000: -32
Run Code Online (Sandbox Code Playgroud)

在网上搜索时,我发现了有关此问题或类似问题的报告,但没有令人满意的解决方案或解释。

经过一番调试,发现如果cdc_mbim之前加载了模块,问题就解决了ax88179_178a。以下解决了该问题,直到下次重新启动为止:

# rmmod ax88179_178a
# modprobe cdc_mbim
# modprobe ax88179_178a  # optional
Run Code Online (Sandbox Code Playgroud)

我已经检查过没有直接或间接cdc_mbim声明为 的依赖项。ax88179_178a

我怎样才能使ax88179_178a依赖cdc_mbim,以便cdc_mbim始终自动加载ax88179_178a


更新。

我的问题似乎与Create Linux module dependency for autoloading module重复。

drivers usb configuration kernel-modules dependencies

7
推荐指数
1
解决办法
2345
查看次数

每次安装新内核时运行脚本

目前,每次获得新的内核版本时,我都必须从源代码重新编译无线驱动程序。我认为自动化这个过程是非常黑客行为,所以我将我的 Bash 构建脚本符号链接到/etc/kernel/postinst.d. 我已经验证它确实在安装最新的内核更新时运行,但仍然存在一个问题:驱动程序针对现有运行的内核版本进行编译。

例如,如果我运行 3.0.0-14-generic 并apt-get dist-upgrade运行到内核 3.0.0-15-generic,那么它会针对内核 3.0.0-14-generic 进行编译,这对我根本没有帮助。

有没有办法从我的内核 postinst 脚本中得知已安装哪个版本的内核,以便我可以将其传递给我的make调用,以便可以为新安装的内核进行编译?

kernel kernel-modules

6
推荐指数
1
解决办法
2804
查看次数

防止 usbhid 声明 USB 设备

直接相关:防止 usbhid 声称新奇的 USB 设备,以便我可以用 libusb 控制它?

我想从使用 libusb-0.1 的程序访问 RFID 阅读器(用作 HID 设备)。在代码中,内核驱动程序正确分离usb_detach_kernel_driver_np(没有错误),但似乎每当我的程序尝试访问 USB 设备时,usbhid 模块都会回收它。以下错误总是出现在dmesg

usb 1-1.3:usbfs:usbhid 声明的接口 0,而“MyProgram”设置配置 #1

我添加了以下 udev 规则,重新启动 udevd 并重新插入设备,但没有效果。它应该将设备列入黑名单,以免被 usbhid 使用。

# I anonymized the vendor/product IDs here
ATTRS{idVendor}=="dead", ATTRS{idProduct}=="beef", OPTIONS=="ignore_device"
Run Code Online (Sandbox Code Playgroud)

除了 dmesg 输出,我可以看到/sys/bus/usb/drivers/usbhid/设备1-1.3:1.0每次都会重新创建,因此黑名单似乎不起作用。

还有什么我可以尝试的吗?操作系统是 Raspbian(在 Raspberry Pi 上),内核为 3.2.27。

linux kernel usb kernel-modules devices

6
推荐指数
1
解决办法
2万
查看次数

linux内核模块的缺点?

我试图了解使用 Linux 内核模块的缺点。我了解使用它们的好处:能够将代码动态插入到正在运行的系统中,而无需重新编译和重新启动基本系统。鉴于这种强大的优势,我猜测大部分内核代码应该在内核模块中,而不是作为基本内核的一部分,但情况似乎并非如此——大量的核心子系统(如内存管理)仍然进入基础内核。

我能想到的一个原因是内核模块在引导过程中加载得很晚,因此核心功能必须在基本内核中。我阅读的另一个原因是关于碎片化。

我真的不明白为什么内核模块会导致内存碎片,有人可以解释一下吗?使用内核模块还有其他缺点吗?

kernel kernel-modules linux-kernel

6
推荐指数
2
解决办法
3812
查看次数

有没有办法确定内核模块是针对哪个内核版本编译的?

我最近一直在使用一些用于嵌入式设置的交叉工具来创建内核模块。

将来能够识别这些模块所针对的内核版本对我很有帮助。我在网上找不到关于这方面的信息,所以我开始认为这可能是不可能的。

所以我的问题是是否有任何命令行实用程序可以确定编译 *.ko 文件所针对的内核版本标头?

drivers kernel-modules

6
推荐指数
1
解决办法
2203
查看次数

rcu_sched 检测到 CPU 停顿

在客户设备中看到多个 rcu_sched 停顿消息,并且它崩溃/挂起。在这种情况下,无法通过 SSH 或 3G 访问设备。内核版本为 3.2.54。“rcu_sched 检测到 CPU 0 上的停顿”重复多次,这表明什么?该设备在电源循环测试期间表现出这种崩溃。acpower_isr()/poe_isr() 用于在每次切换期间更新交流电源状态/PoE 状态。这会导致问题吗?(无法解除锁定?)

    Backtrace: 
[<c4011504>] (dump_backtrace+0x0/0x110) from [<c43924bc>] (dump_stack+0x18/0x1c)
 r6:c962e080 r5:c96462e0 r4:c9ec4674 r3:c96429bc
[<c43924a4>] (dump_stack+0x0/0x1c) from [<c4082188>] (__rcu_pending+0x88/0x38c)
[<c4082100>] (__rcu_pending+0x0/0x38c) from [<c4083218>] (rcu_check_callbacks+0xe8/0x17c)
[<c4083130>] (rcu_check_callbacks+0x0/0x17c) from [<c4043ac4>] (update_process_times+0x40/0x64)
 r8:23339c9a r7:00000000 r6:c6f06ae0 r5:00000000 r4:c8ac8000
r3:00010000
[<c4043a84>] (update_process_times+0x0/0x64) from [<c406513c>] (tick_sched_timer+0x9c/0xdc)
 r7:c9ec44a0 r6:c8ac9dd8 r5:c8ac8000 r4:c9ec4598
[<c40650a0>] (tick_sched_timer+0x0/0xdc) from [<c405805c>] (__run_hrtimer+0xf4/0x1c8)
 r9:c8ac9d20 r8:23339580 r6:c9ec44d8 r5:c9ec44a0 r4:c9ec4598
[<c4057f68>] (__run_hrtimer+0x0/0x1c8) from [<c4058db4>] (hrtimer_interrupt+0x124/0x288)
[<c4058c90>] (hrtimer_interrupt+0x0/0x288) from [<c40139e0>] (twd_handler+0x28/0x30)
[<c40139b8>] (twd_handler+0x0/0x30) from [<c407f880>] (handle_percpu_devid_irq+0xd0/0x150)
 r4:0000001d …
Run Code Online (Sandbox Code Playgroud)

process kernel-panic kernel-modules linux-kernel crash

6
推荐指数
1
解决办法
3万
查看次数

覆盖 modprobe.d 黑名单

我使用的是 Ubuntu 18.04。我正在尝试在启动时加载模块;有问题的模块是 iTCO_wdt。关于将内核模块列入黑名单有很多问题,但我正在尝试将其中一个列入白名单。

以下是我尝试在启动时加载模块所遵循的步骤:

  1. 添加iTCO_wdt到 /etc/modules (符号链接到 /etc/modules-load.d/modules.conf)
  2. 注释掉blacklist iTCO_wdt/etc/modprobe.d/blacklist-watchdog.conf 中的行

我认为这已经足够了,但 syslog 仍然显示该模块已被列入黑名单:

systemd-modules-load[331]: Module 'iTCO_wdt' is blacklisted
Run Code Online (Sandbox Code Playgroud)

经过一番调查,我发现该模块也在 /lib/modprobe.d 中的几个维护者安装的黑名单文件中被列入黑名单:

systemd-modules-load[331]: Module 'iTCO_wdt' is blacklisted
Run Code Online (Sandbox Code Playgroud)

我发现每个文件确实影响了 modprobe 行为,这令人惊讶,因为当 linux_4.15.0.23-generic 是当前内核时,我不希望 linux_4.15.0.20-generic.conf 文件影响机器的行为。

注释掉blacklist iTCO_wdt每个文件中的行并重新启动后,模块会自动加载,这是所需的行为。

因此,正如我所见,有几种方法可以使模块加载,即使它被 /lib/modprobe.d 文件列入黑名单:

  • 手动注释掉blacklist iTCO_wdt每个文件中的行
  • 在我自己的启动时运行的脚本中加载模块

问题是未来的更新可能会安装新的 /lib/modprobe.d 黑名单文件,这可能会将 iTCO_wdt 重新列入黑名单。考虑到这一点,我最好的选择似乎是最后一个,尽管我真的不喜欢它,因为它依赖于我自己的脚本而不是内置的模块加载系统。

考虑到我不想在每次内核更新后编辑 /lib/modprobe.d 文件,在模块加载系统中将 iTCO_wdt 模块永久列入白名单的最佳方法是什么?

linux kernel-modules modprobe systemd

6
推荐指数
1
解决办法
4333
查看次数

了解linux以太网设备

我在 mips SoC 上有一个小型的、嵌入式的、完全自交叉编译的安装。

SoC 基于 Mediatek MT7628,带有 Wifi 接口(仅 2.4MHz)、100Mbps 以太网 MAC 和内部 5 端口以太网交换机(其中一个端口连接到 MAC)。

我将以太网设备驱动程序 (mtk-eth.ko) 编译为可安装模块。

如果我在没有模块的情况下启动(我实际上重命名了它,因此udevd无法“自动”安装它)我没有以太网设备,完全符合预期:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue qlen 1000
    link/ether b8:d8:12:64:b9:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.7.130/24 brd 192.168.7.255 scope global noprefixroute wlan0
       valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)

到目前为止没有什么奇怪的。接下来我手动安装模块:

# modprobe …
Run Code Online (Sandbox Code Playgroud)

linux embedded kernel-modules ethernet

6
推荐指数
1
解决办法
63
查看次数

alpine 中的等效软件包 build-essential 和 linux-headers-&lt;xxxx&gt; 是什么?

我想在 Alpine 中构建内核模块;我知道如何在 Ubuntu 中做到这一点。
在 Ubuntu 中,我曾经通过运行以下命令来安装内核头文件:

apt install -y build-essential linux-headers-$(uname -r)
Run Code Online (Sandbox Code Playgroud)

Alpine 中的等效项是什么?

我在网上搜索了一下,Github 用户 progrium 写了一条评论,相当于build-essentialis build-base,但是 呢linux-headers-$(uname -r)

ubuntu kernel-modules apt alpine-linux pkg

6
推荐指数
1
解决办法
6750
查看次数