Автоматическая загрузка драйвера: Cron, Init или Modprobe

Main Problem

I am attempting to automate the loading of drivers for my system. The drivers were built manually and must be loaded manually. Another caveat is that one of the system drivers must be loaded and offloaded before manually inserting the built drivers. From the CLI, it looks something like this:

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

Options

I want to automate this at boot so that I don't have run the above each time. As I currently see it, I have several options:

  1. Cron

It looks as though I could use the @reboot string here to run the script

  1. Init

Alternatively, I thought about creating an init script but I don't necessarily need all the control over runlevel's or execution timing. Here I haven't seen any instances of multiples Exec's which would be necessary per "the other thing".

  1. Modprobe

Adding a conf file under /etc/modprobe.d seemed to make the most sense since, after all, I am trying to load some drivers. The only problem with this option is that I am not sure if drivers can be sequentially onloaded and then offloaded.

The other thing

The other part in all this is that after the drivers are loaded, I need to run a script as well:

#!/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

Which would seem to better fit under cron or init.

Which option is the best compromise of stability and ease of configuration?

Thanks in advance for any/all help!

0
задан 4 August 2020 в 21:31

2 ответа

Вы упустили одну возможность: использование systemd. Лично я считаю, что это наиболее элегантный способ настройки вашей системы (например, см. здесь для получения информации о слегка связанной проблеме).

Откройте терминал и создайте новую службу: sudo nano /etc/systemd/system/mydrivers.service[115305 visible(choose 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

Для этой службы я бы предпочел записать ваш код в исполняемый файл bash и запускать его в строке «Exec»

0
ответ дан 11 August 2020 в 20:11

Вот что я в итоге сделал:

  1. Скопировал встроенные модули *.ko в /lib/modules/5.4.0-42-generic/kernel/drivers/kinect

  2. Встроенный модуль с именем gspca_main.ko переименован в gspca_kinect_main.ko для предотвращения конфликта с основным драйвером

  3. Ran 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) для устройства обратной связи и включена:

    [Единица измерения]
    Description=V4L2 Loopback Service для веб-камеры Kinect
    
    [Услуга]
    Тип=простой
    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
    
    [Установить]
    WantedBy=многопользовательская.цель
    

    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
0
ответ дан 17 August 2020 в 14:28

Другие вопросы по тегам:

Похожие вопросы: