запуск usbip с помощью systemd

Las opciones de cambio del grupo -funcionan con 4 teclas simbólicas :ISO_First_Group, ISO_Last_Group, ISO_Next_Groupy ISO_Prev_Group. La opción que usa, grp:rshift_toggle, solo proporciona ISO_Next_Group, por lo que recorrer los diseños es todo lo que ve.

El comportamiento que está buscando (seleccione un diseño específico )existe en los keysyms ISO_First_Groupo ISO_Last_Group. Quiere encontrar un (existente o escribir una nueva opción )que suministre al menos uno de esos keysyms.

Mirando rápidamente a través de man xkeyboard-config, estas opciones existentes parecen incluirISO_First_Group:

  • grp:shift_caps_switch:Bloqueo de mayúsculas al primer diseño; Mayús+Bloq Mayús al último diseño
  • grp:win_menu_switch:Ganancia izquierda al primer diseño; Derecha Win/Menú al último diseño
  • grp:lctrl_rctrl_switch:Ctrl izquierdo al primer diseño; Ctrl derecho al último diseño
  • grp:lctrl_lwin_rctrl_menu:Left Ctrl+Left Win al primer diseño; Ctrl derecho+Menú al segundo diseño

Estas opciones se definen en /usr/share/X11/xkb/symbols/group. Uno de ellos puede ser aceptable para su uso. Si no proporcionan exactamente lo que desea, puede usar las definiciones para adaptar su mapa de teclas a sus necesidades.

1
07.07.2019, 11:58
2 ответа

Основываясь на ссылке OP, размещенной в комментариях , проблема, похоже, была здесь:

ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/usr/sbin/usbip bind --busid 1-1.5

Если вы не укажете параметр Type=для службы systemd, предполагается, что служба относится к Type=simple. В этом случае systemd будет считать, что процесс, запущенный с опцией ExecStart=, будет работать вечно, если все в порядке. Но команда usbip bindпросто говорит процессу usbipdвзять на себя управление службой, а затем завершает работу. Затем systemd подумает: «О нет, служба дала сбой!», и, поскольку у нее также Restart=on-failure, она будет перезапускать службу снова, и снова, и снова.

Чтобы заставить его работать, вы можете указать Type=forkingи сделать фактический процесс usbipdстрокой ExecStart=, а usbip bind— строкой ExecStartPost=, как это предлагается в ссылке, которую вы разместили. Но в этом решении есть ошибка, типичная для новых пользователей systemd :: вы предполагаете, что usbipdдолжен стать процессом демона сам по себе, в то время как systemd может легко сделать это за вас.

Лучшее решение — удалить параметр -Dиз командной строки usbipdи опуститьType=forking(или явно использовать Type=simple). Таким образом, systemd выполнит демонизацию за вас, а также сможет контролировать и останавливать процесс обслуживания, не прибегая к PID-файлам или случайным командам killall usbipdExecPost=.

Итак, я бы порекомендовал:

[Unit]
Description=USB-IP Binding
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/sbin/usbipd
ExecStartPost=/usr/sbin/usbip bind --busid 1-1.5
ExecStop=/usr/sbin/usbip unbind --busid 1-1.5  

[Install]
WantedBy=multi-user.target

С этими настройками systemd будет ожидать, что процесс usbipdбудет работать вечно, и фактически пометит службу как сбойную, если процесс неожиданно завершится. Вы можете добавить Restart=on-failure, если хотите, чтобы systemd автоматически перезапускал службу в этом случае.

При завершении работы службы команда ExecStopскажет usbipdполностью отвязаться от USB-устройства, и как только это будет успешно выполнено, systemd увидит, что серверный процесс все еще работает, и уничтожит его без каких-либо действий. явная команда.

Всякий раз, когда вы используете After=network-online.target, вы всегда должны также использовать Wants=network-online.target,иначе это может работать не так, как ожидалось. См. Запуск служб после запуска сети в документации по systemd, которая также упоминается на справочной странице, описывающей специальные цели systemd, systemd.special(7).

2
27.01.2020, 23:41

Подход, который я выбрал, заключался в том, чтобы разбить это на две службы: одну для демона и шаблон для привязок.

Итак, для демона -/etc/systemd/system/usbipd.service

[Unit]
Description=usbip host daemon
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
Restart=always
ExecStartPre=/usr/sbin/modprobe usbip-core
ExecStartPre=/usr/sbin/modprobe usbip-host
ExecStart=/usr/sbin/usbipd
ExecStopPost=/usr/sbin/rmmod usbip-host
ExecStopPost=/usr/sbin/rmmod usbip-core

[Install]
WantedBy=multi-user.target

И шаблон для биндов -/etc/systemd/system/usbip -bind@.service

[Unit]
Description=Bind USB device to usbipd
After=network-online.target usbipd.service
Wants=network-online.target usbipd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/usbip bind --busid %i
ExecStop=/usr/sbin/usbip unbind --busid %i

[Install]
WantedBy=multi-user.target

Включите и запустите демон с помощью:

systemctl enable usbipd
systemctl start usbuipd

Затем добавьте привязки с помощью:

systemctl enable usbip-bind@1-1.2.3
systemctl start usbip-bind@1-1.2.3

Замените 1 -1.2.3 идентификатором привязки USB-устройства, которым вы хотите поделиться. Вы можете использовать столько из них, сколько устройств вы хотите использовать совместно, а затем вы можете привязывать и отвязывать каждое из них по отдельности, а затем привязывать при запуске машины (или нет ).

Найдите идентификаторы привязки с помощью:

usbip list -l

Обратите внимание, что срок действия привязки usbip истекает, если она не подключена удаленной машиной в течение примерно 10 минут -не очень полезно!

Я еще не решил, как буду работать с подключением клиента, возможно, не с помощью systemd. Было бы очень полезно, если бы у usbip было немного больше интеллекта...

1
08.03.2021, 00:25

Теги

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