主要问题
我正在尝试自动加载系统的驱动程序。驱动程序是手动构建的,必须手动加载。另一个需要注意的是,在手动插入构建的驱动程序之前,必须加载和卸载其中一个系统驱动程序。从 CLI 来看,它看起来像这样:
modprobe gspca_main && rmmod gspca_main && modprobe videodev && insmod gspca_main.ko && insmod gspca_kinect2.ko
选项
我想在启动时自动执行此操作,这样我就不必每次都运行上述操作。就我目前所见,我有几个选择:
- 克罗恩
看起来我可以使用@reboot字符串这里运行脚本
- 在里面
或者,我考虑创建一个init
脚本,但我不一定需要对runlevel
或执行时间的所有控制。在这里,我还没有看到任何需要多个 的实例,Exec
而这对于“其他事情”来说是必要的。
- 模组探针
添加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
或init
。
哪个选项在稳定性和易配置性之间达到了最佳平衡?
提前感谢所有帮助!
答案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
以下是我最终做的事情:
将构建的 *.ko 模块复制到
/lib/modules/5.4.0-42-generic/kernel/drivers/kinect
将构建的模块重命名为,
gspca_main.ko
以gspca_kinect_main.ko
防止与主驱动程序冲突冉
depmod
添加:
videodev gspca_kinect_main gspca_kinect2 v4l2loopback
/etc/modules
在启动时加载创建文件
/etc/modprobe.d/v4l2loopback.conf
内容如下:options video_nr=10 card_label="Kinect v2"
为环回设备创建 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_main
lsmod
- 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