• ubuntu 18.04换内核后找不到 /dev/ttyUSB0问题


    系统: win10 + ubuntu18.04.6
    内核:非默认内核,新安装的内核 5.4.0-42 版本
    uname -r
    5.4.0-42-generic

    问题:
    用USB转串口线连接开发版串口,
    ls /dev/tty*
    ls /dev |grep tty

    查找不到 ttyUSB0;

    lsmod | grep usbserial

    没有,说明系统不支持USB转串口。
    于是 参考博客安装驱动 ch340,
    在sudo make load , 报错:原因是执行 modprobe usbserial 报错

    modprobe: ERROR: could not insert ‘ch341’: Exec format error

    modprobe 加载模块时 出现权限不允许提醒;Operation not permitted 解决:root 权限,加 sudo

    modprobe 提示 FATAL: Module chrdevbase not found in directory /lib/modules/5.4.0-42-generic
    可能是缺少相关路径、文件或是文件名不需要带扩展
    使用modprobe xx 命令后,会到文件系统/lib/modules/xxxxx目录下查找相应的XX.ko文件;找不到报错;

    sudo cp ch34x.ko /lib/modules/uname -r/kernel/drivers/usb/serial/
    重启仍然 中找不到;

    对比 原来的内核版本 /lib/modules/5.4.0-84-generic/kernel/drivers/usb
    发现 /lib/modules/5.4.0-42-generic/kernel/drivers/usb 中少了 usbserial 文件夹,而且少了很多 drivers 文件。
    因此怀疑是在安装 5.4.0-42-generic 内核时,没有安装完全。
    通过 dpkg --get-selections | grep linux

    对比,发现新安装的 5.4.0-42-generic, 少了 linux-modules-extra;

    sudo apt install linux-modules-extra-5.4.0-42-generic
    重启后,
    /lib/modules/5.4.0-42-generic/kernel/drivers 中多了很多文件;
    /lib/modules/5.4.0-42-generic/kernel/drivers/usb 有了usbserial 文件夹;

    usbserial 文件夹中已经有 ch341.ko ,usbserial.ko 等驱动。

    lsmod | grep usbserial 还是没有;
    sudo modprobe usbserial # 加载模块
    lsmod | grep usbserial
    有了

    加载自带驱动 ch341.ko

    sudo insmod /lib/modules/5.4.0-42-generic/kernel/drivers/usb/usbserial /ch341.ko
    depmod
    执行depmod命令(建立该模块的依赖关系。也即必须用 depmod 来更新一下 /lib/modules/$(uname -r)/modules.dep 文件)

    rmmod 命令 卸载驱动;即 emmod ch341.ko
    再次: lsmod | grep usbserial
    显示正确:
    USB转串口线连接开发版串口,ls /dev |grep tty ,看到有了 ttyusb0;

    通过lsmod来查看当前系统中已经加载的模块,lsmod命令显示的当前内核已经加载的模块和驱动。
    执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,应此在编译核心时,务须把全部的功能都放入核心。您可以将这些功能编译成一个个单独的模块,待需要时再分别载入。
    lsmod命令显示的当前内核已经加载的模块和驱动。以下面行为例:

    scsi_mod 130637 6 qla2xxx,scsi

    _transport_fc,mptspi, mptscsih, scsi_transport_spi,sd_mod

    第1列:表示模块的名称,如scsi_mod表示scsi模块。

    第2列:表示模块的大小,如130637表示scsi_mod模块的大小为130637字节。

    第3列:表示依赖于该模块的个数,如6表示有6个模块依赖scsi_mod模块。

    第4列:表示依赖模块的内容,如qla2xxx表示Qlogic FC HBA光纤HBA卡模块。

    通常在使用lsmod命令时,都会采用类似lsmod|grep usbserial这样的命令来查询当前系统是否加载了某些模块。

    通常会配合grep来查看指定模块是否已经加载,若没有加载,先确认模块是否已经安装,安装完成后可以用modprobe 来加载

    modprobe insmod 加载模块和驱动

    modprobe -r 卸载模块;
    rmmod来卸载驱动。
    卸载驱动模块的时候,使用modprobe -r 卸载,不需要将后缀名,即 modprobe -r hello 就可以
    使用rmmod 卸载则必须要加后缀名.ko 即rmmod hello.ko
    与内核模块操作相关的命令还有:lsmod modinfo depmod rmmod insmod modprobe

    对于没有驱动或者不是用默默人驱动的话,可以参考 ,安装出 驱动;

  • 相关阅读:
    Flink 实践 | B站流式传输架构的前世今生
    这12款idea插件,能让你代码飞起来
    LeetCode 41. 缺失的第一个正数
    公有云厂商---服务对照表
    OpenCV10-图像直方图:直方图绘制、直方图归一化、直方图比较、直方图均衡化、直方图规定化、直方图反射投影
    Jmeter调用测试片段 —— 模块控制器
    直面货到人拣选未来,极智嘉PopPick方案成就行业发展新抓手
    C# 压缩PDF文件
    那些你面试必须知道的webpack知识点
    Photoshop使用笔记总目录
  • 原文地址:https://blog.csdn.net/qq_43222384/article/details/125995501