Las opciones de cambio del grupo -funcionan con 4 teclas simbólicas :ISO_First_Group
, ISO_Last_Group
, ISO_Next_Group
y 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_Group
o 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ñogrp:win_menu_switch
:Ganancia izquierda al primer diseño; Derecha Win/Menú al último diseñogrp:lctrl_rctrl_switch
:Ctrl izquierdo al primer diseño; Ctrl derecho al último diseñogrp:lctrl_lwin_rctrl_menu
:Left Ctrl+Left Win al primer diseño; Ctrl derecho+Menú al segundo diseñoEstas 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.
Основываясь на ссылке 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 usbipd
ExecPost=
.
Итак, я бы порекомендовал:
[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)
.
Подход, который я выбрал, заключался в том, чтобы разбить это на две службы: одну для демона и шаблон для привязок.
Итак, для демона -/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 было немного больше интеллекта...