主要问题
我正在尝试为我的系统自动加载驱动程序。驱动程序是手动构建的,必须手动加载。另一个需要注意的是,必须先加载和卸载其中一个系统驱动程序,然后才能手动插入构建的驱动程序。在 CLI 中,它看起来像这样:
modprobe gspca_main && rmmod gspca_main && modprobe videodev && insmod gspca_main.ko && insmod gspca_kinect2.ko
选项
我想在启动时自动执行此操作,这样我就不必每次都运行上述内容。正如我目前所看到的,我有几个选择:
- 克朗
看起来我可以在这里使用@reboot 字符串来运行脚本
- 在里面
或者,我考虑过创建一个init
脚本,但我不一定需要对runlevel
's 或执行时间的所有控制。在这里,我没有看到任何Exec
“另一件事”所必需的 multiples 实例。
- 模组探针
在下面添加一个conf
文件/etc/modprobe.d
似乎最有意义,因为毕竟我正在尝试加载一些驱动程序。这个选项的唯一问题是我不确定驱动程序是否可以顺序加载然后卸载。
另一件事
所有这一切的另一部分是在加载驱动程序后,我还需要运行一个脚本:
#!/bin/sh
sudo rmmod v4l2loopback
sudo modprobe v4l2loopback video_nr=10 card_label="Kinect v2"
ffmpeg \
-i /dev/video0 \
-vsync drop \
-filter:v fps=30,scale=1280:-1,hflip \
-pix_fmt yuyv422 \
-color_trc bt709 \
-color_primaries bt709 \
-color_range tv \
-f v4l2 \
/dev/video10
哪个似乎更适合cron
or init
。
哪个选项是稳定性和易于配置的最佳折衷方案?
提前感谢您的任何/所有帮助!
您省略了一种可能性:使用 systemd。就我个人而言,我认为这是调整系统的最优雅的方式(例如,请参阅此处了解稍微相关的问题)。
打开一个终端并创建一个新服务:(
sudo nano /etc/systemd/system/mydrivers.service
选择anyName.service)(除了使用 nano 你也可以使用
sudo -H gedit /etc/..
)它的内容:
要启用该服务,请执行:
sudo systemctl enable mydrivers.service
(或您的服务名称)立即启动服务:
sudo systemctl start mydrivers.service
您的第二部分可以类似地解决:您需要创建另一个依赖于您的第一个服务的服务。
所以服务应该从以下开始:
对于这项服务,我更愿意将您的代码写入可执行 bashfile 并在“Exec”行中启动它
这是我最终做的事情:
将构建的 *.ko 模块复制到
/lib/modules/5.4.0-42-generic/kernel/drivers/kinect
用名称重命名内置模块
gspca_main.ko
以gspca_kinect_main.ko
防止与主驱动程序冲突冉
depmod
添加:
在
/etc/modules
启动时加载创建
/etc/modprobe.d/v4l2loopback.conf
的文件内容:options video_nr=10 card_label="Kinect v2"
为环回设备创建了 ffmpeg 服务(
v4l2loopback.service
)并启用它:systemctl v4l2loopback enable
我无法回答的问题: - 为什么模块在输出中
gspca_kinect_main.ko
加载?gspca_main
lsmod
我本可以为 gspca_kinect_main 和 gspca_kinect2 创建一个依赖项,但目前不需要基于 /etc/modules
完整安装文件: