Я нашел способ заставить его работать, но я не доволен своим решением, поэтому я все еще ищу лучший ответ.
Часть 1. Я предотвратил попытку ntpd
сбросить привилегии суперпользователя.
В /usr/lib/systemd/system/ntpd.service
по умолчанию:
[Service]
EnvironmentFile=-/etc/sysconfig/ntpd
ExecStart=/usr/sbin/ntpd -u ntp:ntp $OPTIONS
поэтому я «удаляю» -u ntp:ntp
, помещая/etc/systemd/system/ntpd.service.d/local.conf
[Service]
ExecStart=
ExecStart=/usr/sbin/ntpd $OPTIONS
Что позволяет ntpd
продолжать работу от имени пользователя root. Это работает, но я не доволен таким подходом.
Часть 2. Необновляемая часть местного времени
Добавление в /etc/ntp.conf
строки disable kernel
приводит к тому, что ntpd
при запуске службы регистрирует ошибку ntp_adjtime() failed: Operation not permitted
только один раз, а не 3 раза без настройки. Поскольку он не может изменить часы, это приемлемо. В идеале даже не пытаться переводить часы.
Частичный ответ :Драйверы USB, как правило, представляют собой модули ядра, которые загружаются для конкретных USB-устройств, просматривая идентификатор производителя/устройства и другие шаблоны, встроенные в модуль. Вы можете найти эту информацию для существующих драйверов с modinfo
, например.
$ sudo modinfo usbhid
filename: /lib/modules/4.12.13/kernel/drivers/hid/usbhid/usbhid.ko
license: GPL
description: USB HID core driver
author: Jiri Kosina
author: Vojtech Pavlik
author: Andreas Gal
alias: usb:v*p*d*dc*dsc*dp*ic03isc*ip*in*
depends: hid,usbcore
intree: Y
vermagic: 4.12.13 SMP preempt mod_unload modversions 686
parm: mousepoll:Polling interval of mice (uint)
parm: jspoll:Polling interval of joysticks (uint)
parm: ignoreled:Autosuspend with active leds (uint)
parm: quirks:Add/modify USB HID quirks by specifying
quirks=vendorID:productID:quirks where vendorID, productID, and quirks are all in 0x-prefixed hex (array of charp)
Существуют также различные инструменты, которые могут показать существующему устройству, какой драйвер используется. Я считаю, что все они в конечном итоге используют информацию из иерархии /sys
.
Так что если вы хотите написать новый драйвер, вам нужно научиться писать модуль ядра (гугл, тут есть туториалы ). Выберите существующий драйвер и измените его.
Вы также можете писать «драйверы» (или, скорее, прикладные программы )в пространстве пользователя с библиотекой типа libusb .
Документация ядра также включает информацию о USB API и, соответственно, информацию о том, как работает стек USB.