Функция strlcpy не найдена

Debian – стабильная ОС. Но стабильность версий пакетов иногда необходимо нарушить. К примеру, при использовании нового железа, имеет смысл использовать backport ядра Linux. Я так и делаю.

На днях я столкнулся с новой проблемой. При обновлении ядра до версии 6.9, я увидел ошибки DKMS. В частности, ошибки у модуля v4l2loopback.

Оказывается, Linux 6.8 больше не имеет функции strlcpy, как и ряда других. В обсуждении проблемы на GitHub однозначно озвучивают требование версии ≥13 для v4l2loopback. Но такой версии в bookworm (stable) нет, там версия 12.

Нужная версия имеется у Debian только в trixie и sid, но не в backports для stable. Значит, имеет смысл собрать пакет для stable самостоятельно.

Первым шагом устанавливаем необходимый тулинг.

$ sudo apt install build-essential devscripts

Теперь создаём рабочую папку для нового пакета.

$ mkdir v4l2loopback-backport
$ cd v4l2loopback-backport/

Идём на страницу пакета v4l2loopback для trixie. Там есть ссылки на файлы .dsc, .orig.tar.gz и .debian.tar.xz. Нас интересует именно .dsc файл. Достаточно скопировать ссылку и скормить её инструменту dget.

$ dget http://deb.debian.org/debian/pool/main/v/v4l2loopback/v4l2loopback_0.13.2-1.dsc

dget: retrieving http://deb.debian.org/debian/pool/main/v/v4l2loopback/v4l2loopback_0.13.2-1.dsc
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2375  100  2375    0     0  38990      0 --:--:-- --:--:-- --:--:-- 39583
dget: retrieving http://deb.debian.org/debian/pool/main/v/v4l2loopback/v4l2loopback_0.13.2.orig.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 84819  100 84819    0     0  1030k      0 --:--:-- --:--:-- --:--:-- 1035k
dget: retrieving http://deb.debian.org/debian/pool/main/v/v4l2loopback/v4l2loopback_0.13.2-1.debian.tar.xz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9396  100  9396    0     0   186k      0 --:--:-- --:--:-- --:--:--  187k
v4l2loopback_0.13.2-1.dsc:
      Good signature found
   validating v4l2loopback_0.13.2.orig.tar.gz
   validating v4l2loopback_0.13.2-1.debian.tar.xz
All files validated successfully.
gpg: no valid OpenPGP data found.
dpkg-source: info: extracting v4l2loopback in v4l2loopback-0.13.2
dpkg-source: info: unpacking v4l2loopback_0.13.2.orig.tar.gz
dpkg-source: info: unpacking v4l2loopback_0.13.2-1.debian.tar.xz

Инструмент dget – это не более, чем скрипт, который загружает .dsc, .orig.tar.gz и .debian.tar.xz, проверяет их и распаковывает.

В общем смысле, можно то же самое сделать с помощью wget и dpkg-source -x, но проще воспользоваться dget.

Переходим в новую папку, в которую dget распаковал исходный код.

$ cd v4l2loopback-0.13.2/

И запускаем сборку с помощью debuild:

$ debuild -b -uc -us

 dpkg-buildpackage -us -uc -ui -b
dpkg-buildpackage: info: source package v4l2loopback
dpkg-buildpackage: info: source version 0.13.2-1
dpkg-buildpackage: info: source distribution unstable
dpkg-buildpackage: info: source changed by IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
 dpkg-source --before-build .
dpkg-buildpackage: info: host architecture amd64
dpkg-checkbuilddeps: error: Unmet build dependencies: help2man
dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting
dpkg-buildpackage: warning: (Use -d flag to override.)
debuild: fatal error at line 1182:
dpkg-buildpackage -us -uc -ui -b failed

Как видим, не хватает зависимостей (help2man). Не проблема. Есть возможность автоматически установить все необходимые зависимости с помощью apt.

$ sudo apt build-dep .

Note, using directory '.' to get the build dependencies
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  help2man
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 198 kB of archives.
After this operation, 555 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://deb.debian.org/debian bookworm/main amd64 help2man amd64 1.49.3 [198 kB]
Fetched 198 kB in 0s (1 517 kB/s)
Selecting previously unselected package help2man.
(Reading database ... 376690 files and directories currently installed.)
Preparing to unpack .../help2man_1.49.3_amd64.deb ...
Unpacking help2man (1.49.3) ...
Setting up help2man (1.49.3) ...
Processing triggers for man-db (2.11.2-2) ...
Processing triggers for install-info (6.8-6+b1) ...

Зависимости успешно установились, запускаем сборку заново. Вывод компилятора опускаю, т.к. он не представляет интереса.

$ debuild -b -uc -us

Опять же, debuild – не более, чем удобный скрипт, как и dget. Они призваны упростить работу по сборке пакетов. При особом желании можно воспользоваться напрямую dpkg-buildpackage.

Выходим из папки с исходным кодом после успешной компиляции и проверяем наличие .deb пакетов.

$ cd ..
$ ls -1 *.deb

v4l2loopback-dkms_0.13.2-1_all.deb
v4l2loopback-source_0.13.2-1_all.deb
v4l2loopback-utils_0.13.2-1_amd64.deb
v4l2loopback-utils-dbgsym_0.13.2-1_amd64.deb

Из получившихся пакетов нас интересует только v4l2loopback-dkms и v4l2loopback-utils. Устанавливаем их.

$ sudo apt install \
    ./v4l2loopback-dkms_0.13.2-1_all.deb \
    ./v4l2loopback-utils_0.13.2-1_amd64.deb

Вот и всё, пакет из trixie теперь и на stable!


Стоит отдельно отметить, что, в моём случае с v4l2loopback, модуль потребовал ещё пары действий.

Первое – требование переустановки модуля, иначе я получал ошибки вида WARNING! Diff between built and installed module! в dkms status.

$ sudo dkms install v4l2loopback/0.13.2 --force

Второе – пришлось явно включить загрузку модуля v4l2loopback, создав файл .conf в modules-load.d.

$ echo 'v4l2loopback' | sudo tee /etc/modules-load.d/v4l2loopback.conf

v4l2loopback

После этого v4l2loopback работает как предполагается “из коробки”.

Журнал изменений

21 августа 2024 г.: убрал бесполезное упоминание fakeroot.

9 октября 2024 г.: заменил ls -l на ls -1, поправил форматирование.

9 ноября 2024 г.: добавил cd для перехода в рабочую папку.

Если Вы хотите обсудить содержание заметки, задать вопросы или предложить изменения, то со мной можно связаться в Telegram