主要问题

主要问题

主要问题

我正在尝试自动加载系统的驱动程序。驱动程序是手动构建的,必须手动加载。另一个需要注意的是,在手动插入构建的驱动程序之前,必须加载和卸载其中一个系统驱动程序。从 CLI 来看,它看起来像这样:

modprobe gspca_main && rmmod gspca_main && modprobe videodev && insmod gspca_main.ko && insmod gspca_kinect2.ko

选项

我想在启动时自动执行此操作,这样我就不必每次都运行上述操作。就我目前所见,我有几个选择:

  1. 克罗恩

看起来我可以使用@reboot字符串这里运行脚本

  1. 在里面

或者,我考虑创建一个init脚本,但我不一定需要对runlevel或执行时间的所有控制。在这里,我还没有看到任何需要多个 的实例,Exec而这对于“其他事情”来说是必要的。

  1. 模组探针

添加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

哪一个似乎更适合croninit

哪个选项在稳定性和易配置性之间达到了最佳平衡?

提前感谢所有帮助!

答案1

您忽略了一种可能性:使用 systemd。我个人认为这是调整系​​统的最优雅方式(例如参见这里针对稍微相关的问题)。

打开终端并创建一个新服务:( sudo nano /etc/systemd/system/mydrivers.service选择 anyName.service)

(除了使用 nano 之外,您还可以使用sudo -H gedit /etc/..

其内容如下:

[Unit]
Description= Your description here

[Service]
Type=simple
ExecStart= /usr/local/bin/myExecutableBash.sh #or whatever is executable

[Install]
WantedBy=multi-user.target

要启用该服务,请执行:

sudo systemctl enable mydrivers.service(或您的服务名称)

要立即启动服务:

sudo systemctl start mydrivers.service

你的第二部分可以类似地解决:你需要创建另一个服务受抚养人在您的第一个服务上。
因此服务应该以以下内容开头:

[Unit]
Description= Your description here
After=mydrivers.service  

[Service]
... your code here

对于这项服务,我更愿意将您的代码写入可执行 bashfile 并在“Exec”行中启动它

答案2

以下是我最终做的事情:

  1. 将构建的 *.ko 模块复制到/lib/modules/5.4.0-42-generic/kernel/drivers/kinect

  2. 将构建的模块重命名为,gspca_main.kogspca_kinect_main.ko防止与主驱动程序冲突

  3. depmod

  4. 添加:

    videodev
    gspca_kinect_main
    gspca_kinect2
    v4l2loopback 
    

    /etc/modules在启动时加载

  5. 创建文件/etc/modprobe.d/v4l2loopback.conf内容如下: options video_nr=10 card_label="Kinect v2"

  6. 为环回设备创建 ffmpeg 服务 ( v4l2loopback.service) 并启用它:

    [Unit]
    Description=V4L2 Loopback Service for Kinect Webcam
    
    [Service]
    Type=simple
    ExecStart=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
    
    [Install]
    WantedBy=multi-user.target
    

    systemctl v4l2loopback enable

我无法回答的问题: - 为什么模块像输出中gspca_kinect_main.ko那样加载?gspca_mainlsmod

- Two additional devices now appear: /dev/video3 and /dev/video4 that are not functional; where did they come from?

我本可以为 gspca_kinect_main 和 gspca_kinect2 创建依赖关系,但目前没有必要基于 /etc/modules

完整安装文件:

apt-get install ffmpeg

echo "Cloning GSPCA Repo..."
git clone https://github.com/grandchild/gspca-kinect2.git && cd gspca-kinect2
echo "Building & Installing Modules (copying into /lib/modules/`uname -r`/kernel/drivers/kinect)"
make -C /lib/modules/`uname -r`/build  M=`pwd` SRCROOT=`pwd` clean modules
cp gspca_main.ko gspca_kinect_main.ko
mkdir /lib/modules/`uname -r`/kernel/drivers/kinect
cp gspca_kinect_main.ko /lib/modules/`uname -r`/kernel/drivers/kinect/gspca_kinect_main.ko
cp gspca_kinect2.ko /lib/modules/`uname -r`/kernel/drivers/kinect/gspca_kinect2.ko
cd ..

echo "Cloning V4L2Loopback Repo..." 
git clone https://github.com/umlaeute/v4l2loopback.git && cd v4l2loopback
echo "Building and Installing Modules"
make && make install
cd ..
echo "Resolving Module Dependencies"
depmod -a
echo "Enabling GSPCA & V4L2Loopback Modules at boot"
for module in "videodev" "gspca_kinect_main" "gspca_kinect2" "v4l2loopback"
do
    if grep -Fxq $module /etc/modules
    then
            echo "$module found - skipping..."
    else
            echo "$module not found - adding to /etc/modules"
                echo $module >> /etc/modules
    fi
done

echo "options video_nr=10 card_label='Kinect v2'" > /etc/modprobe.d/v4l2loopback.conf

echo "Starting Modules"
modprobe videodev
modprobe gspca_kinect_main
modprobe gspca_kinect2
modprobe v4l2loopback video_nr=10 card_label="Kinect v2"

echo "Creating ffmpeg service v4l2-kinect.service"
echo "[Unit]
Description=V4L2 Loopback Service for Kinect Webcam

[Service]
Type=simple
ExecStart=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

[Install]
WantedBy=multi-user.target" > /lib/systemd/system/v4l2-kinect.service

echo "Enabling v4l2-kinect.service at boot"
systemctl enable v4l2-kinect

相关内容