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
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:
It looks as though I could use the @reboot string here to run the script
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".
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 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!
Вы упустили одну возможность: использование 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»
Вот что я в итоге сделал:
Скопировал встроенные модули *.ko в /lib/modules/5.4.0-42-generic/kernel/drivers/kinect
Встроенный модуль с именем gspca_main.ko
переименован в gspca_kinect_main.ko
для предотвращения конфликта с основным драйвером
Ran 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
) для устройства обратной связи и включена:
[Единица измерения]
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